- 浏览: 562889 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (270)
- Ask chenwq (10)
- JSF (2)
- ExtJS (5)
- Life (19)
- jQuery (5)
- ASP (7)
- JavaScript (5)
- SQL Server (1)
- MySQL (4)
- En (1)
- development tools (14)
- Data mining related (35)
- Hadoop (33)
- Oracle (13)
- To Do (2)
- SSO (2)
- work/study diary (10)
- SOA (6)
- Ubuntu (7)
- J2SE (18)
- NetWorks (1)
- Struts2 (2)
- algorithm (9)
- funny (1)
- BMP (1)
- Paper Reading (2)
- MapReduce (23)
- Weka (3)
- web design (1)
- Data visualisation&R (1)
- Mahout (7)
- Social Recommendation (1)
- statistical methods (1)
- Git&GitHub (1)
- Python (1)
- Linux (1)
最新评论
-
brandNewUser:
楼主你好,问个问题,为什么我写的如下的:JobConf pha ...
Hadoop ChainMap -
Molisa:
Molisa 写道mapred.min.split.size指 ...
Hadoop MapReduce Job性能调优——修改Map和Reduce个数 -
Molisa:
mapred.min.split.size指的是block数, ...
Hadoop MapReduce Job性能调优——修改Map和Reduce个数 -
heyongcs:
请问导入之后,那些错误怎么解决?
Eclipse导入Mahout -
a420144030:
看了你的文章深受启发,想请教你几个问题我的数据都放到hbase ...
Mahout clustering Canopy+K-means 源码分析
Bloom filter的优点:
- 大小固定,增加更多元素到一个Bloom filter不会增加它的大小,仅增加误报的概率
- 冲突概率低,为了降低冲突概率,Bloom filter引入多个Hash函数,其误报率可近似为:1-exp(-kn/m)
Java实现:
import java.util.BitSet; public class BloomFilter { /* BitSet初始分配2^24个bit */ private static final int DEFAULT_SIZE = 1 << 25; /* 不同哈希函数的种子,一般应取质数 */ 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 BloomFilter() { for (int i = 0; i < seeds.length; i++) { func[i] = new SimpleHash(DEFAULT_SIZE, seeds[i]); } } // 将字符串标记到bits中 public void add(String value) { for (SimpleHash f : func) { bits.set(f.hash(value), true); } } // 判断字符串是否已经被bits标记 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; } // hash函数,采用简单的加权和hash 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; } } }
评论
1 楼
jyltiger813
2012-05-15
这个实现存在问题
多个seeds对应一个BitSet,会增加hash碰撞冲突的概率,既增加误判为已包含的概率
正确的做法应该是一个seed对应一个BitSet
多个BitSet只要有一个不包含既判断为不包含,降低误判概率
多个seeds对应一个BitSet,会增加hash碰撞冲突的概率,既增加误判为已包含的概率
正确的做法应该是一个seed对应一个BitSet
多个BitSet只要有一个不包含既判断为不包含,降低误判概率
public class CompanyBloom implements Serializable{ /** * */ private static final long serialVersionUID = 1L; /* BitSet初始分配2^24个bit */ private static final int DEFAULT_SIZE = 1 << 933433;// 933433; /* 不同哈希函数的种子,一般应取质数 */ private static final int[] seeds = new int[] { 5, 7, 11, 13, 31, 37, 61};//,73,103,109, 319, 529, 739, 949,113, 323 ,533 ,743, 953 ,121, 331, 541 ,751 ,961,127, 337 ,547, 757, 967 ,131, 341 ,551 ,761, 971,137, 347 ,557, 767,977};//,137, 347 ,557, 767 ,977 }; HashMap<Integer,BitSet> bitMap = new HashMap<Integer,BitSet>(); // private BitSet bits = new BitSet(DEFAULT_SIZE); /* 哈希函数对象 */ private SimpleHash[] func = new SimpleHash[seeds.length]; public CompanyBloom() { for (int i = 0; i < seeds.length; i++) { func[i] = new SimpleHash(DEFAULT_SIZE, seeds[i]); BitSet bit = new BitSet(DEFAULT_SIZE); bitMap.put(seeds[i], bit); } loadFromDisk(); } // 将字符串标记到bits中 public void add(String value) { for (SimpleHash f : func) { bitMap.get(f.getSeed()).set(f.hash(value), true); // bits.set(f.hash(value), true); } } // 判断字符串是否已经被bits标记 public boolean contains(String value) { if (value == null) { return false; } boolean ret = true; for (SimpleHash f : func) { ret = ret && bitMap.get(f.getSeed()).get(f.hash(value)); } return ret; } /* 哈希函数类 */ public static class SimpleHash { private int cap; private int seed; public int getSeed() { return seed; } public void setSeed(int seed) { this.seed = seed; } public SimpleHash(int cap, int seed) { this.cap = cap; this.seed = seed; } // hash函数,采用简单的加权和hash 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); } //result = result^result; return (cap - 1) & result; } } public static void main(String args[]) { CompanyBloom bf = new CompanyBloom(); //bf.loadFromDB(); // bf.add("中国人"); long t1 = System.currentTimeMillis(); System.out.println("isContain:"+bf.contains("中国人名")); System.out.println("time:"+(System.currentTimeMillis()-t1)); System.out.println("isContain:"+bf.contains("网易")); //System.out.println("isContain:"+bf.contains("中国人名")); System.out.println("isContain:"+bf.contains("ok")); System.out.println("isContain:"+bf.contains("北京分公司1")); System.out.println("isContain:"+bf.contains("中国移动")); System.out.println("isContain:"+bf.contains("中国3")); System.out.println("isContain:"+bf.contains("新浪1")); System.out.println("isContain:"+bf.contains("更新日期")); System.out.println("isContain:"+bf.contains("计算机软件")); // bf.flush2Disk(); } /** * */ private void loadFromDB() { Connection con =getConnection(); String sql = " SELECT `name` FROM dic_company_name "; //String sql = " SELECT `name` FROM dic_company_name ";//TODO 测试,仅用较少的一部分数据 try { Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(sql); int i = 0; while( rs.next()) {i++; // System.out.println("i"+i); String cn_name = rs.getString(1); add(cn_name); System.out.println("i:"+i); } } catch (SQLException e) { e.printStackTrace(); } finally{ try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } } /** * */ private void loadFromDisk() { URL url = CompanyBloom.class.getResource("companyBloom"); ObjectInputStream oin; try { oin = new ObjectInputStream(new FileInputStream(url.getFile())); bitMap = (HashMap<Integer, BitSet>)oin.readObject(); oin.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * */ private void flush2Disk() { //试图将对象两次写入文件 try { ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream("companyBloom")); out.writeObject(bitMap); out.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
发表评论
-
EM算法小结
2012-07-20 12:16 3424描述 EM是一种基于模型的聚类算法,假设样本符合高斯混 ... -
研究生能力培养手册
2012-06-10 21:00 8701. 如果平时几乎没看过英文原文,读不懂怎么办? ... -
[转]中科院分词工具ICTCLAS Java JNI接口
2012-06-04 15:07 1860ICTCLAS,网址:http://www.ictcla ... -
正则表达式学习资源
2012-05-30 11:37 732不懂正则表达式,怎么好意思说是玩文本挖掘的? 下面 ... -
基于向量空间模型的文本聚类算法
2012-05-29 18:26 27251 文本聚类研究现状 Internet 已经发 ... -
再往前一步,学会更专业地看待问题,尝试去解决问题。
2012-05-22 14:11 939在科研工作中,有一个很基本的技能,就是对自己和别人的工 ... -
基于密度的局部离群点检测
2012-04-24 16:49 3069算法:基于密度的局部离群点检测(lof算法) 输入:样 ... -
[转]非均衡数据集的分类问题
2012-03-31 21:36 2964传统的机器学习分类 ... -
LDA(线性判别分析)&PCA(主成分分析)
2012-03-23 21:16 1443推荐解释得非常好的两篇博文 http://blog.c ... -
Porter Stemming
2012-02-29 10:57 900摘要: 在英语中,一个单词常常是另一个单词的“变种”,如:h ... -
Hadoop Browse the filesystem无法访问
2012-02-23 22:17 1095问题如题. 解决方法: 修改/windows/system ... -
数据挖掘数据集
2012-02-18 17:35 943收集数据挖掘过程中用到的数据集。欢迎补充! TREC ... -
分类器的动态选择
2012-02-18 17:15 1055XMU DM一师兄写的动态集成分类器的选择, 内容挺新颖的, ... -
book reading plan
2012-02-09 15:50 707Mining of Massive Datasets ... -
[转]学术论文的标准格式是什么?写论文有哪些小技巧
2012-02-08 21:45 952我有一篇谈研究生开题报告的文章,你可以参考下: ... -
Rapid-I, 一个JAVA的数据挖掘开源平台
2012-01-30 18:29 1013当前主要使用的weka3.6,Hadoop的MapR ... -
Weka分析结果参数解释
2012-01-17 17:20 4237Kappa Statistic 假设有两个相互独立的人分别将 ... -
一淘背后的数据野心
2012-01-05 23:11 1202摘要:马云你能 ... -
多标记(multi-label)学习和Mulan
2011-12-21 20:33 3027概念澄清: ... -
数据挖掘最基础.
2011-12-15 11:34 01. 过拟合和泛化性的联系和区别? 过拟合:为了 ...
相关推荐
### Bloom Filter概念与原理 #### 一、Bloom Filter概述 Bloom Filter是一种高效的数据结构,主要用于快速查询一个元素是否存在于一个集合中。它通过牺牲一定的精确度来换取存储空间的极大节省。Bloom Filter的...
### Leveldb中Bloom Filter的优化:ElasticBF #### 概述 在现代数据库技术中,**Log-Structured Merge-tree (LSM-tree)** 结构因其高效的写入性能而被广泛应用于各种键值(Key-Value, KV)存储系统中,如Google的*...
### Bloom Filter概述与应用 #### 一、Bloom Filter简介 Bloom Filter是一种高效的数据结构,主要用于近似地判断一个元素是否在一个集合中。它的主要特点是空间效率高,但允许存在一定的误报率(即可能会错误地...
- **bloomfilter.h**:这是一个头文件,很可能包含了Bloom Filter的数据结构定义和相关操作函数的声明。在C语言中,头文件通常用于提供接口给其他源文件使用,这里可能是为了在spider.c中方便地调用Bloom Filter的...
BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8), 100000, 0.0001); // 添加元素 bloomFilter.put("element1"); bloomFilter.put("element2"); // 检查元素 ...
**Python-bloomfilter过滤器详解** Bloom Filter是一种空间效率极高的概率型数据结构,用于判断一个元素是否在一个集合中。在Python开发中,尤其是在处理大量数据时,Bloom Filter可以有效地节省内存空间,尤其适用...
在传统的Bloom Filter中,它通常处理单一的关键字,而在“多字段矩阵型Bloom Filter”中,这一概念被扩展到了支持多个字段的情况,这使得它在处理复杂数据集时更具灵活性。 首先,我们要理解Bloom Filter的基本原理...
BloomFilter<String> bloomFilter = BloomFilter.create(funnel, 100000, 0.03); bloomFilter.put("element1"); bloomFilter.put("element2"); System.out.println(bloomFilter.mightContain("element1")); //...
布隆过滤器(Bloom Filter)是一种空间效率极高的概率数据结构,用于判断一个元素是否可能在一个集合中。它由布伦南·布隆在1970年提出,最初是为了解决查找问题中的空间效率问题。这篇论文资料集合涵盖了布隆过滤器...
bloomfilter.js, 使用FNV的JavaScript bloom filter快速散列 Bloom过滤器This过滤器实现使用非加密 Fowler-Noll-Vo散列函数来实现速度。用法var bloom = new BloomFilter( 32 * 256,//number of bits to all
在Go编程语言中,Bloom Filter和Cuckoo Filter是两种流行的数据结构,用于空间效率高的近似存在检查。本篇文章将深入探讨Cuckoo Filter如何在某些情况下优于Bloom Filter,以及Go语言中实现Cuckoo Filter的细节。 ...
布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,用于判断一个元素是否可能在一个集合中。在大数据处理、缓存系统、分布式存储等领域有着广泛的应用。这个压缩包文件“bloom filter布隆过滤器学习...
Bloom filter是一个简明的空间效率极高的随机的数据结构。用Bloom filter 表示 cache 内容 ,可以高效地实现cache 协作。本文对BloomFilter及其改进型进行了综述性分析,探讨了它的实用性。
2. Bloom Filter技术:Bloom Filter是一种空间效率很高的随机数据结构,它使用位数组来简洁地表示一个集合,并且能够快速判断一个元素是否属于这个集合。Bloom Filter的引入是为了高效利用数据空间,在海量数据匹配...
本文将深入探讨标题提及的"Go-一个CuckooFilter的Go库BloomFilter的替代物",以及其背后的CuckooFilter数据结构和它如何成为BloomFilter的一种优化方案。 首先,Bloom Filter是一种空间效率极高的概率数据结构,...
This is the bloom filter of 2.5 Million ... BloomFilter bf=new BloomFilter(); BitSet bitSet=bf.readBit(fileName); bf.setBits(bitSet); System.out.println(bf.exist("password")); } it will says true.
**Bloom Filter算法详解** Bloom Filter是一种空间效率极高的概率型数据结构,用于判断一个元素是否可能在一个集合中。由Burton Howard Bloom在1970年提出,它的主要特点是能够在牺牲一定的判断准确性(可能存在...