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

他有这样一个需求:当用户输入一个站点的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. HTML5 Canvas中9宫格的坑

    近期小鸟情人游戏上了手机qq空间,一个3岁的游戏来了她的第二春.为了能有更好的表现,我们对其进行了一次改版. 改版当中一项就是对原来的弹出框样式进行改进.将大块木板材质改成纯色(边框为圆角金属材质)样 ...

  2. SQL_查找用户的表属于哪个表空间

    ***********************************************声明*************************************************** ...

  3. access数据库:怎么直接从access里把数据里同样的文字替换成空字符&quot;&quot;

    access数据库:怎么直接从access里把数据里同样的文字替换成空字符"" 搜所到文字后,替换的项里写"",就是了.一定要是英文的""

  4. Salt Stack 官方文档翻译 - 一个想做dba的sa - 博客频道 - CSDN.NET

    OSNIT_百度百科 Salt Stack 官方文档翻译 - 一个想做dba的sa - 博客频道 - CSDN.NET Salt Stack 官方文档翻译 分类: 自动运维 2013-04-02 11 ...

  5. asp.net mvc 导出表格

    适合使用的场合: .net 中从前台中的table导出成excel文件,兼容各种浏览器. 使用工具: org.in2bits.MyXls.dll 从前台获取表格的thead和表格的tbody,将其转化 ...

  6. pig对null的处理(实际,对空文本处理为两种取值null或‘’)

    pig对文本null的处理非常特殊.会处理成两种null,还会处理成''这样的空值. 比方,读name,age,sex日志信息.name取值处理,假设记录为".,,"这样,会将na ...

  7. isHiden和isVisible的区别(isVisible更可靠)

    之前一直对isHiden和isVisible的区别比较模糊,都是乱用的.今天因需要仔细看了一下. 1.isHiden只是返回部件的隐藏属性,并不能表示部件当前的真实状态.比如A部件有个子部件B,而A处 ...

  8. "Invalid username/password or database/scan listener not up"

        文档 ID …         11.2 RAC DBconsole Creation Fails With Error: "Invalid username/password or ...

  9. uva 357 Let Me Count The Ways(01背包)

    题目连接:357 - Let Me Count The Ways 题目大意:有5种硬币, 面值分别为1.5.10.25.50,现在给出金额,问可以用多少种方式组成该面值. 解题思路:和uva674是一 ...

  10. R语言与数据分析之六:时间序列简介

    今年在某服装企业蹲点了4个多月,之间非常长一段时间在探索其现货和期货预測.时间序列也是做销售预測的首选,今天和小伙伴分享下时间序列的基本性质和怎样用R来挖据时间序列的相关属性. 首先读入一个时间序列: ...