海量数据处理问题学习笔记


        海量数据处理问题的常见场景有两种:(1)给定一定大小的数据(文件),数据(文件)大小大于内存容量,无法全部同时转载进内存中,然后需要对其进行处理,比如找重复项,或者找TOP k项;(2)给出非常大的待处理数据,比如100万个数找前100大的数,然后需要对其进行高效的处理(不可直接排序然后提取,因为这要太慢了)。总的来说,海量数据处理问题主要需要处理的两个方面的问题,一是内存不够,二是时间不够。内存不够,则要遵循“分而治之”的思想去寻找解决方案,把待处理数据化大为小,然后装进内存里面处理。时间不够,则需要合理的利用数据结构,设计合适的算法解决问题。

———————————————————————————————————————————————————

方法&工具

处理这样子的问题,主要的工具有:

1Hash

       Hash被译为哈希,或者散列。Hash Function在维基百科上的定义是:A hash function is any algorithm that maps data of variable length to data of a fixed length.

       Hash Table(散列表)是Hash的一个重要应用。散列表通过把关键码值(key value)映射到表中的一个位置来访问记录,以加快查找的速度。Hash是一种映射关系,给定一个数据,它的关键字是key,那么Hash函数Hashkey)的值就是这个数据的储存地址。

       在海量数据处理的问题中,Hash主要有3种作用,一是用来分离数据,用合适的hash函数将待处理数据分离到不同的地方(例如文件)。二是用来统计,用hash mapkey储存单个数据对象,value储存其出现的次数。三是快速存取,Hash函数在O1)的时间内就可以找到目标数据。

       一般的hash函数的设计方法有:1. 直接寻址法 2. 取模法 3. 除留余数法 4. 折叠法 5. 平方取中法 etc...

       Hash函数处理后冲突无法避免,处理冲突的方法主要有:1. 开放地址法 2. 链地址法 3. 再散列法 4. 公共溢出区法 etc...

       Referencehttp://blog.csdn.net/v_JULY_v/article/details/6256463 

2)位图(bit-map

       位图的基本原理是用位数组来表示数据是否存在,众所周知,bit是描述计算机数据量最小的单位,位图法的思想就是“化大为小,用小的表示大的”。

       位图法可以用来快速查找,判重,排序。

       快速查找:判断集合中某个数是否存在。

       判重:判断一个集合中是否有重复数字,如果集合中最大的数是M,开一个大小为M+1 的位数组,初始化为0。遍历集合,值为K的元素对应数组的K+1的位置,将其设为1,如果原本已经为1,说明这个是重复的数。算法的复杂度为On),在线性时间内完成。

       排序:给一个集合排序,如果集合中最大的数是M,生成一个大小为的字符串,全部设为0,然后遍历集合,将其中的数在字符串的对应字符设为1,完成排序,复杂度为On)。

3Bloom Filter

       Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组表示一个集合,并利用K个互相独立的hash函数来判断一个元素是否属于这个集合。当一个数据X到达时,算法会分别利用这Khash函数对元素进行映射,如果对应位置为0,设为1,如果为1,不做改变。

       大家仔细想可以想到,算法有可能会出错,假设数据集中已经有一些数据,位数组中,12345710等位置都已经设为1,加入这时判断一个不在集合中的数据,刚好用Khash函数对它做映射得到的位置都已经被设为一,这样子这个元素就会被误以为是存在这个集合中,其实不然。

       Bloom Filter牺牲了一定的正确率换取了效率。Bloom Filter的方法省去了大量的与现有数据的比较,但是牺牲了一定的正确性。

       Referencehttp://blog.csdn.net/jiaomeng/article/details/1495500 

4Trie

       Trie树又称作字典树或者键树,被用作字符串处理的多叉树结构。Trie树常常是26叉数的结构,可以高效实现字符串的插入,删除、检索。

       Trie树的基本结构:1. root不包含字符,除了root外每个节点包含一个字符。 2. 从根节点到某个节点,路径上经过的节点组组成该节点对应的字符串。 3. 每个节点的所有子节点包含的字符串都不同。

稍微改变trie树的节点结构,可以用trie树来进行对字符串的统计。搜索引擎常常用trie数统计文本词频。

       Referencehttp://www.cnblogs.com/cherish_yimi/archive/2009/10/12/1581666.html 

        http://blog.csdn.net/hguisu/article/details/8131559 

5)双层桶划分

       双层桶划分是一种思想方法,类似于分治思想,面对大量数据时,将数据分为一个个小的子集,将待处理数据划分到一个可接受的范围内,然后应用其他方法对这些子集进行处理。

       Referencehttp://diducoder.com/mass-data-topic-6-multi-dividing.html 

6)堆

       堆是一种完全二叉树。堆总是满足以下两个性质:1. 父节点的大小总是大(等)于或小(等)于其所有子节点的值;2. 树总是完全的。利用堆的性质,我们可以利用堆来对数据进行排序或者寻找Top K 元素。堆排序的复杂度是Onlogn)。

       Referencehttp://zh.wikipedia.org/zh-cn/%E5%A0%86%E7%A9%8D%E6%8E%92%E5%BA%8F 

7)外排序

       外排序是相对内排序而言的,由于数据量太大,不能在内存中完成排序,所以就有了外排序。外排序主要应用在内存不足的情况下处理大数据的排序中。

       Reference:http://zh.wikipedia.org/zh/%E5%A4%96%E6%8E%92%E5%BA%8F 

8MapReduce

       MapReduce用于大规模数据集的并行运算。其中,Map函数独立地将数据分割成不相关的子集,然后分配给大量计算机进行处理,最后通过Reduce函数来汇总结果。


除了以上这8种方法外还有倒排索引、数据库等方法。

———————————————————————————————————————————————————

问题分类和思路解析

下面将海量数据处理的场景问题进行分类,然后用相应的思路去寻找解决问题的方案。

问题分类:

1. 判重、交集问题

       E.g 1000W个数中找出(不)重复的数

       思路:考虑bitmap

       解法:               

       Step1  判断用bitmap表示待处理数据能否装进内存。If yes, bitmap解决。If nogo to step2

       Step2  可以用Hash的方法将待处理数据分为N部分,使得一个部分可以装进内存,对每一部分应用bitmap法求解

       另外,如果不需要100%的准确率,可以选用Bloom filter

2. Top K问题

       思路:用分而治之/Hash映射的方法将待处理数据规模缩小,然后用Hash统计/trie树等方法对其进行统计,最后用归并排序等方法得出最后结果。

       解法:

       Step1 判断是否需要将数据规模减小。If yesgo to step2If no,直接用快排/局部淘汰法//分治(快排的思想)/Hash统计/trie树处理得出结果

       Step2 利用hash映射的方法缩小数据规模,用用快排/局部淘汰法//分治(快排的思想)/Hashmap统计/trie/等方法处理各部分数据

       Step3 归并排序,统计得出结果

       在处理这类型问题的时候,要考虑待处理数据的重复率,是否要求100%准确,多线程,多机器等条件,结合应用情景设计合适的解决方案。

3. 排序问题

       思路:如果能装进内存就用快排,不可以的话用分治法最后外排序。

       解法:

       Step1  判断待处理数据能否装进内存。If yes, 用快排解决。If nogo to step2

       Step2  可以用Hash的方法将待处理数据分为N部分,使得一个部分可以装进内存,对每一部分排序,最后用归并排序等方法得出结果。

       4. 其他

       E.g 找中位数

       思路:缩小处理范围。化大为小,分而治之。

       总结

       在海量数据处理的问题当中,要坚持两项基本原则:1. 分而治之(Hash) 2. 以空间换时间(位图)或以时间换空间(外排序)。同时利用合适的数据结构(堆、trie树),大部分问题便可迎刃而解。

———————————————————————————————————————————————————


这是一份个人的学习笔记,其中或许有许多说得不清楚或者不对的地方,欢迎大家指出。互相学习,共同进步。

scut_zb

Reference

试题锦集:

http://blog.csdn.net/v_july_v/article/details/6685962 

十大方法总结:

http://blog.csdn.net/v_july_v/article/details/6279498 

http://blog.csdn.net/hguisu/article/details/7856239

你可能感兴趣的:(海量数据处理问题学习笔记)