本人摘自( http://blog.sina.com.cn/s/blog_98c3175b0100vocw.html
)
1.bloom filter
用处:建立查询表,可以快速查询
时间复杂度:常数
空间复杂度:每一个数据占据一位
建立方法:建立一个位数组(bool dataSet[])初始化为false,对每一个插入的数据使用k个哈希函数,对应的k个(或者小于k个)数组位置设置为true.
查询方法:对每一个查询的数据,使用那k个哈希函数,看着k个(或者小于k个)数组位置上是否都为true,如果是则存在;否则不存在.
特点:不支持删除操作,有可能误判.
哈希函数个数:当k越大,对于一个数据的描述越精确,但是dataSet中剩余的空地就越少,所以k值有一个理论值使得误判最少.k=[lg2/(输入元素数/dataSet大小)].
dataSet大小:虽然有多少数据就应该有多少位,但是使用了哈希函数,就应该有增加空余空间的觉悟...在错误率不大于E的情况下,m至少要等于n*lg(1/E)才能表示任意n个元素的集合。但m还应该更大些,因为还要保证bit数组里至少一半为 0,则m应该>=nlg(1/E)*lge 大概就是nlg(1/E)1.44倍(lg表示以2为底的对数)。
实例:google在排除垃圾邮件的时候使用了这个技术,具体请见:http://www.google.com.hk/ggblog/googlechinablog/2007/07/bloom-filter_7469.html这个例子中也介绍了如何弥补误判的情况(白名单)
改进:在必须要支持删除操作的情况下可以将bool改成int或者其他数据类型,这种改进了的方法被称为counting bloom filter.
想法:这个方法有点类似于盲人摸象的处理方式,摸象的人多了,准确判断出这个是"一头大象"的概率也就多了,不过我不明白的是为什么不多设置一些数组,每一个哈希函数对应一个bool数组,这样准确性岂不更高?这个想法日后若有幸看得bloom filter原文论文,应该推导一下.现在的估计是,这个方法的特点是"占地方小",若每一个哈希函数一个bool数组,可能有些以己之长,补己之短了,即准确度的提高不甚明显吧.
2.哈希 bit-map 堆 外排序
实例:这几个是一些基本的方法了,一般使用的也多,单描述下问题吧.1)海量日志数据,提取出某日访问百度次数最多的那个IP。2)电话号码排序.3)查询大数据量中前1%的数据(小堆占用空间较小),内存很小时候的排序等等
3.数据库
实例:大量增删改查....
4.反索引
方法:参考维基百科,主要使用在文档检索上面.wiki(http://zh.wikipedia.org/wiki/倒排索引)比如中文网页检索,每一个关键字对应一个数组,里面保存着含有这个关键字的网页,这样在搜索关键字的时候,就可以不搜索全部数据库中的网页,只列出那些有索引中存在的网页即可.
5.分布式 MAPREDUCE
只是一个想法,没有实例,没涉及过.但是稍微想一下,一个大问题N分到k个机器上去做(N/k),最后再对结果进行合并(m),速度应该会快不少(N->N/k+m).
6.单词查找树
方法:建立这样一棵树,每一个节点都包含一个字母.在做字符串匹配的时候随树而下就可以,这样木有回溯.
实例:给出N 个单词组成的熟词表,以及一篇全用小写英文书写的文章,请你按最早出现的顺序写出所有不在熟词表中的生词。