我有一个做了一款移动浏览器的朋友。

他有这样一个需求:当用户输入一个站点的url时候。移动浏览器须要识别这个网址是否是一个恶意网址。另外。他有一个恶意网址库。

或许这种解决方法有多种。

当中一种就是把恶意网址库放在本地,移动浏览器拿到一个网址的时候就把它与网址库中的每一个地址匹配一下。依据匹配与否来推断网址的是否为一个恶意地址。

哦,我忘了补充的情况就是这个网址库中有150万条数据,压缩后23M。假设一个浏览器为了识别恶意网址这么一个功能而附加这么大的库,你会没实用户的。

我刚開始给出的解决方法是bloom filter(bloom过滤器)。

关于它的具体机理。吴军先生的《数学之美》中当有提及,我这里仅仅给出一些參数值:数组大小是1500000 * 20 / 8 B(即bitset大小是数据项的20倍)。hash function数目为13,误差率为万分之中的一个。我用C++和Java分别实现了这个算法。測试后效果令人惬意。数组大小仅仅有4M多,再用zip压缩后大小仅仅有2.8M。4G时代移动浏览器附带一个3M大小的库,个人以为是能够让人接受的。

事情到此为止本该就此结束。朋友又有一个需求:当用户输入一个网址的前面一部分数据库的时候。浏览器要给出相关的最多十个相关网址。

这个网址库当然就更大了。并且又要不断地更新,意味着不能放在本地。

可是,每一个人浏览的站点一般不会超过一百个吧,刚開始这个库能够为零,随着用户使用次数增多,统计一下缓存在本地就okay啦。这个不须要去server拉一大堆网址库下来。

再说,真要是匹配不到也无所谓啦。

我想到的算法是trie树。自己实现一个trie树当然是非常蠢笨的事情,我去网上搜罗了一番,在stackoverflow上得到一个提示:dawgdic。

它也自称是最棒的trie树,查找速度最快。并且声称的字典库相对来说比二维数组实现的trie树还要节省空间。我在code.google.com上下载完代码后(最新代码是dawgdic-0.4.5.tar.gz,2011年),把它的example看了一遍,有例如以下功能:

1 依据排列有序的数据,它能够构建出一个很节省空间的dawg dictionary。

2 它的dawg词典库的每一项能够仅仅有一个key,也能够附带插入其value。即每一个数据项是一个key-value对。

3 依据构建好的词典它能够进行kv查询,即给出一个key。返回其value;

4 假设仅仅能给出key的一段前缀。它能够返回全部共同前缀的key,这些结果能够依照字母顺序排列后返回也能够依照value的大小排序后返回;

5 假设仅仅能给出key的一段后缀,它能够返回全部共同后缀的key,这些结果能够依照字母顺序排列后返回也能够依照value的大小排序后返回。

依据以上特性。上面那个需求就稀里哗啦地攻克了(^_^)。我们须要利用的特性是1、2和4。dawg字典的key当然是网址的url,其权值当然是浏览次数。因为dawg词典构建好了以后,不能进行modify,而用户对每一个网址每一段时间内的浏览次数是变化的,这就须要没过一段时间内对这个dawg dictionary进行又一次构建。

事实上上面仅仅是简单地分别列举了两个算法的各自应用场景,事实上这两个算法的应用范围很广。如bloom filter就不说了,dawg树就能够用在搜索中的热搜索提示、一些英汉词典的词语搜索和输入法的个性化提示等。

晚上吃完饭,写出此记,对自己近期一段时间的业余研究做一番总结,接着加班。

附带声明:不经本人同意,诸如推酷“www.tuicool.com”这样的垃圾抄袭站点不得转载本人的blog。

版权声明:本文博客原创文章。博客,未经同意,不得转载。

bloom filter与dawgdic(一种trie树)的更多相关文章

  1. 双数组Trie树 (Double-array Trie) 及其应用

    双数组Trie树(Double-array Trie, DAT)是由三个日本人提出的一种Trie树的高效实现 [1],兼顾了查询效率与空间存储.Ansj便是用DAT(虽然作者宣称是三数组Trie树,但 ...

  2. Java Bloom filter几种实现比较

    英文原始出处: Bloom filter for Scala, the fastest for JVM 本文介绍的是用Scala实现的Bloom filter. 源代码在github上.依照性能测试结 ...

  3. 布隆过滤器(Bloom Filter)的原理和实现

    什么情况下需要布隆过滤器? 先来看几个比较常见的例子 字处理软件中,需要检查一个英语单词是否拼写正确 在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上 在网络爬虫里,一个网址是否被访问过 yahoo, ...

  4. Bloom Filter布隆过滤器原理和实现(1)

    引子 <数学之美>介绍布隆过滤器非常经典: 在日常生活中,包括设计计算机软件时,经常要判断一个元素是否在一个集合中.比如: 在字处理软件中,需要检查一个英语单词是否拼写正确(也就是要判断它 ...

  5. bloom filter

    Bloom filter 是由 Howard Bloom 在 1970 年提出的二进制向量数据结构,它具有很好的空间和时间效率,被用来检测一个元素是不是集合中的一个成员. 结    构 二进制 召回率 ...

  6. 布隆过滤器(Bloom Filter)详解——基于多hash的概率查找思想

    转自:http://www.cnblogs.com/haippy/archive/2012/07/13/2590351.html   布隆过滤器[1](Bloom Filter)是由布隆(Burton ...

  7. 1.Bloom filter

    Bloom filter 是由 Howard Bloom 在 1970 年提出的二进制向量数据结构,它具有很好的空间和时间效率,被用来检测一个元素是不是集合中的一个成员,这种检测只会对在集合内的数据错 ...

  8. [转载] 布隆过滤器(Bloom Filter)详解

    转载自http://www.cnblogs.com/haippy/archive/2012/07/13/2590351.html   布隆过滤器[1](Bloom Filter)是由布隆(Burton ...

  9. 布隆过滤器(Bloom Filter)详解

    直观的说,bloom算法类似一个hash set,用来判断某个元素(key)是否在某个集合中.和一般的hash set不同的是,这个算法无需存储key的值,对于每个key,只需要k个比特位,每个存储一 ...

随机推荐

  1. 设计模式六大原则(2):里氏替换原则(Liskov Substitution Principle)

    肯定有不少人跟我刚看到这项原则的时候一样,对这个原则的名字充满疑惑.事实上原因就是这项原则最早是在1988年,由麻省理工学院的一位姓里的女士(Barbara Liskov)提出来的. 定义1:假设对每 ...

  2. Swift - 使用Core Data进行数据持久化存储

    一,Core Data介绍 1,Core Data是iOS5之后才出现的一个数据持久化存储框架,它提供了对象-关系映射(ORM)的功能,即能够将对象转化成数据,也能够将保存在数据库中的数据还原成对象. ...

  3. JS - 全屏滚动

    下载地址:http://www.lanrentuku.com/js/quanping-1141.html

  4. DELPHI 通過窗口句柄或窗口标题得到进程句柄

    DELPHI 通過窗口句柄或窗口标题得到进程句柄2009年05月08日 星期五 10:15procedure TForm1.Button1Click(Sender: TObject);varhWind ...

  5. spring mvc ModelAndView向前台传值

    今天在做项目的时候遇到一个问题,把第一个页面保存的id传到第三个页面中去用,原来是在controller层加了一个全局变量控制的,但是后来发现这个变量实现不了我要的功能,于是查了一下,原来ModelA ...

  6. jstorm简介(转)

    Jstorm是参考storm的实时流式计算框架,在网络IO.线程模型.资源调度.可用性及稳定性上做了持续改进,已被越来越多企业使用 作为commiter和user,我还是非常看好它的应用前景,下面是在 ...

  7. NumberFormat 类

    NumberFormat 表示数字的格式化类, 即:能够依照本地的风格习惯进行数字的显示. 此类的定义例如以下: public abstract class NumberFormat extends ...

  8. Lucene.Net 2.3.1开发介绍 —— 三、索引(五)

    原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(五) 话接上篇,继续来说权重对排序的影响.从上面的4个测试,只能说是有个直观的理解了.“哦,是!调整权重是能影响排序了,但是好像没办法来 ...

  9. 与众不同 windows phone (4) - Launcher(启动器)

    原文:与众不同 windows phone (4) - Launcher(启动器) [索引页][源码下载] 与众不同 windows phone (4) - Launcher(启动器) 作者:weba ...

  10. Tair是一个高性能,分布式,可扩展,高可靠的key/value结构存储系统(转)

    Tair是一个高性能,分布式,可扩展,高可靠的key/value结构存储系统! Tair专为小文件优化,并提供简单易用的接口(类似Map)Tair支持Java和C版本的客户端 Tair is a di ...