day25之布隆過濾器的實現和優缺點以及擴充套件

2021-08-05 21:06:54 字數 2944 閱讀 4360

布隆過濾器(bloom filter)是2023年由布隆提出的。它實際上是乙個很長的二進位制向量和一系列隨機對映函式。布隆過濾器可以用於檢索乙個元素是否在乙個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的演算法,缺點是有一定的誤識別率和刪除困難。

**實現:

class bitmap

bitmap(size_t size)

// 1

void set(int data)

// data所在位元組的位元位置0

void reset(int data)

private:

std::vector

_table;

};

布隆過濾器用到的雜湊函式

#pragma once

#include

#include

using

namespace

std;

size_t getnextprim(size_t prev)//prev = 10

; for (size_t idx = 0; idx < _primesize; ++idx)

return -1;

}static size_t bkdrhash(const

char * str)

return (hash & 0x7fffffff);

}size_t sdbmhash(const

char* str)

return hash;

}size_t rshash(const

char *str)

return hash;

}size_t aphash(const

char* str)

else

}return hash;

}size_t jshash(const

char* str)

return hash;

}struct _hashfunc1

};struct _hashfunc2

};struct _hashfunc3

};struct _hashfunc4

};struct _hashfunc5

};

#include "bitmap.h"

#include "common.h"

//雜湊函式的用途就是將其他型別的元素轉換為整型。

template

k=string, class

hash1 = _hashfunc1, class

hash2 = _hashfunc1

,class

hash3 = _hashfunc3, class

hash4 = _hashfunc4, class

hash5 = _hashfunc5 >

class

bloomfilter

void set

(const

k & key)

//布隆過濾器只要有乙個雜湊函式計算到不在位圖中,這個元素就不在,相反如果計算後都在也有可能不在

bool find

(const

k & key)

if ( !_bitmap->test(hash2()

(key) % _capacity))

if ( !_bitmap->test(hash3()

(key) % _capacity))

if ( !_bitmap->test(hash4()

(key) % _capacity))

if ( !_bitmap->test(hash5()

(key) % _capacity))

return true;

}private:

bitmap *_bitmap;

int _capacity;

};

布隆過濾器的優點:

布隆過濾器儲存空間 插入和查詢都是o(1),另外, hash函式相互之間沒有關係,方便由硬體並行實現。布隆過濾器不需要儲存元素本身,在某些對保密要求非常嚴格的場合有優勢。

缺點:

誤算率是其中之一。隨著存入的元素數量增加,誤算率隨之增加

另外,一般情況下不能從布隆過濾器中刪除元素

如何擴充套件bloomfilter使得它支援刪除元素的操作?

因為乙個布隆過濾器的key對應多個位,衝突的概率比較大,所以不支援刪除,因為刪除有可能影響到其他元素。如果要對其元素進行刪除,就不得不對每乙個位進行引用計數。

#include "common.h"

//雜湊函式的用途就是將其他型別的元素轉換為整型。

template

k=string, class

hash1 = _hashfunc1, class

hash2 = _hashfunc1

,class

hash3 = _hashfunc3, class

hash4 = _hashfunc4, class

hash5 = _hashfunc5 >

class

bloomfiltercount

void set

(const

k & key)

void resit

(const

k &key)

//布隆過濾器只要有乙個雜湊函式計算到不在位圖中,這個元素就不在

bool find

(const

k & key)

//我們都知道,位圖非常的節省空間,但由於每一位都要引入乙個int,所以空間浪費還是比較嚴重的,

//因此不得不放棄點陣圖了

private:

vector_refbm;

size_t _capacity;

};

go實現布隆過濾器

布隆過濾器一般用來判斷乙個資料是否在乙個很大的資料集合裡面。當然可以用陣列,集合,樹等資料結構和各種查詢法都可以做同樣的事情,但是布隆過濾器有更好的時間效率和空間效率。位元幣實現spv節點時使用了布隆過濾器來查詢交易。布隆過濾器可以判斷乙個數在不在集合裡,但存在一定的誤判率。布隆過濾器的核心是乙個超...

redis之布隆過濾器

布隆過濾器是什麼?布隆過濾器可以理解為乙個不怎麼精確的 set 結構,當你使用它的 contains 方法判斷某個物件是否存在時,它可能會誤判。但是布隆過濾器也不是特別不精確,只要引數設定的合理,它的精確度可以控制的相對足夠精確,只會有小小的誤判概率 布隆過濾器基本使用 布隆過濾器有二個基本指令,b...

redis之布隆過濾器

參考 背景 布隆過濾器主要應用在redis快取穿透的場景中 大量查詢不存在的key,redis中不存在,就會將請求打到mysql之類的磁碟儲存裝置中,導致系統崩潰 快取穿透的解決方法 1.在redis中快取空值,就是將空的key也快取到redis中,但是會占用空間 2.使用布隆過濾器,將全部的有效資...