BloomFilter算法概述

02 | conda的使用 conda 阅读详情
 Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法。通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合。
一. 实例 
    为了说明Bloom Filter存在的重要意义,举一个实例:
    假设要你写一个网络蜘蛛(web crawler)。由于网络间的链接错综复杂,蜘蛛在网络间爬行很可能会形成“环”。为了避免形成“环”,就需要知道蜘蛛已经访问过那些URL。给一个URL,怎样知道蜘蛛是否已经访问过呢?稍微想想,就会有如下几种方案:
  1.     将访问过的URL保存到数据库。
  2.     用HashSet将访问过的URL保存起来。那只需接近O(1)的代价就可以查到一个URL是否被访问过了。
  3.     URL经过MD5或SHA-1等单向哈希后再保存到HashSet或数据库。
  4.     Bit-Map方法。建立一个BitSet,将每个URL经过一个哈希函数映射到某一位。
     方法1~3都是将访问过的URL完整保存,方法4则只标记URL的一个映射位。
    以上方法在数据量较小的情况下都能完美解决问题,但是当数据量变得非常庞大时问题就来了。
    方法1的缺点:数据量变得非常庞大后关系型数据库查询的效率会变得很低。而且每来一个URL就启动一次数据库查询是不是太小题大做了?
    方法2的缺点:太消耗内存。随着URL的增多,占用的内存会越来越多。就算只有1亿个URL,每个URL只算50个字符,就需要5GB内存。
    方法3:由于字符串经过MD5处理后的信息摘要长度只有128Bit,SHA-1处理后也只有160Bit,因此方法3比方法2节省了好几倍的内存。
    方法4消耗内存是相对较少的,但缺点是单一哈希函数发生冲突的概率太高。还记得数据结构课上学过的Hash表冲突的各种解决方法么?若要降低冲突发生的概率到1%,就要将BitSet的长度设置为URL个数的100倍。
    实质上上面的算法都忽略了一个重要的隐含条件:允许小概率的出错,不一定要100%准确!也就是说少量url实际上没有没网络蜘蛛访问,而将它们错判为已访问的代价是很小的——大不了少抓几个网页呗。 
二. Bloom Filter的算法 
    废话说到这里,下面引入本篇的主角——Bloom Filter。其实上面方法4的思想已经很接近Bloom Filter了。方法四的致命缺点是冲突概率高,为了降低冲突的概念,Bloom Filter使用了多个哈希函数,而不是一个。
    Bloom Filter算法如下:
    创建一个m位BitSet,先将所有位初始化为0,然后选择k个不同的哈希函数。第i个哈希函数对字符串str哈希的结果记为h(i,str),且h(i,str)的范围是0到m-1 。
(1) 加入字符串过程 
    下面是每个字符串处理的过程,首先是将字符串str“记录”到BitSet中的过程:

    对于字符串str,分别计算h(1,str),h(2,str)…… h(k,str)。然后将BitSet的第h(1,str)、h(2,str)…… h(k,str)位设为1。


    很简单吧?这样就将字符串str映射到BitSet中的k个二进制位了。
(2) 检查字符串是否存在的过程 
    下面是检查字符串str是否被BitSet记录过的过程:
    对于字符串str,分别计算h(1,str),h(2,str)…… h(k,str)。然后检查BitSet的第h(1,str)、h(2,str)…… h(k,str)位是否为1,若其中任何一位不为1则可以判定str一定没有被记录过。若全部位都是1,则“认为”字符串str存在。
    若一个字符串对应的Bit不全为1,则可以肯定该字符串一定没有被Bloom Filter记录过。(这是显然的,因为字符串被记录过,其对应的二进制位肯定全部被设为1了)
    但是若一个字符串对应的Bit全为1,实际上是不能100%的肯定该字符串被Bloom Filter记录过的。(因为有可能该字符串的所有位都刚好是被其他字符串所对应)这种将该字符串划分错的情况,称为false positive 。
(3) 删除字符串过程 
    字符串加入了就被不能删除了,因为删除会影响到其他字符串。实在需要删除字符串的可以使用Counting bloomfilter(CBF),这是一种基本Bloom Filter的变体,CBF将基本        Bloom Filter每一个Bit改为一个计数器,这样就可以实现删除字符串的功能了。count占用4位即可,详细参考:深入解析Bloom Filter(上)
    Bloom Filter跟单哈希函数Bit-Map不同之处在于:Bloom Filter使用了k个哈希函数,每个字符串跟k个bit对应。从而降低了冲突的概率。
三. Bloom Filter参数选择 
(1)哈希函数选择
    哈希函数的选择对性能的影响应该是很大的,一个好的哈希函数要能近似等概率的将字符串映射到各个Bit。选择k个不同的哈希函数比较麻烦,一种简单的方法是选择一个哈希函数,然后送入k个不同的参数。
(2)Bit数组大小选择 
    哈希函数个数k、位数组大小m、加入的字符串数量n的关系可以参考参考文献1。该文献证明了对于给定的m、n,当 k = ln(2)* m/n 时出错的概率是最小的。
    同时该文献还给出特定的k,m,n的出错概率。例如:根据参考文献1,哈希函数个数k取10,位数组大小m设为字符串个数n的20倍时,false positive发生的概率是0.0000889 ,这个概率基本能满足网络爬虫的需求了。 
四. Bloom Filter实现代码 
  下面给出一个简单的Bloom Filter的Java实现代码:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package algorithm;  
  2. import java.util.BitSet;  
  3. public class BloomFilter  
  4. {  
  5.     /* BitSet初始分配2^24个bit */  
  6.     private static final int DEFAULT_SIZE = 1 << 25;  
  7.     /* 不同哈希函数的种子,一般应取质数 */  
  8.     private static final int[] seeds = new int[]{ 5, 7, 11, 13, 31, 37, 61 };  
  9.     private BitSet bits = new BitSet(DEFAULT_SIZE);  
  10.     /* 哈希函数对象 */  
  11.     private SimpleHash[] func = new SimpleHash[seeds.length];  
  12.   
  13.     public BloomFilter()  
  14.     {  
  15.         for (int i = 0; i < seeds.length; i++)  
  16.         {  
  17.             func[i] = new SimpleHash(DEFAULT_SIZE, seeds[i]);  
  18.         }  
  19.     }  
  20.   
  21.     // 将字符串标记到bits中  
  22.     public void add(String value)  
  23.     {  
  24.         for (SimpleHash f : func)  
  25.         {  
  26.             bits.set(f.hash(value), true);  
  27.         }  
  28.     }  
  29.   
  30.     // 判断字符串是否已经被bits标记  
  31.     public boolean contains(String value)  
  32.     {  
  33.         if (value == null)  
  34.         {  
  35.             return false;  
  36.         }  
  37.         boolean ret = true;  
  38.         for (SimpleHash f : func)  
  39.         {  
  40.             ret = ret && bits.get(f.hash(value));  
  41.         }  
  42.         return ret;  
  43.     }  
  44.   
  45.     /* 哈希函数类 */  
  46.     public static class SimpleHash  
  47.     {  
  48.         private int cap;  
  49.         private int seed;  
  50.   
  51.         public SimpleHash(int cap, int seed)  
  52.         {  
  53.             this.cap = cap;  
  54.             this.seed = seed;  
  55.         }  
  56.   
  57.         // hash函数,采用简单的加权和hash  
  58.         public int hash(String value)  
  59.         {  
  60.             int result = 0;  
  61.             int len = value.length();  
  62.             for (int i = 0; i < len; i++)  
  63.             {  
  64.                 result = seed * result + value.charAt(i);  
  65.             }  
  66.             return (cap - 1) & result;  
  67.         }  
  68.     }  
  69. } 
BloomFilter应用与D-Lelft BloomFilter实现 此篇文章是开发过程中对BloomFilter应用场景的一些介绍,另外项目中实现了D-Left BloomFilter,相关实现时一些注意的地方,简单介绍下! 首先看一些应用场景: 1.海量的黑白名单。 2.爬虫抓取时重复的URL处理。 3.数据key是否存在检测 4.(一些面试题几十亿不重复整数中判断其中一个整数是否存在的问题,BitMap/BloomFilter能很好的解决) 。。。 阅读详情

相关推荐

安装Anconda时出现Failed to extract packages的解决方法

安装Anconda出现Failed to extract packages的解决方法

码农研究僧的博客 1万+

Anaconda3安装失败“弹窗Failed to extract packages” detail显示原因“ConfigurationLoadError“解决方案

一般都是错用tab键,只要把 .condarc 的tab换成4个空格就好。版权声明:本文为优快云博主「python_cjx」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.youkuaiyun.com/python_cjx/article/details/122490064。因为我之前安装过,所以我觉得是由于这个文件没删除,也就是没卸载彻底,所以才会出现这样的问题。2.查阅相关的帖子的做法:(本人未曾试过,删除了那个文件就安装成功了)

uuuuty的博客 2万+

Win7安装新版本anaconda出现Failed to extract packages解决方案

本文主要介绍了Win7安装新版本anaconda出现Failed to extract packages解决方案,希望能对学习使用anaconda的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 5万+

搜索中常见数据结构与算法探究

目录 01前言 02提出问题 2.1.1 案例一 03数据结构与算法基础 3.1 数据结构基础 3.1.1 什么是数据结构 3.1.2 数据之间的关系 3.2 算法基础 3.2.1 基础概念 3.2.2 数学基础 3.2.3 复杂度函数 3.3 知识储备 3.3.1 质数分辨定理(HashTree的理论基础) 04常见数据结构与算法分析 4.1 线性数据结构 4.1.1 HashMap 4.1.2 Bloom Filter(布隆过滤器) 4.1.3 SkipLi...

Java搜索工程技术栈 497

计算机视觉之姿态识别(原理+代码实操)

计算机视觉中的姿态识别原理+模型介绍,同时通过代码实操简单的演示基于mediapipe的单人姿态识别。

输出既学习 3万+

LVGL8.x 实体按键与Keypad驱动的无缝对接实战

本文详细解析了LVGL8.x中实体按键与Keypad驱动的两种对接方案:坐标映射的Button方式与事件驱动的Keypad方式。重点阐述了如何模块化裁剪lv_port_indev.c模板文件,并深入讲解了Keypad驱动与Group焦点管理系统的核心协作机制,为无触摸屏的嵌入式设备提供流畅的UI交互解决方案。

weixin_29164497的博客 446

[原创] 学习笔记:海量数据处理总结

  本文简要总结了一下海量数据处理的常见方法和思路。总结的比较粗糙,主要作为知识提纲使用。请各位高手不吝赐教。   另外,最近在BAE上学习用 WordPress 搭建了独立博客,欢迎大家有空去转转!本博客文章将同步更新。   博客地址:http://panwenhai.duapp.com/    1、海量数据处理总体思路:分配任务、单独解决、合并结果 分配任务: ...

dicong3527的博客 214

深入浅出:CosineLRScheduler 调度器的原理与实战应用

本文深入解析了CosineLRScheduler调度器的核心原理与实战应用,详细介绍了余弦退火算法及其在深度学习模型训练中的优势。通过参数配置建议、PyTorch实现示例和常见问题解决方案,帮助开发者高效应用该调度器提升模型性能,特别适用于计算机视觉和自然语言处理任务。

sss66的博客 859

一些不常见但是很重要的数据结构

这篇文章是stackoverflow的一篇帖子。上面提到了很多有用的数据结构。有的听过了,经常用,有的没有听过,记录下来。 Trie树。应用比较多,一个比较cool的trie的应用TRASH-A dynamic LC-trie and hash data structure。 Bloom filter。wiki链接删除某一项是不允许的,不过可以实现可计数的counting bloom f...

weixin_34270606的博客 233

C++ 类

本文介绍了C++中类的核心概念和使用方法。

weixin_54859557的博客 1016

SAP_PP模块跑完 MRP,MD04 里却看不到“计划订单”?排查这 3 个最容易被忽略的主数据参数

MRP 是 SAP 逻辑最严密的模块之一,它绝不会随机罢工。当 MD04 里看不到计划订单时,请不要怀疑系统的计算能力。99% 的情况,都是因为我们给系统下达了矛盾的指令:一边告诉它“我有需求”,一边却通过主数据告诉它“不要计划”、“不要触发”或者“我是冻结的”。掌握这 3 个排查点,你就能在 5 分钟内解决大部分“MRP 失灵”的悬案,成为用户眼中的“系统神医”。

我小时候很黑的博客 590

大数据量,海量数据 处理方法总结

1.Bloom filter 适用范围:可以用来实现数据字典,进行数据的判重,或者集合求交集 基本原理及要点: 对于原理来说很简单,位数组+k个独立hash函数。将hash函数对应的值的位数组置1, 查找时如果发现所有hash函数对应位都是1说明存在,很明显这个过程并不保证查找的 结果是100%正确的。同时也不支持删除一个已经插入的关键字,因为该关键字对应的位 会牵动到其他的关

王伴农 796

图像处理 | 基于matlab的多尺度Retinex(MSR)和自适应直方图均衡化(CLAHE)算法联合的低照度图像增强(附代码)

本文介绍了一种基于多尺度Retinex(MSR)和CLAHE的低照度图像增强算法。算法首先对图像进行多尺度Retinex处理,通过不同尺度的高斯核去除光照影响;然后采用CLAHE算法进行对比度增强。Matlab实现展示了算法流程,包含灰度转换、多尺度Retinex增强和CLAHE处理。实验结果显示,该方法能有效提升低照度图像的可见性,增强细节表现。最后提出了改进建议,包括引入深度学习方法和优化参数选择。

尘世冰封的专栏 952

教你如何迅速秒杀掉:99%的海量数据处理面试题

前言    一般而言,标题含有“秒杀”,“99%”,“史上最全/最强”等词汇的往往都脱不了哗众取宠之嫌,但进一步来讲,如果读者读罢此文,却无任何收获,那么,我也甘愿背负这样的罪名,:-),同时,此文可以看做是对这篇文章:十道海量数据处理面试题与十个方法大总结的一般抽象性总结。     毕竟受文章和理论之限,本文将摒弃绝大部分的细节,只谈方法/模式论,且注重用最通俗最直白的语

MrChen11的博客 1094

裂缝二维检测:裂缝的长度和宽度检测

这一节,我们需要去整合一下前面的代码,在进行长度和宽度的测量时,需要裂缝的类型、个数、面积的帮助。这一章是本专栏的核心部分。以上代码我均试过,由于本人能力有限,看不懂代码,最终还是没有采用,使用的是最普通检测宽度的方法,即求得骨架总长度后,用总面积求取平均宽度。

m0_62919535的博客 4237

YOLOv8改进 | 主干篇 | 利用MobileNetV1替换Backbone(轻量化网络结构)

本文给大家带来的改进机制是MobileNetV1,其是专为移动和嵌入式视觉应用设计的轻量化网络结构。这些模型基于简化的架构,并利用深度可分离卷积构建轻量级深度神经网络,其引入了两个简单的全局超参数,用于在延迟和准确性之间进行有效的权衡。实验表明,MobileNets在资源和准确性的权衡方面表现出色,并在多种应用(如对象检测、细粒度分类、面部属性识别和大规模地理定位)中展现了其有效性,这个模型非常适合轻量化的读者来使用。适用检测目标:轻量化网络结构适合轻量化的读者。

Snu77的博客 3966

海量数据处理

海量数据处理是基于海量数据上的存储、处理、操作。        所谓海量,就是数据量很大,可能是TB级别甚至是PB级别,导致无法一次性载入内存或者无法在较短时间内处理完成。面对海量数据,我们想到的最简单方法即是分治法,即分开处理,大而化小,小而治之。我们也可以想到集群分布式处理。 1 海量数据的存储:为大数据分析做准备 传统关系型数据库

August_1989 1652

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

浅谈BloomFilter【下】用Java实现BloomFilter

通过前一篇文章的学习,对于 BloomFillter 通过前一篇文章的学习,对于 BloomFilter 的概念和原理,以及误报率等计算方法都一个理性的认识了。在这里,我们将用 Java'实现一个简单的 BloomFilter 。

张小琦的博客专栏 9697

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

BloomFilter, Count-Min Sketch算法

1.bloom filter 布隆过滤器(英语:Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。 2.两种错误率FP/FN FP = A false positive error, or in short a f...

bitcarmanlee的博客 2919

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

BloomFilter简介

一.简介 BloomFilter底层是一个位图(位数组)的数据结构,通过k个hash函数将这个元素映射到位数组的k个点,将他们设置为1。检索时,我们查看这k个点是否都为1就能够判断元素是否在BloomFilter中(会有一定的误差率);如果k个点有一个点不为1,那么这个元素肯定不在BloomFilter里面。大致的数据结构: 二.使用场景 1.海量数据的去重 2.处理缓存穿透的场景,用于校验请求...

一群专业码农的笔记本 3652

海量数据题

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34399060的博客 122

doris:BloomFilter 索引

doris:BloomFilter 索引

qq_36070104的博客 955

BloomFilter原理

一.介绍BloomFilter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法,通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合。二.解释说明我们举个例子,假设我们需要写一个(web crawler),由于网络链接错综复杂,在爬行很可能形成”环”,为了避免这种情况的出现,我们需要知道蜘蛛已经访问过的那些URL,给一个URL,怎样知道是否已经访问过呢,

lanyizheng blog 796
上一篇: 高并发性能优化
下一篇: Java—内存泄露
Footloose_
博客等级 码龄10年 254粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值