bit-map再显身手:test.txt中有42亿个无符号整数, 求不存在于test.txt中的最小无符号整数。限制: 可用内存为600MB.
来源:互联网 发布:战争动员令 知乎 编辑:程序博客网 时间:2024/05/02 06:44
先看看这个题目:test.txt中有42亿个无符号整数, 求不存在于test.txt中的最小无符号整数. 限制: 可用内存为600MB.
又是大数据。 看到42亿, 有灵感没? 要知道, 2的32次方就是42亿多一点点啊。42亿个无符号整数存在于文件中, 我们可以考虑在内存中用bit-map与之建立二值状态映射。 2的32次方个无符号整数, 需要内存空间为512M, 这个是很容易计算的。
这么大的空间, 要用栈数组肯定不行, 可考虑用堆。 还是我们之前介绍过的bit-map, 用不着多说(别说我不描述思路啊, 代码就体现了思路), 直接给出代码:
#include <iostream>#include <fstream>using namespace std;#define BIT_INT 32 // 1个unsigned int可以标志32个坑#define SHIFT 5#define MASK 0x1f#define N 4294967296 // 2的32次方unsigned int *a = NULL;// 必须用堆void createArr(){a = new unsigned int[1 + N / BIT_INT];}void deleteArr(){delete []a;a = NULL;}// 将所有位都初始化为0状态void setAllZero(){memset(a, 0, (1 + N / BIT_INT) * sizeof(unsigned int));}// 设置第i位为1void setOne(unsigned int i){a[i >> SHIFT] |= (1 << (i & MASK));}// 设置第i位为1void setZero(unsigned int i){a[i >> SHIFT] &= ~(1 << (i & MASK));}// 检查第i位的值int getState(unsigned int i){return (a[i >> SHIFT] & (1 << (i & MASK))) && 1;}void setStateFromFile(){ifstream cin("test.txt"); // 我测试的时候, 文件中的数据为:7 8 9 2 5 2 6 0 1 4 unsigned int n; while(cin >> n) { setOne(n); } }void printResult(){unsigned int i = 0;for(i = 0; i < N; i++){if(0 == getState(i)){cout << i << endl; // 3break;}}}int main() {createArr();setAllZero();setStateFromFile();printResult();deleteArr();return 0;}结果与预期相符。 我们在测试的时候, 用的数据较小, 有兴趣的朋友可以把数据量加大, 进行测试。
OK, 无非又是利用bit-map来节省空间而已, 其实很简单。 本文先介绍到这里了。
0 0
- bit-map再显身手:test.txt中有42亿个无符号整数, 求不存在于test.txt中的最小无符号整数。限制: 可用内存为600MB.
- bit-map再显身手:test.txt中有42亿个无符号整数, 求文件中有多少不重复的数(重复的数算一个)。限制: 可用内存为600MB.
- 2路bit-map的应用:test.txt中有42亿个无符号整数,从小到大打印其中只出现过一次的数 。限制: 可用内存为1.5GB.
- bitmap再出江湖:a.txt中有40亿个无符号整数, b.txt中有10000个无符号整数, 求交集。 可用内存:1G
- bitmap再出江湖:a.txt中有40亿个无符号整数, b.txt中有10000个无符号整数, 求交集。 可用内存:1G
- 有符号整数与无符号整数
- 有符号与无符号整数
- 有符号整数、无符号整数的转换以及小数据转换为大数据
- 有符号长整数 转 无符号长整数
- 整数溢出——无符号和有符号整数
- 有符号整数与无符号整数相加问题
- 有符号整数除以无符号整数会发生什么??!!!
- 快速求一个32位无符号整数二进制中为1的个数
- 快速求一个32位无符号整数二进制中为1的个数
- 求32位无符号整数中比特为1的二进制位数
- 无符号整数--问题
- 无符号整数
- 无符号整数
- java4Android(14)I/O流 、分类、目的、字节流重要类及方法FileInputStream
- rhel源更换为centos源
- bzoj2243: [SDOI2011]染色
- 初识JAVA
- Oracle数据库之PL/SQL触发器
- bit-map再显身手:test.txt中有42亿个无符号整数, 求不存在于test.txt中的最小无符号整数。限制: 可用内存为600MB.
- C实现 LeetCode->Partition List(双指针大法)(单链表)
- 用eclipse 将maven项目打war包部署到tomcat
- 揭开正则表达式的神秘面纱
- 第17章 输入输出和文件
- 字符集和字符集编码杂谈系列之我见
- Uva - 1610 - Party Games
- OJ第二批——Problem A:C++类实现最大数的输出
- Eclipse或MyEclipse还原默认窗口