18 布隆過濾器(Bloom Filter)

2021-10-06 11:45:32 字數 2912 閱讀 2479

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 是一種空間效率很高的隨機...