top k 超大文件类以及位图方法、字典树_一个博客id_新浪博客

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<<bit))
  {
   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>超大文件类以及位图方法、字典树







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值