中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解

發布時間:2021-11-25 21:41:10 來源:億速云 閱讀:253 作者:柒染 欄目:開發技術

如何理解,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

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

       如果想要判斷一個元素是不是在一個集合里,一般想到的是將所有元素保存起來,然后通過比較確定。鏈表,樹等等數據結構都是這種思路. 但是隨著集合中元素的增加,我們需要的存儲空間越來越大,檢索速度也越來越慢(O(n),O(logn))。不過世界上還有一種叫作散列表(又叫哈希表,Hash table)的數據結構。它可以通過一個Hash函數將一個元素映射成一個位陣列(Bit array)中的一個點。這樣一來,我們只要看看這個點是不是1就可以知道集合中有沒有它了。這就是布隆過濾器的基本思想。【詳見百度百科】

     總的來說:布隆過濾器就是利用哈希算法+位圖實現的。

    所以布隆過濾器的底層我們就用一個位圖封裝。

     對哈希算法不熟悉的可以看博主博客http://helloleex.blog.51cto.com/10728491/1770568

     如果對位圖不太熟悉的可以查看博主的博客http://helloleex.blog.51cto.com/10728491/1772827

#pragma once
#include<string>
#include"Bit_Map.h"
#include"HashFunc.h"
using namespace std;

//5個哈希函數的仿函數
template<class K = string,
class HashFunc1 = _HashFunc1<K>,
class HashFunc2 = _HashFunc2<K>,
class HashFunc3 = _HashFunc3<K>, 
class HashFunc4 = _HashFunc4<K>, 
class HashFunc5 = _HashFunc5<K>>
class BloomFilter
{
public:
	BloomFilter(size_t size)
	{
		//size_t newsize = _GetNextPrime(size);
		//_capacity = newsize;
		//size不一定是素數,在素數表中取一個素數開一個素數大的空間
		_capacity = _bm.Resize(size);
	}
	void Set(const K& key)
	{
		size_t index1 = HashFunc1()(key);
		size_t index2 = HashFunc2()(key);
		size_t index3 = HashFunc3()(key);
		size_t index4 = HashFunc4()(key);
		size_t index5 = HashFunc5()(key);
		_bm.Set(index1);
		_bm.Set(index2);
		_bm.Set(index3);
		_bm.Set(index4);
		_bm.Set(index5);
	}

	//布隆過濾器不能執行刪除操作,因為有不同的哈希算法,可能不同的key
	//標記在相同的位上,刪除會把別人的記錄給刪除了,影響正確性。
	//void Reset(const K& key);

	//測試存在不一定存在,不存在一定不存在
	bool Test(const K& key)
	{
		size_t index1 = HashFunc1()(key);
		size_t index2 = HashFunc2()(key);
		size_t index3 = HashFunc3()(key);
		size_t index4 = HashFunc4()(key);
		size_t index5 = HashFunc5()(key);
		if (_bm.Test(index1) || _bm.Test(index2) ||
			_bm.Test(index3) || _bm.Test(index4) ||
			_bm.Test(index5))
			return true;
		else
			return false;
	}
protected:
	BitMap _bm;
	size_t _capacity;
};
HashFunc.h
//5個高效的哈希算法,都是大神發明的。
#pragma once
template<class T>
//BKDR Hash Function是一種簡單快捷的hash算法,
//也是Java目前采用的字符串的Hash算法(累乘因子為31)
struct _HashFunc1
{
	size_t operator()(const T& str)
	{
		register size_t hash = 0;
		const char* tmp = str.c_str();
		while (size_t ch = (size_t)*tmp++)
		{
			hash = hash * 131 + ch;
		}
		return hash;
	}
};
template<class T>
//RS Hash Function。因Robert Sedgwicks在其《Algorithms in C》一書中展示而得名。
struct _HashFunc2
{
	size_t operator()(const T& str)
	{
		register size_t hash = 0;
		size_t magic = 63689;
		const char* tmp = str.c_str();
		while (size_t ch = (size_t)*tmp++)
		{
			hash = hash * magic + ch;
			magic *= 378551;
		}
		return hash;
	}
}; template<class T>
//AP Hash Function 由Arash Partow發明的一種hash算法。
struct _HashFunc3
{
	size_t operator()(const T& str)
	{
		register size_t hash = 0;
		size_t ch;
		const char* tmp = str.c_str();
		for (long i = 0; ch = (size_t)*tmp++; i++)
		{
			if ((i & 1) == 0)
			{
				hash ^= ((hash << 7) ^ ch ^ (hash >> 3));
			}
			else
			{
				hash ^= (~((hash << 11) ^ ch ^ (hash >> 5)));
			}
		}
		return hash;
	}
}; 

template<class T>
// DJB Hash Function 2。由Daniel J. Bernstein 發明的另一種hash算法。
struct _HashFunc4
{
	size_t operator()(const T& str)
	{
		const char* tmp = str.c_str();
		if (!*tmp)   // 這是由本人添加,以保證空字符串返回哈希值0  
			return 0;
		register size_t hash = 5381;
		while (size_t ch = (size_t)*tmp++)
		{
			hash = hash * 33 ^ ch;
		}
		return hash;
	}
}; 

template<class T>
//JS Hash Function 。由Justin Sobel發明的一種hash算法。
struct _HashFunc5
{
	size_t operator()(const T& str)
	{
		const char* tmp = str.c_str();
		if (!*tmp)        // 這是由本人添加,以保證空字符串返回哈希值0  
			return 0;
		register size_t hash = 1315423911;
		while (size_t ch = (size_t)*tmp++)
		{
			hash ^= ((hash << 5) + ch + (hash >> 2));
		}
		return hash;
	}
};

    布隆過濾器是有誤識別率的,雖然幾率很低很低,但是如果5個哈希函數其中有一兩個誤識別了,就會出現錯誤。

     而且布隆過濾器是不支持刪除Reset的。因為有很幾率會刪除其他哈希函數所標識的記錄,誤識別幾率大大增高。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鄂尔多斯市| 甘肃省| 公主岭市| 铁力市| 弋阳县| 婺源县| 五华县| 泗水县| 濮阳市| 奈曼旗| 普定县| 金华市| 海南省| 鹿泉市| 福安市| 丹凤县| 彩票| 缙云县| 宁陵县| 丹寨县| 札达县| 澜沧| 山西省| 浙江省| 肇州县| 扎兰屯市| 洪泽县| 合肥市| 铁岭县| 扬州市| 阳泉市| 大姚县| 菏泽市| 涟水县| 翁牛特旗| 雷波县| 五大连池市| 东丽区| 晴隆县| 永济市| 会同县|