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

他有这样一个需求:当用户输入一个站点的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. Linux改动文件权限记录

    1.从文件类型上分可分为三种, 用ls-l查询,以"一"开头的是文件,以字母"d"开头的是文件夹(俗称文件夹),以字母"l"开头的是连接. ...

  2. 安装ipvsadm报错

    server环境: [vagrant@localhost download]$ uname -a Linux RS1 2.6.18-238.el5 #1 SMP Thu Jan 13 15:51:15 ...

  3. cocos2d-x游戏开发系列教程-编译运行我们的第一个cocos2d-x游戏程序

    环境准备和介绍: 操作系统:64位Windows 7 sp1(Microsoft Windows [版本 6.1.7601]) 必要的软件和源码: visual_studio_ultimate_201 ...

  4. 使用RNSwipeViewController类库进行视图切换

    如今很多应用已经不再局限于点击按钮触发事件来进行视图之间切换,为迎合给予用户更好体验,体现iOS系统极佳用户体验,使用手势来进行各个视图之间切换,用户至于一个大拇指在屏幕中央就可浏览到很多信息: 关于 ...

  5. Attach()函数和Detach()函数的作用

    基本就是把一个句柄绑定和解绑定于一个类对象上,是其可以使用MFC的函数而不是API 首先,你要明白Windows对象和MFC对象的区别.MFC对象实际上并没有把整个Windows对象都包装在其中,它只 ...

  6. Cocos2d-x3.3RC0的Android编译Activity启动流程分析

    本文将从引擎源代码Jni分析Cocos2d-x3.3RC0的Android Activity的启动流程,以下是具体分析. 1.引擎源代码Jni.部分Java层和C++层代码分析 watermark/2 ...

  7. android自定义实现抽屉SlidingDrawer的功能

    最近项目中需要实现上拉功能,首先想到的就是Android本身自带的抽屉SlidingDrawer,最后也实现了不过,出现的问题就是设置背景色问题,handler和content是两个不同的部分,这就造 ...

  8. Delphi调用C++导出的QT类

    打开VS2008创建一个dll项目(创建了一个QT Library项目),新建头文件q4dapplication.h定义纯虚类: #ifndef Q4DAPPLICATION#define Q4DAP ...

  9. (四)SAX方式解析XML数据

    SAX方式解析XML数据 ​文章来源:http://www.cnblogs.com/smyhvae/p/4044170.html 一.XML和Json数据的引入: 通常情况下,每个需要访问网络的应用程 ...

  10. 取CPU序列号,获取网卡,取硬盘系列号,获取目录下的文件,强制删除目录

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...