海量数据的操作

  • 巧妙的算法搭配合适的数据结构:Bloom filter/Hash/bit-map/堆/数据库或倒排索引/trie树,针对空间,无非就一个办法:大而化小,分而治之(hash映射)。
  • hash映射 + hash统计 + 堆/快速/归并排序;
    双层桶划分
    Bloom filter/Bitmap;
    Trie树/数据库/倒排索引;
    外排序;
    分布式处理之Hadoop/Mapreduce。

待续。。。

海量数据查找某个数
  • 给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
    • BitMap:一个bit位代表一个unsigned int值。申请512 MB内存(2^32 bit = 40亿多 = 512 MB),读入40亿个数,设置相应的bit位,读入要查询的数,查看相应bit位是否为1,为1表示存在,为0表示不存在。
    • 把40亿个数中的每一个用32位的二进制来表示,这40亿个数分成两类:
      1.最高位为0
      2.最高位为1
      并将这两类分别写入到两个文件中,其中一个文件中数的个数<=20亿,而另一个>=20亿(相当于折半);
      与要查找的数的最高位比较并接着进入相应的文件再查找,再把这个文件按次高位又分成两类:
      1.次最高位为0
      2.次最高位为1
      并将这两类分别写入到两个文件中,其中一个文件中数的个数<=10亿,而另一个>=10亿
      以此类推,就可以找到了,时间复杂度为O(logn)。
海量数据查找中位数
  • 采用基于二进制位比较和快速排序算法中的“分割思想”来寻找中位数。

    数字排序之后,位于中间的那个数。

  1. 同样用二进制数表示数字,将最高位为0的和最高位为1的数字放到两个文件中,假设10亿个数字保存在一个大文件中,依次读一部分文件到内存(不超过内存的限制:1GB),将每个数字用二进制表示,比较二进制的最高位(第32位),如果数字的最高位为0,则将这个数字写入 file_0文件中;如果最高位为 1,则将该数字写入file_1文件中。(这里的最高位类似于快速排序中的枢轴元素)

  2. 从而将10亿个数字分成了两个文件(几乎是二分的),假设 file_0文件中有 6亿 个数字,file_1文件中有 4亿 个数字。那么中位数就在 file_0 文件中,并且是 file_0 文件中所有数字排序之后的第 1亿 个数字。

    最高位为符号位,file_1中的数都是负数,file_0中的数都是正数,也即这里一共只有4亿个负数,排序之后的第5亿个数一定是正数,那么排序之后的第5亿个数一定位于file_0中。
    除去4亿个负数,中位数就是6亿个正数从小到大排序之后 的第 1 亿个数。

  3. 现在,只需要处理 file_0 文件了。同样采取上面的措施处理:将file_0文件依次读一部分到内存(不超内存限制:1GB),将每个数字用二进制表示,比较二进制的 次高位(第31位),如果数字的次高位为0,写入file_0_0文件中;如果次高位为1,写入file_0_1文件 中。

  4. 假设 file_0_0文件中有3亿个数字,file_0_1中也有3亿个数字,则中位数就是:file_0_0文件中的数字从小到大排序之后的第1亿个数字。

  5. 抛弃file_0_1文件,继续对 file_0_0文件 根据 次次高位(第30位) 划分,假设此次划分的两个文件为:file_0_0_0中有0.5亿个数字,file_0_0_1中有2.5亿个数字,那么中位数就是 file_0_0_1文件中的所有数字排序之后的 第 0.5亿 个数。

  6. 按照上述思路,直到划分的文件可直接加载进内存时,就可以直接对数字进行快速排序,找出中位数了。当然,也可以使用“快排的分割算法”来找出中位数(比使用快速排序要快)。

  • 总结:上面的海量数据寻找中位数,其实就是利用了“分割”思想,每次将 问题空间 大约分解成原问题空间的一半左右。(划分成两个文件,直接丢弃其中一个文件),故总的复杂度可视为O(logN) N=10亿。

【参考文档】
海量数据处理面试题总结
海量数据查找中位数

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值