布隆过滤器(Bloom Filter)-学习笔记-Java版代码(挖坑ing)
布隆过滤器解决"面试题:
- 如何建立一个十亿级别的哈希表,限制内存空间"
- "如何快速查询一个10亿大小的集合中的元素是否存在"
如题
布隆过滤器确实很神奇, 简单来说就是通过多次hash将key存进一个集合中,可以灰常快速地在数亿级的数据中快速查找!
实现布隆过滤器需要用bit位存储的数组, 千万别用int[] ,毕竟一个int整形占32位,一个int = 32 bit!
但是Java没有bit, 那用byte吧,一个byte(8位)当做8位的bit来算吧,每一位代表一个具体的值来进行hash; 解析hash和设置hsah值的时候, 需要位运算提取出每位上的值(每位上的0或1)!
但是java的byte还需要分正负,默认一个byte的范围为[-128,127] !
部分学习借鉴搬运的博客原文链接
https://www.cnblogs.com/liyulong1982/p/6013002.html
https://baike.baidu.com/item/布隆过滤器/5384697?fr=aladdin
笔记整理
算法核心
- 首先需要k个hash函数,每个函数可以把key散列成为1个整数
- 初始化时,需要一个长度为n比特的数组,每个比特位初始化为0
- 某个key加入集合时,用k个hash函数计算出k个散列值,并把数组中对应的比特位置为1
- 判断某个key是否在集合时,用k个hash函数计算出k个散列值,并查询数组中对应的比特位,如果所有的比特位都是1,认为在集合中。
优点:
不需要存储key,使用节省空间
缺点:
- 算法判断key在集合中时,有一定(通过优化算法可以降到很低)的概率key其实不在集合中
- 无法删除
典型的应用场景:
- 某些存储系统的设计中,会存在空查询缺陷:当查询一个不存在的key时,需要访问慢设备,导致效率低下。
- 比如一个前端页面的缓存系统,可能这样设计:先查询某个页面在本地是否存在,如果存在就直接返回,如果不存在,就从后端获取。但是当频繁从缓存系统查询一个页面时,缓存系统将会频繁请求后端,把压力导入后端。
- 这是只要增加一个bloom算法的服务,后端插入一个key时,在这个服务中设置一次
需要查询后端时,先判断key在后端是否存在,这样就能避免后端的压力. - 最近还学到, 布隆过滤器还可以防止缓存雪崩, 原理同上.
黑客通过大量请求数据库中不存在的key, 导致遍历整个缓存和数据路进行查询, 每次都无法让前端的缓存发挥效果,缓存系统将会频繁请求后端数据库,很快就会造成系统雪崩.
因此可以利用布隆过滤器进行解决这个问题.
- 解决思路: 将数据库中的key全部建立到布隆过滤器中, 每次请求先查询布隆过滤器; 如果存在,则放行, 毕竟布隆过滤器会有很少部分key会误算!
- 注意: 通过布隆过滤器的值,极大地概率存在着这个key;不通过的key, 那么一定不存在.
模拟布隆过滤器; 先挖坑,扔在这里
一个byte分为8位用,故1250万的byte数组就可以了.
该数组大小为: .
package com.szs.test;
public class myBloomFilter {
//一个boolean只占一个字节, 一个字节是八位,把每个字节拆成八位来用
//一个byte分为8位用,故可哈希出10亿个具体的数据,1.250亿的byte数组就可以了,但是需要125M更多的内存.
// 但是具体题目一般都有内存的限制(比如100M 以内), 还有其他的情况需要考虑!
//10^9 == 10亿 , 故int就够了.( int的取值范围为: -2^31——2^31-1,即-2147483648——2147483647 , 大概最高值为2*10^9)
//如下数组为1.25*10^7大小.
private static byte[] array01 = new byte[12500000];
private static byte[] array02 = new byte[12500000];
private static byte[] array03 = new byte[12500000];
/** 简单的布隆过滤器的main测试类
* @param args
*/
public static void main(String[] args) {
}
/**
* 查找一个key,判断是否存在;若存在返回true,否则返回false
* @param x
*/
public static boolean findKey(long x) {
return true;
}
/**
*
* @param x
*/
public static void insertKey(long x) {
}
/**
* 删除一个key, 暴力for循环进行删除
* @param x
*/
public static void deleteKey(long x) {
}
/**
* 尝试hash后,返回对应的hash值,
*/
public static void hashKeyThreeTimes(long x) {
}
/**
* 存储hash值到数组中的index下标
* @param x
*/
public static void storeHashCode(long hashCode) {
}
}
其他思路
- 量子计算, 一个量子有八种状态,其实就是八进制,两个量子就可以枚举64种状态; 依次类推,十亿级别数据量的时间复杂度为: log810^9= 9 .故时间复杂度为O(1).
- 并行计算: 多处理进行处理.
- 增加系统内存,增加JVM虚拟机的可分配内存.
布隆过滤器(Bloom Filter)-学习笔记-Java版代码(挖坑ing)的更多相关文章
- [转载]布隆过滤器(Bloom Filter)
[转载]布隆过滤器(Bloom Filter) 这部分学习资料来源:https://www.youtube.com/watch?v=v7AzUcZ4XA4 Filter判断不在,那就是肯定不在:Fil ...
- 布隆过滤器 Bloom Filter 2
date: 2020-04-01 17:00:00 updated: 2020-04-01 17:00:00 Bloom Filter 布隆过滤器 之前的一版笔记 点此跳转 1. 什么是布隆过滤器 本 ...
- [转载] 布隆过滤器(Bloom Filter)详解
转载自http://www.cnblogs.com/haippy/archive/2012/07/13/2590351.html 布隆过滤器[1](Bloom Filter)是由布隆(Burton ...
- 布隆过滤器(Bloom Filter)详解
直观的说,bloom算法类似一个hash set,用来判断某个元素(key)是否在某个集合中.和一般的hash set不同的是,这个算法无需存储key的值,对于每个key,只需要k个比特位,每个存储一 ...
- 布隆过滤器(Bloom Filter)详解——基于多hash的概率查找思想
转自:http://www.cnblogs.com/haippy/archive/2012/07/13/2590351.html 布隆过滤器[1](Bloom Filter)是由布隆(Burton ...
- 布隆过滤器(Bloom Filter)的原理和实现
什么情况下需要布隆过滤器? 先来看几个比较常见的例子 字处理软件中,需要检查一个英语单词是否拼写正确 在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上 在网络爬虫里,一个网址是否被访问过 yahoo, ...
- 浅谈布隆过滤器Bloom Filter
先从一道面试题开始: 给A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL. 这个问题的本质在于判断一个元素是否在一个集合中.哈希表以O(1) ...
- 【面试突击】-缓存击穿(布隆过滤器 Bloom Filter)
原文地址:https://blog.csdn.net/fouy_yun/article/details/81075432 前面的文章介绍了缓存的分类和使用的场景.通常情况下,缓存是加速系统响应的一种途 ...
- 探索C#之布隆过滤器(Bloom filter)
阅读目录: 背景介绍 算法原理 误判率 BF改进 总结 背景介绍 Bloom filter(后面简称BF)是Bloom在1970年提出的二进制向量数据结构.通俗来说就是在大数据集合下高效判断某个成员是 ...
随机推荐
- 【视频开发】【计算机视觉】doppia编译之四:安装其他库、编译和运行doppia
(与本节内容无关///////////////////////////保存图片参数为--gui.save_all_screenshots true////////////////////) 在我们安 ...
- C#易失域、锁的分享,多线程
C#多线程.易失域.锁的分享 一.多线程 windows系统是一个多线程的操作系统.一个程序至少有一个进程,一个进程至少有一个线程.进程是线程的容器,一个C#客户端程序开始于一个单独的线程,CLR(公 ...
- kube-proxy运行机制分析【转载】
转自:http://blog.itpub.net/28624388/viewspace-2155433/ 1.Service在很多情况下只是一个概念,而真正将Service的作用实现的是kube-pr ...
- [转帖]Merkle树
Merkle树 https://www.jianshu.com/p/fc439a8fd0de 所谓比特币交易就是从一个比特币钱包向另一个中转账,每笔交易都有数字签名来保证安全.一个交易一旦发生那么就是 ...
- Scrapy框架——介绍、安装、命令行创建,启动、项目目录结构介绍、Spiders文件夹详解(包括去重规则)、Selectors解析页面、Items、pipelines(自定义pipeline)、下载中间件(Downloader Middleware)、爬虫中间件、信号
一 介绍 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速.简单.可扩展的方式从网站中提取所需的数据.但目前Scrapy的用途十分广泛,可 ...
- linux查看进程与结束进程
查看所有进程 ps -ef ps -ef | grep 查找的进程名 结束进程 ps -ef | grep 查找的进程名 | grep -v grep | awk '{print $2}' | xar ...
- Spark 系列(十二)—— Spark SQL JOIN 操作
一. 数据准备 本文主要介绍 Spark SQL 的多表连接,需要预先准备测试数据.分别创建员工和部门的 Datafame,并注册为临时视图,代码如下: val spark = SparkSessio ...
- 转 如何在调用WCF服务之前弹出一个确认对话框
自定义InteractiveChannelInitializer(InvocationConfirmationInteractiveChannelInitializer)定义如下.我们在BeginDi ...
- Go strconv模块:字符串和基本数据类型之间转换
本文转自Golove博客:http://www.cnblogs.com/golove/p/3262925.html ParseBool 将字符串转换为布尔值 // 它接受真值:1, t, T, TRU ...
- iOS静态库相关-封装lib
来源:http://blog.csdn.net/zsomsom/article/details/9163635 Library介绍 基本知识 在实际的编程过程中,通常会把一些公用函数制成函数库,供其它 ...