- 浏览: 580020 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (253)
- java (84)
- python (22)
- 设计模式 (12)
- 数据结构和算法 (7)
- ibatis (1)
- 数据挖掘 (2)
- 集体智慧读书笔记 (1)
- ubuntu (4)
- lucene (11)
- 算法 第4版 (11)
- apache mina (16)
- memcached (1)
- android (9)
- netty (6)
- mongodb (2)
- maven (2)
- openfire (2)
- 服务端 (21)
- 产品 (0)
- apache (1)
- 选择 (2)
- 构架WEB高性能站点 (7)
- redis (8)
- 诗词歌赋 (3)
- 源代码阅读 (5)
- 前端 (1)
- javascript (3)
- guice (1)
- 分布式 (5)
- 总结-2014 (4)
- jvm (1)
最新评论
-
liu_jiaqiang:
写的挺好
maven多项目管理 -
H972900846:
我想知道哪里整的,如果是自己写的,那有点牛呀如果是抄的请说明出 ...
SSL身份认证原理 -
春天好:
博主写的很好,赞一个,多谢分享 *(^-^*)分享一个免费好用 ...
定向网站爬虫---初级例子 -
fenglingabc:
经过测试,parameterType="java.u ...
mybatis获取主键和存储过程返回值 -
jyghqpkl:
[u][/u] ...
Cookie的secure 属性
日常生活中,包括在设计计算机软件时,我们经常要判断一个元素是否在一个集合中。比如在字处理软件中,需要检查一个英语单词是否拼写正确(也就是要判断它是否在已知的字典中);在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上;在网络爬虫里,一个网址是否被访问过等等。最直接的方法就是将集合中全部的元素存在计算机中,遇到一个新元素时,将它和集合中的元素直接比较即可。 |
今天,我们介绍一种称作布隆过滤器的数学工具,它只需要哈希表 1/8 到 1/4 的大小就能解决同样的问题。
布隆过滤器是由巴顿.布隆于一九七零年提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。我们通过上面的例子来说明起工作原理。
假定我们存储一亿个电子邮件地址,我们先建立一个十六亿二进制(比特),即两亿字节的向量,然后将这十六亿个二进制位全部设置为零。对于每一个电子邮件地址 X,我们用八个不同的随机数产生器(F1,F2, ...,F8) 产生八个信息指纹(f1, f2, ..., f8)。再用一个随机数产生器 G 把这八个信息指纹映射到 1 到十六亿中的八个自然数 g1, g2, ...,g8。现在我们把这八个位置的二进制位全部设置为一。当我们对这一亿个 email 地址都进行这样的处理后。一个针对这些 email 地址的布隆过滤器就建成了。(见下图)
现在,让我们看看如何用布隆过滤器来检测一个可疑的电子邮件地址 Y 是否在黑名单中。我们用相同的八个随机数产生器(F1, F2, ..., F8)对这个地址产生八个信息指纹 s1,s2,...,s8,然后将这八个指纹对应到布隆过滤器的八个二进制位,分别是 t1,t2,...,t8。如果 Y 在黑名单中,显然,t1,t2,..,t8 对应的八个二进制一定是一。这样在遇到任何在黑名单中的电子邮件地址,我们都能准确地发现。
布隆过滤器决不会漏掉任何一个在黑名单中的可疑地址。但是,它有一条不足之处。也就是它有极小的可能将一个不在黑名单中的电子邮件地址判定为在黑名单中,因为有可能某个好的邮件地址正巧对应八个都被设置成一的二进制位。好在这种可能性很小。我们把它称为误识概率。在上面的例子中,误识概率在万分之一以下。
布隆过滤器的好处在于快速,省空间。但是有一定的误识别率。常见的补救办法是在建立一个小的白名单,存储那些可能别误判的邮件地址。
import java.util.BitSet; public class SimpleBloomFilter { private static final int DEFAULT_SIZE =2 << 24 ; private static final int [] seeds =new int []{5,7, 11 , 13 , 31 , 37 , 61}; private BitSet bits= new BitSet(DEFAULT_SIZE); private SimpleHash[] func=new SimpleHash[seeds.length]; public static void main(String[] args) { String value = "stone2083@yahoo.cn" ; SimpleBloomFilter filter=new SimpleBloomFilter(); System.out.println(filter.contains(value)); filter.add(value); System.out.println(filter.contains(value)); } public SimpleBloomFilter() { for( int i= 0 ; i< seeds.length; i ++ ) { func[i]=new SimpleHash(DEFAULT_SIZE, seeds[i]); } } public void add(String value) { for(SimpleHash f : func) { bits.set(f.hash(value), true ); } } public boolean contains(String value) { if(value ==null ) { return false ; } boolean ret = true ; for(SimpleHash f : func) { ret=ret&& bits.get(f.hash(value)); } return ret; } public static class SimpleHash { private int cap; private int seed; public SimpleHash( int cap, int seed) { this.cap= cap; this.seed =seed; } public int hash(String value) { int result=0 ; int len= value.length(); for (int i= 0 ; i< len; i ++ ) { result =seed* result + value.charAt(i); } return (cap - 1 ) & result; } } } 运行
发表评论
-
protobuf-dt插件
2015-03-24 13:16 1421protobuf-dt: 安装前先安装xtext 可 ... -
java循环标签
2015-03-20 16:13 610今天看 源码的时候 看到 一个小语法 参考: ... -
java程序性能优化 --阅读
2014-10-14 17:56 709闲着,真实无聊; 发现一本好书《java程序性能优 ... -
jetty invalid entry CRC问题
2014-08-04 11:42 16121: http://stackoverflow.com/qu ... -
guice注入
2014-05-24 12:13 9449Google Guice3.0: http://code. ... -
eclipse快捷键
2014-05-21 16:01 5781: clrl+alt+r : 最常用,快速定位到文件 2 ... -
java clone
2014-05-16 17:04 527转:http://www.blogjava.net/ora ... -
ThreadLocal
2014-05-13 18:39 772简单介绍一下ThreadLocal的原理:1.Thread ... -
hession
2014-04-30 12:33 697一、首先先说Hessian是什么? Hessian:he ... -
冒泡和快速排序java
2014-04-19 18:01 7581: 冒泡最简单一种: /** * 算法效率o ... -
java生产者和消费者模型三种实现
2014-04-19 17:51 13671: 生产者和消费者的问题,生产者生产产品到缓冲区,消费者 ... -
单例模式
2014-03-14 16:06 750今天看到群里,关于单例模式的多线程下的安全问题: 1:最 ... -
freemarker的使用
2014-02-28 16:42 8421:freemarker eclipse插件安装方法:ht ... -
java 引用类型和内存泄露
2013-11-21 17:48 585http://blog.csdn.net/luoshenfu ... -
java泛型
2013-11-07 13:52 436Class<T>在实例化的时候,T要替换成具体 ... -
filter执行顺序
2013-10-12 11:16 1124多个筛选器的运行顺序取决于下列规则: 将 filt ... -
spring rmi远程调用
2013-09-09 11:48 11771:以前用jmi发布服务,实现分布式的一种方式,远程调用, ... -
spring mvc返回204状态码
2013-07-24 09:27 39271:204是没内容 不跳转的 代表请求成功的意思 ... -
editplus去掉多余空行
2013-07-19 21:05 7391: ^[ \t]*\n 用正则表达式替换 -
spring3 aop 使用详细
2013-06-06 11:10 01:目标:拦截所有的@Controller中的方法 ...
相关推荐
自己写的Java抓图程序 原理见 http://blog.csdn.net/binyao02123202/archive/2010/07/12/5728840.aspx 用了序列化 线程 和BloomFilter算法
本篇文章将深入探讨Cuckoo Filter如何在某些情况下优于Bloom Filter,以及Go语言中实现Cuckoo Filter的细节。 首先,Bloom Filter是一种概率型数据结构,通过使用多个哈希函数将元素映射到位数组中。尽管它能高效地...
在提供的压缩包文件`Bloom Filter`中,可能包含了具体的Java实现代码,你可以通过阅读和分析这些代码来深入理解布隆过滤器的工作原理和Java实现细节。此外,还可以通过测试不同参数组合下的性能,进一步了解布隆过滤...
在这个Java实现的源码中,我们可以深入理解WM算法的工作原理及其在敏感词过滤中的应用。 WM算法的核心思想是通过建立一个模式库,将多个待匹配的模式(例如,敏感词)与待处理文本进行对比。每个模式都有一个权重值...
下面将详细介绍这三个算法及其在Java实现中的应用。 1. **Shingling(希尔链)** Shingling是一种将原始数据转化为更小的、可比较的表示方法。通常用于文本分析,特别是文档相似度计算。它首先将文本分割成单词...
解决方案 2:使用 Bloom filter,可以将一个文件中的 URL 映射到 340 亿 bit,然后检查另外一个文件中的 URL 是否与 Bloom filter 相匹配。 Scenario 2: 按照 query 的频度排序 在这个场景中,我们有 10 个文件,...
Apriori算法是一种经典的关联规则挖掘算法,...总之,Java实现Apriori算法需要理解其核心原理,设计合适的数据结构,并通过编程实现各个步骤。在实际应用中,还需要考虑性能优化和扩展性,以适应不同的数据规模和需求。
大数据处理算法目录中,主要介绍了三种大数据处理算法:Bitmap 算法、Bloom Filter 算法和分而治之/Hash 映射 + Hash 统计 + 堆/快速/归并排序。 大数据处理算法一:Bitmap 算法 Bitmap 算法是一种常用的大数据...
使用合适的数据结构和算法(如使用Trie或Bloom Filter优化查找)以及定期归档旧数据,可以提高统计效率。 10. **测试**:确保编写单元测试和集成测试来验证你的统计逻辑,特别是边界情况,如跨年、跨月的访问统计。...
Bloom Filter SHA-1 Message Digest Algorithm MD5 Base64 Graph data structure Strongly Connected Components(SCC) Prim's minimum spanning tree Kruskal MST Directed/Undirected graph ops Breadth First ...
总之,这个项目展示了如何利用Java实现高效的图像识别系统,特别是直方图比较算法在图像相似性检测中的优势。尽管基于哈希的图像指纹方法在某些方面可能更高效,但在这个特定案例中,直方图比较算法提供了更高的识别...
Bloom filter 是一种空间效率高、查询效率高的数据结构,可以用来实现数据字典、判重、集合求交集等操作。其原理是使用位数组+k 个独立的哈希函数,将哈希函数对应的值的位数组置 1,查找时如果发现所有哈希函数对应...
总结来说,Java实现文章汉字关键词(违禁词)识别需要结合多种数据结构和算法,如哈希表、Trie树、分词库和过滤算法。通过合理的设计和优化,我们可以构建出高效、准确的违禁词检测系统,满足内容审核的需求。
此外,为了优化性能,可能还会采用布隆过滤器(Bloom Filter)来减少不必要的计算,或者使用近似算法在牺牲一定精度的情况下提高查询速度。 标签中提到的“skyline_query”和“skyline_query_algorithm”指的是...
在这个"数据结构与算法分析JAVA_LAB06"实验中,我们聚焦于一个特殊的概率数据结构——布隆过滤器(Bloom Filter)。 布隆过滤器是一种空间效率极高的概率型数据结构,用于测试一个元素是否在一个集合中。它可能会...
BF_MRSEClient-master 是本次课程设计的源代码文件,可能是使用某种编程语言(如Python或Java)实现的一个客户端程序,用于展示布隆过滤器(Bloom Filter)或其他某种特定算法的可视化过程。布隆过滤器是一种空间...
1. **BD**: 这可能指的是Bloom Filter(布隆过滤器),一种空间效率极高的概率型数据结构,用于判断一个元素是否在一个集合中。它可能会有误报(将不存在的元素误认为存在),但不会漏报。 2. **ins_sort**: 这个...
4. **Java实现**: - 在Java中,可以使用数组或集合结构存储训练样本和其对应的类别信息。 - 距离计算可以通过自定义方法实现,如`calculateDistance()`。 - 选择K个最近邻时,可以使用优先队列(PriorityQueue)...
5. **优化策略**:为了提高效率,可以采用一些优化策略,如迭代过程中只传输离中心点较远的数据点,或者利用Bloom Filter减少不必要的计算。 在Java中实现MapReduce程序,主要涉及编写Mapper和Reducer类,以及Job...