本文简要总结了一下海量数据处理的常见方法和思路。总结的比较粗糙,主要做为知识提纲使用。请各位高手不吝赐教。算法
另外,最近在BAE上学习用 WordPress 搭建了独立博客,欢迎你们有空去转转!本博客文章将同步更新。数组
博客地址:http://panwenhai.duapp.com/app
一、海量数据处理整体思路:分配任务、单独解决、合并结果
- 分配任务:
- 单独解决:
- 统计各个元素出现的次数:Hash Map,N-Bit Map,Trie-Tree,倒排索引
- 找寻最大(小)的N个元素:堆结构,快排思想,局部淘汰法
- 查找给定元素是否存在在其中:Hash Map,1-Bit Map,Bloom Filter,高位比较
- 寻找中位数:桶划分思想
- 搜索引擎,查找关键字:倒排索引
- 合并结果:
二、分而治之+Hash
- 经过Hash取模的方法( Hash(ip)%1024 ),将大量数据分红一个一个的小文件,再进行处理(内排序)。
- Hash取模的方法,使得相同的元素,会被分配到相同的文件中,对于单独文件操做,就能够获得对应元素的结果。
- 处理以后,采用归并的方法,对于小文件的结果进行合并,从而获得最终结果(外排序)。
- 当数据量较大,而又必须进行完全的处理时,能够采用这种思想
三、Hash Map
- 经过一次扫描,能够创建Key与Value对的hash表,来统计某个元素出现的次数。
四、N-Bit Map 位图方法
- 与 Hash Map 类似,只是Key一般为元素值进行直接索引,value值为bit串,用来记录某个元素的状态。
- N的大小控制bit串长度,用来控制状态的总数。(如:N=2时,00表示不存在,01表示出现一次,10表示出现屡次,11无心义)
- Bit Map 自己的长度,表示可记录元素的个数
- 当N = 1,采用元素值做为地址直接索引时,能够表示40亿个不重复的unsigned int值是否存在。
五、Bloom Filter
- 有必定错误几率,但相比于单纯的bit_set节省空间。
- bit_set + k个独立hash函数:将hash函数的结果做为索引值,将对应位置1。查找元素时,若是发现K个hash函数所获得的位置都是1,则认为对应元素存在。
- 输入元素个数n,肯定位数组m的大小及hash函数个数
- m应该>=nlg(1/E)*lge
- k=(ln2)*(m/n)
- Bloom Filter:元素 映射为 位数组
- Counting Bloom Filter:在Bloom filter 中的位扩展为 counter,支持删除操做。
- Spectral Bloom Filter:将元素与出现次数关联。
六、堆结构
- 经过堆的特性,找寻出现最多(少)的前N个元素。
- 须要先统计出各个元素出现的次数(能够用Hash Map),这一步只是找前N个。
- 找最多,用小顶堆,找最大,用大顶堆(先比较堆顶元素,若是不知足要求,则直接轮询下一个,若是符合要求,插入堆中)
- 时间复杂度O(X log Y),X为全部元素的个数,Y为堆中元素的个数
- 扩展:双堆,一个大顶堆和一个小顶堆,能够用来维护中位数。大顶堆存储较小的一半数字,小顶堆存储较大的一半数字。每次插入元素后,适当移动根节点保持两个堆数字相等或相差1.
七、Trie 树
- 前缀树,统计各个单词出线的次数。
- 每一个节点都是一个字母,前缀相同的,就不新建节点了。节点的内容是这个单词出现的次数。
- 时间复杂度: O(n*le)(le表示单词的平准长度)
八、快排思想找前N个元素
- 利用快速排序思想,每次分割时,仅考虑知足要求的一些,当接近N时,采用普通排序算法排序。
九、局部淘汰法找前N个元素
- 从全部数据中,选取前N个元素,排序。而后扫描剩余元素,与排好序的最后一个元素相比,若是比它小(大),则删除最后一个元素,利用插入排序法的思想插入序列中。
- 时间复杂度:O(100w*100)
十、MapReduce思想
- 在用分而治之hash分配任务后,并不一个一个文件进行处理,而是采用分布式的方法,同时处理多个文件,在处理以后,再进行合并。
十一、桶划分
- 本质上是分而治之,重在“分”的技巧
- 划分元素的取值范围,将落在一个范围内的元素分红一组
- 单独处理每一组的元素,最终合并结果
- 如:找中位数,将int划分红2^16个区域,统计在各个区域内的数字个数,就能够判断出在哪一个区域的第几个元素就是中位数。而后对那个区域内的元素排序便可得到
十二、高位比较
- 从不少数中,查找某一个数字是否出现过。
- 由最高位开始比较,0,1二分,以后依次类推。近似于折半查找。O(logn)
1三、倒排索引