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

哈希思想應(yīng)用【C++】(位圖,布隆過(guò)濾器,海量數(shù)據(jù)處理面試題)

這篇具有很好參考價(jià)值的文章主要介紹了哈希思想應(yīng)用【C++】(位圖,布隆過(guò)濾器,海量數(shù)據(jù)處理面試題)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

??

目錄

一,位圖

1. 位圖概念

2.實(shí)現(xiàn)

3. 測(cè)試題

位圖的優(yōu)缺點(diǎn)

二,布隆過(guò)濾器

1). 布隆過(guò)濾器提出

2). 概念

3). 布隆過(guò)濾器的查找

4). 布隆過(guò)濾器刪除(了解)

5). 布隆過(guò)濾器優(yōu)點(diǎn)

6).?布隆過(guò)濾器缺陷

三,海量數(shù)據(jù)面試題

1)哈希切割


哈希思想應(yīng)用【C++】(位圖,布隆過(guò)濾器,海量數(shù)據(jù)處理面試題),哈希算法,算法,c++,數(shù)據(jù)結(jié)構(gòu),面試,開(kāi)發(fā)語(yǔ)言

一,位圖

我們首先由一道面試題來(lái)理解位圖

給40億個(gè)不重復(fù)的無(wú)符號(hào)整數(shù),沒(méi)排過(guò)序。給一個(gè)無(wú)符號(hào)整數(shù),如何快速判斷一個(gè)數(shù)是否在
這40億個(gè)數(shù)中?!掘v訊】
1. 遍歷,時(shí)間復(fù)雜度O(N)
2. 排序(O(NlogN)),利用二分查找: logN
3. 位圖解決
數(shù)據(jù)是否在給定的整形數(shù)據(jù)中,結(jié)果是在或者不在,剛好是兩種狀態(tài),那么可以使用一個(gè)二進(jìn)制比特位來(lái)代表數(shù)據(jù)是否存在的信息,如果二進(jìn)制比特位為1,代表存在,為0
代表不存在。比如:

哈希思想應(yīng)用【C++】(位圖,布隆過(guò)濾器,海量數(shù)據(jù)處理面試題),哈希算法,算法,c++,數(shù)據(jù)結(jié)構(gòu),面試,開(kāi)發(fā)語(yǔ)言

40億無(wú)符號(hào)整形,我們知道1G大概是10億個(gè)字節(jié),也就是說(shuō)起碼 16G數(shù)據(jù),排序,二分查找都需要在內(nèi)存下進(jìn)行,16G的內(nèi)存性價(jià)比著實(shí)有些低。而我們使用位圖的方法,用40億個(gè)比特位來(lái)表示這40億個(gè)數(shù)是否存在,大概就是要消耗 512MB(40億bit? ==? 5億字節(jié) == 512MB)的內(nèi)存。

注意:

哈希思想應(yīng)用【C++】(位圖,布隆過(guò)濾器,海量數(shù)據(jù)處理面試題),哈希算法,算法,c++,數(shù)據(jù)結(jié)構(gòu),面試,開(kāi)發(fā)語(yǔ)言

1. 位圖概念

所謂位圖,就是用每一位來(lái)存放某種狀態(tài),適用于海量數(shù)據(jù),數(shù)據(jù)無(wú)重復(fù)的場(chǎng)景。通常是用來(lái)判斷某個(gè)數(shù)據(jù)存不存在的。

2.實(shí)現(xiàn)

#include <iostream>
#include <vector>
using namespace std;

template < size_t N>
class bitset
{
public:
	bitset()
	{
		_bit.resize(N / 8 + 1, 0); // + 1防止有越界
	}

	// 映射的比特位設(shè)置為1
	void set(size_t x)
	{
		size_t spa_bit = x / 8;
		size_t in_bit = x % 8;

		_bit[spa_bit] &= (1 << in_bit);
	}

    // 映射的比特位設(shè)置為0
	void reset(size_t x)
	{
		size_t spa_bit = x / 8;
		size_t in_bit = x % 8;
	}

    // 測(cè)試x,是否存在
	bool test(size_t x)
	{
		size_t spa_bit = x / 8;
		size_t in_bit = x % 8;
		return _bit[spa_bit] & (1 << in_bit);
		// 返回0: 則不存在
		// 返回一個(gè)很大的數(shù):存在
	}

private:
	vector<char> _bit;
};

測(cè)試案例:

哈希思想應(yīng)用【C++】(位圖,布隆過(guò)濾器,海量數(shù)據(jù)處理面試題),哈希算法,算法,c++,數(shù)據(jù)結(jié)構(gòu),面試,開(kāi)發(fā)語(yǔ)言

?再回到題目,我們知道有40億個(gè)數(shù),我們知道這只是數(shù)量,不是范圍,所以,我們盡量開(kāi)到無(wú)符號(hào)的最大值,在開(kāi)大小的時(shí)候我們可以這么來(lái)設(shè)置:

bitset<-1>? st? 或者? bitset<0xffffffff> st;

3. 測(cè)試題

1. 給定100億個(gè)整數(shù),設(shè)計(jì)算法找到只出現(xiàn)一次的整數(shù)?
思路:用兩個(gè)位圖存儲(chǔ), 用 00,? 01,? 10表示0次,1次,兩次及兩次這三種情況。
位圖一儲(chǔ)存第一位
位圖二儲(chǔ)存第二位
template <size_t N>
class two_set
{
public:
	void set(size_t x)
	{
		if (st1.test(x) == false
			&& st2.test(x) == false)
		{// 00 -> 01 情況
			st2.set(x);
		}
		else if (st1.test(x) == false
			&& st2.test(x) == true)
		{// 01 -> 10 情況
			st1.set(x);
			st2.reset(x);
		}
	}
private:
	// 我們用 01,00,10 表示三種情況
	bitset<N> st1; // 記錄第一位 
	bitset<N> st2; // 記錄第二位
};
2. 給兩個(gè)文件,分別有100億個(gè)整數(shù),我們只有1G內(nèi)存,如何找到兩個(gè)文件交集?
方法一:
兩個(gè)文件用兩個(gè)位圖存儲(chǔ),然后依次比較兩個(gè)位圖之間,42億次數(shù)據(jù)即可。
template <size_t N>
class cross_set
{
public:
	void set1(size_t x)
	{
		st1.set(x);
	}

	void set2(size_t x)
	{
		st2.set(x);
	}

	void test()
	{
		for (size_t i = 0; i < N; i++)
		{
			if (st1.test(i) && st2.test(i))
				cout << i << " ";
		}
	}

private:
	bitset<N> st1;
	bitset<N> st2;
};
方法二:
用一個(gè)位圖存儲(chǔ)一個(gè)文件的整數(shù),然后用第二個(gè)文件的數(shù)據(jù)來(lái)查找位圖,如果位圖中存在則是交集,同時(shí)查找完了的設(shè)置為0即可防止重復(fù)輸出交集。
class cross_set2
{
public:
	void set(size_t x )
	{
		st.set(x);
	}

	void test(size_t x)
	{
		if (st.test(x))
		{
			cout << x << " ";
			st.reset(x); //第一次檢測(cè)完后設(shè)置為0
		}
	}
private:
	bitset<N> st;
};
3. 位圖應(yīng)用變形:1個(gè)文件有100億個(gè)int,1G內(nèi)存,設(shè)計(jì)算法找到出現(xiàn)次數(shù)不超過(guò)2次的所有整數(shù)

思想:還是用2個(gè)位圖,用 00 , 01, 10, 11 表示這四種狀態(tài),跟第1題類(lèi)似。

位圖的優(yōu)缺點(diǎn)

優(yōu)點(diǎn):速度快,節(jié)省空間。

缺點(diǎn):只映射整型,像浮點(diǎn)數(shù),string等類(lèi)不能作為存儲(chǔ),進(jìn)行映射。

二,布隆過(guò)濾器

1). 布隆過(guò)濾器提出

我們?cè)谑褂眯侣効蛻舳丝葱侣剷r(shí),它會(huì)給我們不停地推薦新的內(nèi)容,它每次推薦時(shí)要去重,去掉 那些已經(jīng)看過(guò)的內(nèi)容。問(wèn)題來(lái)了,新聞客戶端推薦系統(tǒng)如何實(shí)現(xiàn)推送去重的? 用服務(wù)器記錄了用戶看過(guò)的所有歷史記錄,當(dāng)推薦系統(tǒng)推薦新聞時(shí)會(huì)從每個(gè)用戶的歷史記錄里進(jìn)行篩選,過(guò)濾掉那些已經(jīng)存在的記錄。 如何快速查找呢?
1. 用哈希表存儲(chǔ)用戶記錄,缺點(diǎn):浪費(fèi)空間
2. 用位圖存儲(chǔ)用戶記錄,缺點(diǎn):位圖一般只能處理整形,如果內(nèi)容編號(hào)是字符串,就無(wú)法處理了。
3. 將哈希與位圖結(jié)合,即布隆過(guò)濾器。

2). 概念

布隆過(guò)濾器是由布隆(Burton Howard Bloom)在1970年提出的 一種緊湊型的、比較巧妙的 率型數(shù)據(jù)結(jié)構(gòu),特點(diǎn)是 高效地插入和查詢,可以用來(lái)告訴你 “某樣?xùn)|西一定不存在或者可能存 在”,它是用多個(gè)哈希函數(shù),將一個(gè)數(shù)據(jù)映射到位圖結(jié)構(gòu)中。此種方式 不僅可以提升查詢效率,也 可以節(jié)省大量的內(nèi)存空間

哈希思想應(yīng)用【C++】(位圖,布隆過(guò)濾器,海量數(shù)據(jù)處理面試題),哈希算法,算法,c++,數(shù)據(jù)結(jié)構(gòu),面試,開(kāi)發(fā)語(yǔ)言

哈希的詳細(xì)知識(shí)點(diǎn),請(qǐng)查看本篇文章:?詳解布隆過(guò)濾器的原理,使用場(chǎng)景和注意事項(xiàng) - 知乎 (zhihu.com)

哈希思想應(yīng)用【C++】(位圖,布隆過(guò)濾器,海量數(shù)據(jù)處理面試題),哈希算法,算法,c++,數(shù)據(jù)結(jié)構(gòu),面試,開(kāi)發(fā)語(yǔ)言
上面博客里面的這張圖也展示其中效率與哈希函數(shù)個(gè)數(shù)的關(guān)系:
使用布隆過(guò)濾器,優(yōu)點(diǎn)之一是節(jié)省空間。雖然哈希函數(shù)個(gè)數(shù)越多,沖突的概率越低;但占用的平均內(nèi)存也會(huì)提高

然后就是當(dāng)我們的哈希函數(shù)為3時(shí),過(guò)濾器的長(zhǎng)度與插入個(gè)數(shù)的關(guān)系。(K是哈希函數(shù)個(gè)數(shù),m是長(zhǎng)度,n是插入個(gè)數(shù))

?哈希思想應(yīng)用【C++】(位圖,布隆過(guò)濾器,海量數(shù)據(jù)處理面試題),哈希算法,算法,c++,數(shù)據(jù)結(jié)構(gòu),面試,開(kāi)發(fā)語(yǔ)言

根據(jù)里面提供的關(guān)系可以得出, 布隆過(guò)濾器長(zhǎng)度應(yīng)是插入個(gè)數(shù)的 5 倍

3). 布隆過(guò)濾器的查找

布隆過(guò)濾器的思想是將一個(gè)元素用多個(gè)哈希函數(shù)映射到一個(gè)位圖中,因此被映射到的位置的比特位一定為1。所以可以按照以下方式進(jìn)行查找: 分別計(jì)算每個(gè)哈希值對(duì)應(yīng)的比特位置存儲(chǔ)的是否為零,只要有一個(gè)為零,代表該元素一定不在哈希表中,否則可能在哈希表中
注意:布隆過(guò)濾器如果說(shuō)某個(gè)元素不存在時(shí),該元素一定不存在,如果該元素存在時(shí),該元素可能存在,因?yàn)橛行┕:瘮?shù)存在一定的誤判。
比如:在布隆過(guò)濾器中查找"alibaba"時(shí),假設(shè)3個(gè)哈希函數(shù)計(jì)算的哈希值為:1、3、7,剛好和其他元素的比特位重疊,此時(shí)布隆過(guò)濾器告訴該元素存在,但實(shí)該元素是不存在的。
哈希思想應(yīng)用【C++】(位圖,布隆過(guò)濾器,海量數(shù)據(jù)處理面試題),哈希算法,算法,c++,數(shù)據(jù)結(jié)構(gòu),面試,開(kāi)發(fā)語(yǔ)言

4). 布隆過(guò)濾器刪除(了解)

布隆過(guò)濾器不能直接支持刪除工作,因?yàn)樵趧h除一個(gè)元素時(shí),可能會(huì)影響其他元素。
比如:刪除上圖中"tencent"元素,如果直接將該元素所對(duì)應(yīng)的二進(jìn)制比特位置0,“baidu”元素也被刪除了,因?yàn)檫@兩個(gè)元素在多個(gè)哈希函數(shù)計(jì)算出的比特位上剛好有重疊。
一種支持刪除的方法:將布隆過(guò)濾器中的每個(gè)比特位擴(kuò)展成一個(gè)小的計(jì)數(shù)器,插入元素時(shí)給k個(gè)計(jì)數(shù)器(k個(gè)哈希函數(shù)計(jì)算出的哈希地址)加一,刪除元素時(shí),給k個(gè)計(jì)數(shù)器減一,通過(guò)多占用幾倍存儲(chǔ)空間的代價(jià)來(lái)增加刪除操作。
缺陷:
1. 無(wú)法確認(rèn)元素是否真正在布隆過(guò)濾器中
2. 存在計(jì)數(shù)回繞

關(guān)于哈希函數(shù)的選擇,我們參考這篇大佬hash函數(shù)算法博客的推薦:各種字符串Hash函數(shù) - clq - 博客園 (cnblogs.com)

// 三個(gè)哈希函數(shù)

struct APHash
{
	size_t operator()(const string& str)
	{
		size_t hash = 0;
		for (long i = 0; i < str.size(); i++)
		{
			size_t ch = str[i];
			if ((i & 1) == 0)
			{
				hash ^= ((hash << 7) ^ ch ^ (hash >> 3));
			}
			else
			{
				hash ^= (~((hash << 11) ^ ch ^ (hash >> 5)));
			}
		}
		return hash; 
	}
};

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

struct DJBHash
{
	size_t operator()(const string& str)
	{
		if (!str[0])   // 這是由本人添加,以保證空字符串返回哈希值0  
			return 0;
		size_t hash = 5381;
		for (auto e : str)
		{
			size_t ch = size_t(e);
			hash += (hash << 5) + ch;
		}
		return hash;
	}
};

template <size_t N, class K = string,
class Hash1 = BKDRHash,
class Hash2 = APHash,
class Hash3 = DJBHash>
class bloom_set
{
public:
	// 插入
	void set(const string&  str)
	{
		Hash1 hash1;
		size_t len = N * time;
		st.set(hash1(str) % len);

		Hash2 hash2;
		st.set(hash2(str) % len);

		Hash3 hash3;
		st.set(hash3(str) % len);
	}

	// 判斷是否存在
	// 1. 如果其中一個(gè)不存在,那么一定不存在
	// 2. 如果三位置都存在,那么可能存在,需要確認(rèn)
	bool test(const string& str)
	{
		Hash1 hash1;
		Hash2 hash2;
		Hash3 hash3;
		size_t len = N * time;
		if (!st.test(hash1(str) % len))
			return false;

		if (!st.test(hash2(str) % len))
			return false;

		if (!st.test(hash3(str) % len))
			return false;

		return true; // 都存在,那可能存在
	}
private:

	static const size_t time = 5;  // 過(guò)濾器長(zhǎng)度與插入個(gè)數(shù)關(guān)系
	bitset < N * time > st;
};

5). 布隆過(guò)濾器優(yōu)點(diǎn)

1. 增加和查詢?cè)氐臅r(shí)間復(fù)雜度為:O(K), (K為哈希函數(shù)的個(gè)數(shù),一般比較小),與數(shù)據(jù)量大小無(wú)關(guān)。
2. 哈希函數(shù)相互之間沒(méi)有關(guān)系,方便硬件并行運(yùn)算。
3. 布隆過(guò)濾器不需要存儲(chǔ)元素本身,在某些對(duì)保密要求比較嚴(yán)格的場(chǎng)合有很大優(yōu)勢(shì)。
4. 在能夠承受一定的誤判時(shí),布隆過(guò)濾器比其他數(shù)據(jù)結(jié)構(gòu)有這很大的空間優(yōu)勢(shì)。
5. 數(shù)據(jù)量很大時(shí),布隆過(guò)濾器可以表示全集,其他數(shù)據(jù)結(jié)構(gòu)不能。
6. 使用同一組散列函數(shù)的布隆過(guò)濾器可以進(jìn)行交、并、差運(yùn)算。

6).?布隆過(guò)濾器缺陷

1. 有誤判率,即存在假陽(yáng)性(False Position),即不能準(zhǔn)確判斷元素是否在集合中。(補(bǔ)救方法:再建立一個(gè)白名單,存儲(chǔ)可能會(huì)誤判的數(shù)據(jù))
2. 不能獲取元素本身。
3. 一般情況下不能從布隆過(guò)濾器中刪除元素。
4. 如果采用計(jì)數(shù)方式刪除,可能會(huì)存在計(jì)數(shù)回繞問(wèn)題。

三,海量數(shù)據(jù)面試題

1)哈希切割

例1. 給兩個(gè)文件,分別有100億個(gè)query,我們只有1G內(nèi)存,如何找到兩個(gè)文件交集?分別給出精確算法?
精確算法:
分析:query可以理解為一個(gè)字符串,100億個(gè)字符串,假設(shè)一個(gè)query的平均長(zhǎng)度為50byte, 也就是差不多5000億byte(500G)每個(gè)文件,裝入內(nèi)存是不可能的。我們采取的方法是:
1. 分成多份 。 將這500G的數(shù)據(jù)進(jìn)行切割,分成多份(本題我們分成1000份)
2. 兩個(gè)文件中的每個(gè)query經(jīng)過(guò)相同的哈希函數(shù)處理,進(jìn)入1000份中的其中一個(gè)文件。
3. 在經(jīng)過(guò)1000次比較兩組文件中相對(duì)應(yīng)的數(shù)據(jù),把結(jié)果填入一個(gè)文件中即可。
哈希思想應(yīng)用【C++】(位圖,布隆過(guò)濾器,海量數(shù)據(jù)處理面試題),哈希算法,算法,c++,數(shù)據(jù)結(jié)構(gòu),面試,開(kāi)發(fā)語(yǔ)言
哈希思想應(yīng)用【C++】(位圖,布隆過(guò)濾器,海量數(shù)據(jù)處理面試題),哈希算法,算法,c++,數(shù)據(jù)結(jié)構(gòu),面試,開(kāi)發(fā)語(yǔ)言
但我們?cè)谡嬲龑?shí)現(xiàn)的時(shí)候又會(huì)出現(xiàn)各種各樣的問(wèn)題,比如, 這兩個(gè)大問(wèn)題。
無(wú)法保證,每個(gè)文件的大小。
我們預(yù)計(jì)每個(gè)小文件500MB左右,但有時(shí)一個(gè)數(shù)據(jù)多重復(fù),因此會(huì)
假設(shè):B3被分到了3G,我們需要進(jìn)行對(duì)B3進(jìn)行再次切割,但B3的狀況我們會(huì)遇見(jiàn)兩種:
1. B3有一種query大量重復(fù),無(wú)法進(jìn)行切割。
2. B3中有大量不同,可以切割。
解決方案:
直接使用unordered_set/ set 來(lái)插入目標(biāo)小文件。
如果插入2.5G的內(nèi)存,一定會(huì)報(bào)內(nèi)存不足的問(wèn)題,而這個(gè)就是 情況2,出現(xiàn)這個(gè)我們可以更換哈希函數(shù),對(duì)小文件進(jìn)行再次進(jìn)行切割。
如果插入2.5G的內(nèi)存,沒(méi)有內(nèi)容不足的問(wèn)題,那么就是情況1。
例2:給一個(gè)超過(guò)100G大小的log file, log中存著IP地址, 只有1G的內(nèi)存,設(shè)計(jì)算法找到出現(xiàn)次數(shù)最多的IP地址?
本題跟上一題類(lèi)似:
1. 我們先將100G文件分成多份,假設(shè)分成100份,然后通過(guò)哈希函數(shù)進(jìn)行分類(lèi)寫(xiě)入小文件中。
2.?將小文件寫(xiě)入map / unordered_map中,如果寫(xiě)入成功,則選出出現(xiàn)最多的id,其余的數(shù)據(jù)clear。如果寫(xiě)入不成功(小文件過(guò)大),則換哈希函數(shù)再次切割,重復(fù)步驟2。
3. 到最后map中留下的數(shù)據(jù),插入vector進(jìn)行排序即可。

下期預(yù)告: C++11 !?。?/h3>

結(jié)語(yǔ)

? ?本小節(jié)就到這里了,感謝小伙伴的瀏覽,如果有什么建議,歡迎在評(píng)論區(qū)評(píng)論,如果給小伙伴帶來(lái)一些收獲請(qǐng)留下你的小贊,你的點(diǎn)贊和關(guān)注將會(huì)成為博主創(chuàng)作的動(dòng)力。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-756874.html

到了這里,關(guān)于哈希思想應(yīng)用【C++】(位圖,布隆過(guò)濾器,海量數(shù)據(jù)處理面試題)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(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++】哈希的應(yīng)用:位圖、哈希切分與布隆過(guò)濾器

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

    需要云服務(wù)器等云產(chǎn)品來(lái)學(xué)習(xí)Linux的同學(xué)可以移步/--騰訊云--/--阿里云--/--華為云--/官網(wǎng),輕量型云服務(wù)器低至112元/年,新用戶首次下單享超低折扣。 ? 目錄 一、位圖 1、位圖的概念 2、大廠面試題 2.1位圖應(yīng)用(騰訊) 2.2位圖應(yīng)用 3、位圖的優(yōu)缺點(diǎn) 二、哈希切分 三、布隆過(guò)濾

    2023年04月09日
    瀏覽(39)
  • 【C++高階(六)】哈希的應(yīng)用--位圖&布隆過(guò)濾器

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

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

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

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

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

    2024年04月14日
    瀏覽(51)
  • C++進(jìn)階--哈希的應(yīng)用之位圖和布隆過(guò)濾器

    C++進(jìn)階--哈希的應(yīng)用之位圖和布隆過(guò)濾器

    哈希是一種映射的思想。 先來(lái)看一道題:給40億個(gè)不重復(fù)的無(wú)符號(hào)整數(shù),沒(méi)排序過(guò)。給一個(gè)無(wú)符號(hào)整數(shù),如何 快速判斷 一個(gè)數(shù) 是否在 這40億個(gè)數(shù)中。 首先想到的解法可能有這幾種: 解法1 :遍歷40億個(gè)數(shù),O(N) 解法2 :先排序,快排O( N l o g 2 N Nlog_2N Nl o g 2 ? N ),再利

    2024年02月22日
    瀏覽(43)
  • C++哈希hash:位圖、布隆過(guò)濾器的實(shí)現(xiàn)及應(yīng)用

    C++哈希hash:位圖、布隆過(guò)濾器的實(shí)現(xiàn)及應(yīng)用

    所謂位圖,就是用每一位來(lái)存放某種狀態(tài),適用于海量數(shù)據(jù),數(shù)據(jù)無(wú)重復(fù)的場(chǎng)景。通常是用 來(lái)判斷某個(gè)數(shù)據(jù)存不存在的。 當(dāng)我們想查找某一個(gè)數(shù)據(jù)是否存在或者是否處于某種狀態(tài)時(shí),相比于直接對(duì)存放數(shù)據(jù)的容器進(jìn)行遍歷查找,與原存放數(shù)據(jù)的容器所建立映射關(guān)系的位圖來(lái)

    2024年04月11日
    瀏覽(36)
  • 【C++】哈希(位圖,布隆過(guò)濾器)

    【C++】哈希(位圖,布隆過(guò)濾器)

    今天的內(nèi)容是哈希的應(yīng)用:位圖和布隆過(guò)濾器 目錄 一、位圖 1.位圖概念 2.位圖的應(yīng)用 二、哈希切分 三、布隆過(guò)濾器 1.布隆過(guò)濾器的概念 2.布隆過(guò)濾器的應(yīng)用 四、總結(jié) ? 今天的內(nèi)容從一道面試題開(kāi)始引入: 給40億個(gè)不重復(fù)的無(wú)符號(hào)整數(shù),沒(méi)排過(guò)序。給一個(gè)無(wú)符號(hào)整數(shù),如何

    2024年02月01日
    瀏覽(28)
  • 【C++】哈希位圖和布隆過(guò)濾器

    【C++】哈希位圖和布隆過(guò)濾器

    哈希位圖和布隆過(guò)濾器都是常用的概率數(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日
    瀏覽(24)
  • 哈希的應(yīng)用--位圖和布隆過(guò)濾器

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

    位圖(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日
    瀏覽(31)
  • 【C++雜貨鋪】再談哈希算法:位圖 | 布隆過(guò)濾器 | 哈希切分

    【C++雜貨鋪】再談哈希算法:位圖 | 布隆過(guò)濾器 | 哈希切分

    給40億個(gè)不重復(fù)的無(wú)符號(hào)整數(shù),沒(méi)排過(guò)序。給一個(gè)無(wú)符號(hào)整數(shù),如何快速判斷一個(gè)數(shù)是否在這40億個(gè)數(shù)中。 解決方案 : 遍歷 :遍歷這40億個(gè)整數(shù),去判斷該數(shù)是否在這40億個(gè)整數(shù)中。時(shí)間復(fù)雜度是 O ( N ) O(N) O ( N ) 。 set :用 set 將這40億個(gè)整數(shù)存起來(lái),然后去判斷這個(gè)數(shù)是否在

    2024年02月08日
    瀏覽(30)
  • 【數(shù)據(jù)結(jié)構(gòu)】盤(pán)點(diǎn)那些經(jīng)典的 [哈希面試題]【哈希切割】【位圖應(yīng)用】【布隆過(guò)濾器】(10)

    【數(shù)據(jù)結(jié)構(gòu)】盤(pán)點(diǎn)那些經(jīng)典的 [哈希面試題]【哈希切割】【位圖應(yīng)用】【布隆過(guò)濾器】(10)

    前言 大家好吖,歡迎來(lái)到 YY 滴 數(shù)據(jù)結(jié)構(gòu) 系列 ,熱烈歡迎! 本章主要內(nèi)容面向接觸過(guò)C++的老鐵 主要內(nèi)容含: 歡迎訂閱 YY 滴C++專欄!更多干貨持續(xù)更新!以下是傳送門(mén)! YY的《C++》專欄 YY的《C++11》專欄 YY的《Linux》專欄 YY的《數(shù)據(jù)結(jié)構(gòu)》專欄 YY的《C語(yǔ)言基礎(chǔ)》專欄 YY的《

    2024年02月04日
    瀏覽(64)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包