1 布隆過濾器
如果要經常判斷 1 個元素是否存在,你會怎麼做?
很容易想到使用雜湊表(hashset、hashmap),將元素作為 key 去查詢
時間複雜度:o(1),但是空間利用率不高,需要占用比較多的記憶體資源
如果需要編寫乙個網路爬蟲去爬10億個**資料,為了避免爬到重複的**,如何判斷某個**是否爬過?
很顯然,hashset、hashmap 並不是非常好的選擇
布隆過濾器是一種時間複雜度低、占用記憶體較少的方案
2023年由布隆提出,它是乙個空間效率高的概率型資料結構,可以用來告訴你:乙個元素一定不存在或者可能存在。本質上是乙個很長的二進位制向量和一系列隨機對映函式(hash函式)
優缺點
優點:空間效率和查詢時間都遠遠超過一般的演算法
缺點:有一定的誤判率、刪除困難
假設布隆過濾器由 20位二進位制、 3 個雜湊函式組成,每個元素經過雜湊函式處理都能生成乙個索引位置
新增元素:將每乙個雜湊函式生成的索引位置都設為 1
查詢元素是否存在
如果有乙個雜湊函式生成的索引位置不為 1,就代表不存在(100%準確)
如果每乙個雜湊函式生成的索引位置都為 1,就代表存在(存在一定的誤判率)
新增、查詢的時間複雜度都是:o(k) ,k 是雜湊函式的個數。空間複雜度是:o(m) ,m 是二進位制位的個數
布隆過濾器的誤判率
;// 求出二進位制向量的長度
bitsize =
(int)(
-(n * math.
log(p))/
(ln2 * ln2));
// 求出雜湊函式的個數,先用bitsize*ln2,因為防止bitsize/n時,由於是兩個int相除,把小數省略
hashsize =
(int
)(bitsize * ln2 / n)
;// bits陣列的長度,long.size可以返回乙個long型別變數占用bit數,long8位元組(byte),64位
//求頁數的公式,實際上就是向上取整
bits =
newlong
[(bitsize + long.size -1)
/ long.size]
;// 每一頁顯示100條資料, pagesize
// 一共有999999條資料, n
// 請問有多少頁 pagecount = (n + pagesize - 1) / pagesize
}/**
* 新增元素1
*/public
boolean
put(t value)
// 生成乙個二進位的索引
int index = combinedhash % bitsize;
// 設定index位置的二進位為1
//有任何一位改動了,就認為是put成功if(
set(index)
) result =
true
;// 101010101010010101
// | 000000000000000100 1 << index
// 101010111010010101
}return result;
}/**
* 判斷乙個元素是否存在
*/public
boolean
contains
(t value)
// 生成乙個二進位的索引
int index = combinedhash % bitsize;
// 查詢index位置的二進位是否為0if(
!get
(index)
)return
false;}
return
true;}
/** * 設定index位置的二進位為1
*/private
boolean
set(
int index)
/** * 檢視index位置的二進位的值
* @return true代表1, false代表0
*/private
boolean
get(
int index)
private
void
nullcheck
(t value)
}}main
package com.mj;
public
class
main
//
// int count = 0;
// for (int i = 1_00_0001; i <= 2_00_0000; i++)
// }
// system.out.println(count);
// 陣列
string[
] urls =
; bloomfilter
bf =
newbloomfilter
(10_0000_0000,
0.01);
/* for (string url : urls) */
for(string url : urls)
}}
布隆過濾器
布隆過濾器 bloom filter 是1970年由布隆提出的。它實際上是乙個很長的二進位制向量和一系列隨機對映函式。布隆過濾器可以用於檢索乙個元素是否在乙個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的演算法,缺點是有一定的誤識別率和刪除困難。如果想要判斷乙個元素是不是在乙個集合裡,一般想到...
布隆過濾器
布隆過濾器的概念 如果想要判斷乙個元素是不是在乙個集合裡,一般想到的是將所有元素儲存起來,然後通過比較確定。鍊錶,樹等等資料結構都是這種思路.但是隨著集合中元素的增加,我們需要的儲存空間越來越大,檢索速度也越來越慢 o n o logn 不過世界上還有一種叫作雜湊表 又叫 雜湊表,hash tabl...
布隆過濾器
如果想判斷乙個元素是不是在乙個集合裡,一般想到的是將集合中所有元素儲存起來,然後通過比較確定。鍊錶 樹 雜湊表 又叫雜湊表,hash table 等等資料結構都是這種思路。但是隨著集合中元素的增加,我們需要的儲存空間越來越大。同時檢索速度也越來越慢。bloom filter 是一種空間效率很高的隨機...