top k 超大文件类以及位图方法、字典树

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];
 }
 ~BitMap()
 {
  delete []p;
  p = NULL;
 }
 int getBitVal(int val)const
 {
  int index = val / 8;
  int bit = val % 8;
  if (p[index] & (1<   {
   return 1;
  }
  return 0;
 }
 void setBitVal(int val)
 {
  int index = val / 8;
  int bit = val % 8;
  
  p[index] |= (1 << bit);
 }
private:  
 char *p;
};


位图的缺点显而易见,只能存储数据的一项状态,对此,有对位图的改进方法:布隆过滤器
布隆过滤器


字典树:
top <wbr>k <wbr>超大文件类以及位图方法、字典树







你可能感兴趣的:(top k 超大文件类以及位图方法、字典树)