国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

位圖以及布隆過濾器

這篇具有很好參考價(jià)值的文章主要介紹了位圖以及布隆過濾器。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

本文主要講解哈希思想的實(shí)際應(yīng)用,位圖和布隆過濾器。

位圖

講解位圖之前我們先來解答這樣一道騰訊的面試題

給40億個(gè)不重復(fù)的無(wú)符號(hào)整數(shù),沒排過序。給一個(gè)無(wú)符號(hào)整數(shù),如何快速判斷一個(gè)數(shù)是否在這40億個(gè)數(shù)中?!掘v訊】

很多人立馬就想到了用哈希表或者紅黑樹,因?yàn)樽銐蚩?,特別是哈希表,它的查詢速度到達(dá)了O(1),想法是非常好的,但是我們可以仔細(xì)思考一下,這樣真的可行嗎?
答案是不現(xiàn)實(shí),因?yàn)檫@是四十億個(gè)整數(shù),如果要全部寫入到內(nèi)存中,需要16GB大小的空間,并不是所有的計(jì)算機(jī)都能裝下這些數(shù)據(jù),換而言之,就算能完全裝下,用這么大的空間去解決這個(gè)問題,也是不太好的,面試官也不會(huì)滿意。

所以這個(gè)時(shí)候就引入了位圖,我們可以想一想,這個(gè)問題只是讓我們求解一個(gè)整數(shù)在或者不在,這兩種狀態(tài),我們只需要用一個(gè)bit位就可以標(biāo)記,例如1代表在,0代表不在。再配合哈希的映射思想,就產(chǎn)生了位圖這個(gè)數(shù)據(jù)結(jié)構(gòu)。如果不了解哈希,可以看看我之前的文章,我進(jìn)行了很詳細(xì)的講解,我把鏈接貼在這里:哈希。

可以先看一下位圖的結(jié)構(gòu)和代碼是怎么實(shí)現(xiàn)的
位圖以及布隆過濾器

template<size_t N>
	class bitset {
	private:
		vector<char> bits;
	public:
		bitset()
		{
			bits.resize(N / 8,0);
		}
		//設(shè)置對(duì)應(yīng)bit位
		void set(size_t x)
		{

			size_t i = x / 8;
			size_t j = x % 8;

			bits[i] |= (1 << j);
		}
		//重置對(duì)應(yīng)數(shù)值bit位
		void reset(size_t x)
		{
			size_t i = x / 8;
			size_t j = x % 8;

			bits[i] &= ~(1 << j);
		}
		//是否存在
		bool test(size_t x)
		{
			size_t i = x / 8;
			size_t j = x % 8;

			return bits[i] & (1 << j);
		}
	};

其實(shí)再C++庫(kù)中是有位圖結(jié)構(gòu)的:bitset

布隆過濾器

上面的位圖結(jié)構(gòu)能很便捷的記錄整數(shù)在或者不在,那么布隆過濾器是什么呢?

布隆過濾器(Bloom Filter)是一種空間效率非常高的隨機(jī)數(shù)據(jù)結(jié)構(gòu),用于判斷一個(gè)元素是否可能存在于一個(gè)集合中。布隆過濾器可以在時(shí)間和空間上做到很高效,但是會(huì)有一定的誤判率。
布隆過濾器的核心是一個(gè)位數(shù)組和一組哈希函數(shù)。假設(shè)位數(shù)組的長(zhǎng)度是 m,有 k 個(gè)哈希函數(shù),則每個(gè)元素經(jīng)過 k 次哈希函數(shù)得到 k 個(gè)哈希值,將這 k 個(gè)值對(duì) m 取模,得到 k 個(gè)位置,將這 k 個(gè)位置的值都設(shè)置為 1。當(dāng)要查詢一個(gè)元素時(shí),同樣地,將該元素經(jīng)過 k 次哈希函數(shù)得到 k 個(gè)哈希值,查詢這 k 個(gè)位置的值是否都為 1,如果都為 1,則說明該元素可能存在于集合中,如果有任何一個(gè)位置的值為 0,則說明該元素一定不存在于集合中。
布隆過濾器的優(yōu)點(diǎn)在于,它可以很高效地判斷一個(gè)元素是否存在于一個(gè)集合中,而且空間效率非常高,因?yàn)樗恍枰褂靡粋€(gè)位數(shù)組和一組哈希函數(shù)即可。但它的缺點(diǎn)在于,存在一定的誤判率,也就是說,有可能某個(gè)元素不在集合中,但是經(jīng)過判斷后,布隆過濾器認(rèn)為它存在于集合中。

簡(jiǎn)單來說就是一個(gè)元素通過K個(gè)哈希函數(shù)映射K個(gè)bit位,布隆過濾器如果說某個(gè)元素不存在時(shí),該元素一定不存在,如果該元素存在時(shí),該元素可能存在,因?yàn)橛行┕:瘮?shù)存在一定的誤判。
位圖以及布隆過濾器

布隆過濾器實(shí)現(xiàn)代碼:

struct BKDRHash
	{
		size_t operator()(const string& s)
		{
			size_t hash = 0;
			for (auto ch : s)
			{
				hash += ch;
				hash *= 31;
			}

			return hash;
		}
	};
	struct APHash
	{
		size_t operator()(const string& s)
		{
			size_t hash = 0;
			for (long i = 0; i < s.size(); i++)
			{
				size_t ch = s[i];
				if ((i & 1) == 0)
				{
					hash ^= ((hash << 7) ^ ch ^ (hash >> 3));
				}
				else
				{
					hash ^= (~((hash << 11) ^ ch ^ (hash >> 5)));
				}
			}
			return hash;
		}
	};
	struct DJBHash
	{
		size_t operator()(const string& s)
		{
			size_t hash = 5381;
			for (auto ch : s)
			{
				hash += (hash << 5) + ch;
			}
			return hash;
		}
	};
	template<size_t N,
	class K = string,
	class Hash1 = BKDRHash,
	class Hash2 = APHash,
	class Hash3 = DJBHash>
	class BloomFilter {

	private:
			static const size_t _X = 6;
			bitmap<N* _X> bts;
			size_t len = N * _X;
	public:

		void set(const K& key)
		{
			size_t hash1 = BKDRHash()(key) % len;
			bts.set(hash1);
			
			size_t hash2 = APHash()(key) % len;
			bts.set(hash2);

			size_t hash3 = DJBHash()(key) % len;
			bts.set(hash3);
		}
		bool test(const K& key)
		{
			if (!bts.test(BKDRHash()(key) % len))
			{
				return false;
			}
			if (!bts.test(APHash()(key) % len))
			{
				return false;
			}
			if (!bts.test(DJBHash()(key) % len))
			{
				return false;
			}
			return true;
		}
	};

布隆過濾器使用的哈希函數(shù)越多誤判率越低,但是占用的空間也就越大。用三個(gè)哈希函數(shù)是比較合適的。

這就是位圖和布隆過濾器的原理和實(shí)現(xiàn),如果對(duì)您有所幫助,點(diǎn)個(gè)贊和關(guān)注吧!文章來源地址http://www.zghlxwxcb.cn/news/detail-482897.html

到了這里,關(guān)于位圖以及布隆過濾器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【C++】哈希位圖和布隆過濾器

    【C++】哈希位圖和布隆過濾器

    哈希位圖和布隆過濾器都是常用的概率數(shù)據(jù)結(jié)構(gòu),用于高效地判斷一個(gè)元素是否存在于一個(gè)集合當(dāng)中,但它們?cè)趯?shí)現(xiàn)方法和各自的優(yōu)缺點(diǎn)上有所區(qū)別。 哈希位圖 哈希位圖(Hash Bitmap)是由一個(gè)位數(shù)組構(gòu)成,每個(gè)元素(通常是一個(gè)整數(shù))被映射到位數(shù)組中的某個(gè)位置。對(duì)于集合

    2024年02月08日
    瀏覽(25)
  • 哈希的應(yīng)用--位圖和布隆過濾器

    哈希的應(yīng)用--位圖和布隆過濾器

    位圖(Bitset)是一種數(shù)據(jù)結(jié)構(gòu),用于表示一組布爾值,其中每個(gè)元素通常對(duì)應(yīng)于一個(gè)位或一個(gè)二進(jìn)制值,可以存儲(chǔ)0或1。位圖在計(jì)算機(jī)科學(xué)和計(jì)算機(jī)工程中經(jīng)常用于各種應(yīng)用,特別是在位級(jí)別的標(biāo)志、掩碼和快速查找中。以下是位圖的一些關(guān)鍵特點(diǎn): 二進(jìn)制表示 :位圖中的每

    2024年02月08日
    瀏覽(32)
  • [C++]哈希應(yīng)用之位圖&布隆過濾器

    [C++]哈希應(yīng)用之位圖&布隆過濾器

    ? ? ? ? ?? 主廚:邪王真眼 主廚的主頁(yè):Chef‘s blog?? 所屬專欄:c++大冒險(xiǎn) ? ? ? ?我們之前學(xué)習(xí)了哈希表,哈希表通過映射關(guān)系,實(shí)現(xiàn)了O(1)的復(fù)雜度來查找數(shù)據(jù),哈希在實(shí)踐中是一個(gè)非常重要的思想,今天要學(xué)習(xí)的就是哈希思想的兩大應(yīng)用:位圖與布隆過濾器 給 40 億個(gè)

    2024年04月15日
    瀏覽(36)
  • 【C++】哈希應(yīng)用:位圖 哈希切分 布隆過濾器

    【C++】哈希應(yīng)用:位圖 哈希切分 布隆過濾器

    我走后,他們會(huì)給你們加班費(fèi),會(huì)給你們調(diào)休,這并不是他們變好了,而是因?yàn)槲襾磉^。------龍哥 1. 大廠經(jīng)典的面試題,給你40億個(gè)不重復(fù)的無(wú)符號(hào)整數(shù),讓你快速判斷一個(gè)數(shù)是否在這40億個(gè)數(shù)中,最直接的思路就是遍歷這40億個(gè)整數(shù),逐一進(jìn)行比對(duì),當(dāng)然這種方式可以倒是可

    2023年04月09日
    瀏覽(26)
  • C++【位圖/布隆過濾器—海量數(shù)據(jù)處理】

    C++【位圖/布隆過濾器—海量數(shù)據(jù)處理】

    先看下面的一道題 : 1.有40億個(gè)不重復(fù)的無(wú)符號(hào)整數(shù),無(wú)序。給一個(gè)無(wú)符號(hào)整數(shù),如何快速判斷一個(gè)數(shù)是否在這40億個(gè)數(shù)中。 如果我們放到哈希表或紅黑樹中或用排序和二分查找這兩種方法。 前兩種方法不可行,因?yàn)?0億個(gè)整數(shù)占用大約16G的內(nèi)存空間,第一要排序需要先把數(shù)

    2024年02月09日
    瀏覽(23)
  • 【C++】位圖/布隆過濾器+海量數(shù)據(jù)處理

    【C++】位圖/布隆過濾器+海量數(shù)據(jù)處理

    ? 作者 : 阿潤(rùn)菜菜 ?? 專欄 : C++ 題目 給40億個(gè)不重復(fù)的無(wú)符號(hào)整數(shù),沒排過序。給一個(gè)無(wú)符號(hào)整數(shù),如何快速判斷一個(gè)數(shù)是否在這40億個(gè)數(shù)中。 大多數(shù)人上來會(huì)想到這兩種方法:1. 遍歷,時(shí)間復(fù)雜度O(N)2. 排序(O(NlogN)),利用二分查找: logN 但是第一種效率太低了,需要一個(gè)

    2024年02月06日
    瀏覽(27)
  • C++ 哈希思想應(yīng)用:位圖,布隆過濾器,哈希切分

    C++ 哈希思想應(yīng)用:位圖,布隆過濾器,哈希切分

    1.問題 給你40億個(gè)不重復(fù)的無(wú)符號(hào)整數(shù),沒排過序.給一個(gè)無(wú)符號(hào)整數(shù),如何快速判斷一個(gè)數(shù)是否在這40億個(gè)數(shù)中? 2.分析 1 Byte = 8 bit 1KB = 1024 Byte 1MB = 1024KB = 1024 1024 大約= 10的6次方Byte 1GB = 1024MB = 1024 10的6次方 大約= 10的9次方Byte = 10億字節(jié) 因此4GB 約等于40億字節(jié) 其實(shí)最快的方式就是

    2024年04月17日
    瀏覽(41)
  • 【C++學(xué)習(xí)】哈希的應(yīng)用—位圖與布隆過濾器

    【C++學(xué)習(xí)】哈希的應(yīng)用—位圖與布隆過濾器

    文章簡(jiǎn)介 : 在這篇文章中,你會(huì)學(xué)習(xí)到關(guān)于哈希思想的最常見的兩個(gè)應(yīng)用,也就是 位圖 與 布隆過濾器 , 文章會(huì)講解位圖和布隆過濾器的概念,底層實(shí)現(xiàn),對(duì)應(yīng)的適應(yīng)的場(chǎng)景,以及相關(guān)經(jīng)典 海量數(shù)據(jù)面試題 及解析。 所謂位圖,就是用每一位來存放某種狀態(tài),適用于 海量

    2024年04月14日
    瀏覽(51)
  • 哈希與位圖的結(jié)合--布隆過濾器與哈希切分

    哈希與位圖的結(jié)合--布隆過濾器與哈希切分

    上一章講了位圖,我們知道了在海量數(shù)據(jù)中查找一個(gè)數(shù)是否存在,可以用每一個(gè)比特位標(biāo)識(shí)。 但是位圖只能處理整數(shù),要是字符串或者其它的呢,位圖便無(wú)法處理了,這個(gè)時(shí)候便需要用到布隆過濾器了. 目錄 布隆過濾器提出 布隆過濾器概念 布隆過濾器的實(shí)現(xiàn)以及最優(yōu)值 ?哈

    2024年02月12日
    瀏覽(25)
  • 【C++高階(六)】哈希的應(yīng)用--位圖&布隆過濾器

    【C++高階(六)】哈希的應(yīng)用--位圖&布隆過濾器

    ??博主CSDN主頁(yè):杭電碼農(nóng)-NEO?? ? ?專欄分類:C++從入門到精通? ? ??代碼倉(cāng)庫(kù):NEO的學(xué)習(xí)日記?? ? ??關(guān)注我??帶你學(xué)習(xí)C++ ? ???? 哈希最常用的應(yīng)用是unordered 系列的容器,但是當(dāng)面對(duì)海量數(shù)據(jù) 如100億個(gè)數(shù)據(jù)中找有沒有100這 個(gè)數(shù)時(shí),使用無(wú)序容器的話內(nèi)存放不下 所以哈希

    2024年02月05日
    瀏覽(37)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包