http://blog.csdn.net/jiaomeng/article/details/1496329
1. Bloom Filter
1 哈希的工作就是将很大范围的定义域集合映射到小范围的值域集合。从大到小造成多个定义域就会被映射到同一个值域,这叫做碰撞;
碰撞解决的方法有:链表串联;多次哈希映射。
2 哈希需要将所有的元素都要存储起来,如果只是为了判断元素是否存在的匹配情况下,哈希是有点浪费。因为判断匹配是不需要全部信息的,部分信息就可以完成匹配。因此改进。。。。。。
3 在改进的哈希中,将元素编码,这样不存储元素,而是存储元素的编码。如果元素的编码位越多,则错误就越小,跟传统就越一样;如果编码位越少,则错误就越大。因此,编码位数决定于错误率的要求。其中有“正确率和空间的权衡”。更大的进步。。。。
4 Bloom Filter诞生了,其奇妙的之处在于,一改哈希将一个元素使用一个哈希映射到一个位置(格)(用一个位置来代表一个元素),而是通过多个哈希函数对一个元素哈希映射得到多个位数组的位,将这些位都置1 (用多个位代表一个元素)。
5 如何根据输入元素个数n,确定位数组m的大小及hash函数个数。当hash函数个数k=(ln2)*(m/n)时错误率最小。在错误率不大于E的情况 下,m至少要等于n*lg(1/E)才能表示任意n个元素的集合。但m还应该更大些,因为还要保证bit数组里至少一半为0,则m应该>=nlg(1/E)*lge大概就是nlg(1/E)1.44倍(lg表示以2为底的对数)。
6 Bloom Filter 优点:加密(数据无法恢复);查找匹配时间恒定(由哈希函数的计算时间决定)。缺点:不适合0错误;数据无法恢复;不能删除(因为不处理碰撞,所以产生多个哈希映射到同一位,不能简单将1重置0)(有改进的。。。。。。)
7 Counting Bloom Filter解决了Bloom Filter无法删除的缺点,将之前的位数组的一位改为一个计数器,每次映射加1,每次删除减1
2. Hashing
http://www.nhu.edu.tw/~ycliaw/Teaching/9702/DS2/08_Hashing.pdf
http://donghao.org/2007/10/iidynamic-hashing.html
1. 对于匹配的情况,可以用Bloom Filter,而对于搜索,插入和删除时就需要将数据全部存储。Hashing就可以担当了,通过key和value(attribute)的数据结构封装。以空间换取时间的策略。
2. 静态的Hasing是固定的slot(桶),处理碰撞的策略:
Opening Hashing(链地址法);
Closing Hashing(开地址法) - 线性探测
Hi=(H(key)+di) MOD m
di取值可能为1,2,3,...m-1,称线性探测再散列。
di取值可能为1,-1,2,-2,4,-4 ...k*k,-k*k(k<=m/2)称二次探测再散列。
3. Hash 函数的构造策略:
求余数法:这种方法会带来冲突,所以应有识别和消除冲突的机制
折叠法:把输入分成几部分,相加,取最后4作为哈希值
基数变形法:改变输入数字的基数
数字重组:取输入数字的第3到第6位,颠倒,作为哈希值
3. Bit-Map
http://blog.redfox66.com/post/2010/09/26/mass-data-4-bitmap.aspx
1. 用一个bit位来标记一个元素对应的value;大大节省存储空间;BloomFilter 是对Bit-map的扩展。
2. 可以进行数据的快速查找、判重、删除;使用bit数组来表示某些元素是否存在,比如8位电话号码;
4. Heap - 堆
http://blog.redfox66.com/post/2010/10/02/mass-data-topic-5-heap.aspx
1. 堆是一种特殊的二叉树:完全、每个节点都大于或者小于其子节点(大顶堆,小顶堆)
2. 最大堆求前n小,最小堆求前n大。方法,比如求前n小,我们比较当前元素与最大堆里的最大元素,如果它小于最大元素,则应该替换那个最大元 素。这样最后得到的n个元素就是最小的n个。适合大数据量,求前n小,n的大小比较小的情况,这样可以扫描一遍即可得到所有的前n元素,效率很高。
3. 双堆,一个最大堆与一个最小堆结合,可以用来维护中位数。令数组L的中位数为m,用一个最大堆存储数组L中不大于m的元素,用一个最小堆存储数组L中不小于m的元素,其中这两个堆均不包含中位数m。每次往数组L插入新元素x时,若x<m,则将其插入最大堆(因为最大堆的最大值不大于m),否则插入最小堆(最小堆的最小值不小于m)。若插入新元素后导致m不再是中位数(即两个堆的元素数目相差2个或2个以上),则将当前的中位数m插入到元素数量较少的那个堆中,然后令元素数量较多的那个堆的堆顶元素为新的中位数,并将该堆顶元素从堆中删除。
5. 双层桶划分
1. 双层桶划分是一种“分治”的思想,将大量直接寻址的数据转换为一个个小数据块处理。因为元素的范围很大而无法直接寻址,所以通过多次划分,逐步确定范围,最后在一个可以接受的范围内解决。
2. 求第k大、中位数、不重复和重复的数
6. Inverted Index倒排索引
1. 倒排索引:是一种索引存储在全文搜索下的某个单词在一个文档或一组文档中的位置的映射。是文档检索系统中最常用的数据结构。典型搜索引擎检索算法的重要部分。
2. 分类:
一条记录水平反向索引(反向档案索引),包含每个引用单词的文档的列表
一个单词水平反向索引(完全方向索引),也包含每一个单词在文档的位置
3. 正向索引:文档 ——> 单词; 反向索引:单词 ——> 文档
4. 检索那些文件包含了指定的单词(常见的论文关键字检索)
7. 外排
1. 外:外存;排:排序
2. 原理:外排的归并性质,置换选择败者树原理,最优归并树
3. 适用:大数据的去重,排序
8. trie树(字典树)
1. 定义:树的一种,连接存储的事单词的字母,节点存储的是从根到当前的字符串,根节点为NULL;从根节点到叶子节点的路径是存储一个完整字符串。
2. 原理:相同前缀的单词可以相同存储,相同检索
3. 应用:trie树又称单词查找树,别用来统计、排序和保存大量的字符串,在搜索引擎中的文本词频统计。
4. 优点:利用的不同字符串的相同前缀来解决存储空间,最大限度减少无谓的字符串比较,查询的效率比哈希高。
5. 题目:
9. MapReduce分布式处理
1. 定义:将原本一个任务拆分为若干个子任务交给若干个机器去处理,最后进行结果整合。
2. 原理:分布式处理,并行计算
3. 应用:数据量大,但数据格式可以放入内存的数据处理,
4.