細想我們這裡使用了兩個雜湊函式,那麼自然會有兩個雜湊位址。優點:可想而知,到我們有多個字串的時候,就有可能算出的雜湊位址中有乙個或者兩個與別的字串的雜湊位址相同,如果我們想要刪除乙個資料是,必須同時將這兩個雜湊位址置為0才算是刪除了這個資料,然而當雜湊位址與別的字串的雜湊位址重複的時候,如果將相應位置為0,也就意味著另外乙個資料也會受影響,所以我們這裡實現的布隆過濾器是不能進行刪除元素的。
空間效率高,查詢快速,布隆過濾器儲存空間和插入 / 查詢時間都是o(1)。缺點:雜湊函式相互之間沒有關係,方便由硬體並行實現。布隆過濾器不需要儲存元素本身,因為它所儲存的是它資料的狀態,在某些對保密要求非常嚴格的場合有優勢。
隨著存入的元素數量增加,誤算率也會增加。但是如果元素數量太少,則使用雜湊表就可以解決問題。**實現:
//bloom_filter.h檔案內容如下:
#pragma once
#include"bit_map.h"
//此處定義了布隆過濾器的雜湊函式
//把字串轉成下標
typedef uint64_t (*bloomhash)(const
char*);
#define bloomhashcount 2
#define bitmapmaxcapacity 1024
typedef struct bloomfilter
bloomfilter;
//初始化
void bloomfilterinit(bloomfilter *bf);
//銷毀
void bloomfilterdestroy(bloomfilter *bf);
//插入資料
void bloomfilterinsert(bloomfilter *bf,const
char *str);
//判斷某個字串是否存在
int bloomfilteri***ist(bloomfilter *bf,const
char *str);
#include
#include"bit_map.h"
#include"bloom_filter.h"
#include"bloom_hash.h"
//初始化
void bloomfilterinit(bloomfilter *bf)
//將bloom_filter中的點陣圖初始化
bitmapinit(&bf->bm,10000);
//初始化兩個雜湊函式
bf->bloom_hash[0] = sdbmhash;
bf->bloom_hash[1] = bkdrhash;
return;
}//銷毀
void bloomfilterdestroy(bloomfilter *bf)
//銷毀位圖
bitmapdestroy(&bf->bm);
//將兩個雜湊函式指向空
bf->bloom_hash[0] = null;
bf->bloom_hash[1] = null;
return;
}//插入資料
void bloomfilterinsert(bloomfilter *bf,const
char *str)
size_t i = 0;
for(;i < bloomhashcount;i++)
return;
}//判斷某個字串是否存在
int bloomfilteri***ist(bloomfilter *bf,const
char *str)
size_t i = 0;
for(;i < bloomhashcount;i++)
}//走到這說明兩個雜湊位址處的值均為1
//說明該資料就存在
return1;}
//測試一下
void test()
以下是布隆過濾器實現中用到的雜湊函式,網上也可以搜到
//.h標頭檔案內容如下:
#pragma once
#includesize_t sdbmhash(const
char *str);
size_t bkdrhash(const
char *str);
//.c函式實現內容如下:
#include"bloom_hash.h"
size_t sdbmhash(const
char *str)
return hash;
}size_t bkdrhash(const
char *str)
return hash;
}
布隆過濾器 雜湊切分
1.首先了解下什麼是布隆過濾器,它實際上是乙個很長的二進位制向量和一系列隨機對映函式。如果想要判斷乙個元素是不是在乙個集合裡,一般想到的是將所有元素儲存起來,然後通過比較確定。鍊錶,樹等等資料結構都是這種思路.但是隨著集合中元素的增加,我們需要的儲存空間越來越大,檢索速度也越來越慢 o n o lo...
布隆過濾器
布隆過濾器 bloom filter 是1970年由布隆提出的。它實際上是乙個很長的二進位制向量和一系列隨機對映函式。布隆過濾器可以用於檢索乙個元素是否在乙個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的演算法,缺點是有一定的誤識別率和刪除困難。如果想要判斷乙個元素是不是在乙個集合裡,一般想到...
布隆過濾器
布隆過濾器的概念 如果想要判斷乙個元素是不是在乙個集合裡,一般想到的是將所有元素儲存起來,然後通過比較確定。鍊錶,樹等等資料結構都是這種思路.但是隨著集合中元素的增加,我們需要的儲存空間越來越大,檢索速度也越來越慢 o n o logn 不過世界上還有一種叫作雜湊表 又叫 雜湊表,hash tabl...