10G的大文件:
1.将10G的大文件每个数字哈希一遍,存放在500个小文件中
数字 % 小文件数字(500个小文件) = 小文件序号 然后将数字写入对应的文件
2.将第一个文件的 取top k个数据建立一个小/大根堆
3.其他文件分别不需要建立堆,只需要和大/小根堆建立对比,进行push或者top
4最终得到top k
bitmap:
就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。
通常是用来判断某个数据存不存在的。
比如 int arr[4]={0}; 定义一个整型数据,一共16个字节 一共有16*8个位,就一共可以存放16*8个数字。
所以,到底需要开辟多少个位的数组,需要海量数据中的最大值来确定。
假定数据val:
val在数组中的下标:val / 8
val在下标中的那个位:val % 8
class BitMap
{
public:
BitMap(int val)
{
int size = val / 8 + 1;
p = new char[size];
{
public:
BitMap(int val)
{
int size = val / 8 + 1;
p = new char[size];
}
~BitMap()
{
delete []p;
p = NULL;
}
int getBitVal(int val)const
{
int index = val / 8;
int bit = val % 8;
if (p[index] & (1<<bit))
{
return 1;
}
return 0;
}
void setBitVal(int val)
{
int index = val / 8;
int bit = val % 8;
p[index] |= (1 << bit);
}
~BitMap()
{
delete []p;
p = NULL;
}
int getBitVal(int val)const
{
int index = val / 8;
int bit = val % 8;
if (p[index] & (1<<bit))
{
return 1;
}
return 0;
}
void setBitVal(int val)
{
int index = val / 8;
int bit = val % 8;
p[index] |= (1 << bit);
}
private:
char *p;
};
char *p;
};
位图的缺点显而易见,只能存储数据的一项状态,对此,有对位图的改进方法:布隆过滤器
字典树: