最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中bitset位圖介紹及模擬實現(xiàn)

 更新時間:2023年07月10日 10:26:39   作者:清擾077  
位圖就是用每一位來存放某種狀態(tài),適用于海量數(shù)據(jù),本文就介紹一下C++中bitset位圖介紹及模擬實現(xiàn),具有一定的參考價值,感興趣的可以了解一下

位圖介紹

一、位圖的引入

先來看下邊一道面試題:

給40億個不重復的無符號整數(shù),沒排過序。給一個無符號整數(shù),如何快速判斷一個數(shù)是否在這40億個數(shù)中。

經過我們之前的學習,我們可能會有以下的思路:

  • 對這些數(shù)進行排序,再通過二分算法,查找這個數(shù)是否存在
  • 插入到unordered_set中,使用find函數(shù)查找是否存在

上述方法看起來還不錯,二分查找算法時間復雜度為logN,而插入到unordered_set中時間復雜度為O(N),而查找時時間復雜度為O(1),但是都有一個問題就是要將空間不足,40億個無符號整形,需要160億字節(jié)的空間,大概就是16GB的空間,一般計算機的內促都是4G或者8G,所以空間不足,此時就有了位圖的方法來解決:

數(shù)據(jù)是否在給定的整形數(shù)據(jù)中,結果是在或者不在,剛好是兩種狀態(tài),那么可以使用一個二進制比特位來代表數(shù)據(jù)是否存在的信息,如果二進制比特位為1,代表存在,為0代表不存在。比如:

對于上圖來說,有一個整形數(shù)組,我們可以使用直接定址法對數(shù)組的數(shù)據(jù)進行映射,但是與之前不同的是,此時只是使用一個比特位來代表一個整形數(shù)據(jù),當這個數(shù)存在時,比特位置1,不存在時,比特位置0,此時就可以大大節(jié)省空間資源,無符號整數(shù)只有2的32次方個,所以最多開2的32次方個空間,一個空間為一個比特,所以最終只需要512MB的空間。但是我們不能按照位來空間,最少必須一個字節(jié),所以我們就每次開一個字節(jié)的空間,也就是8個比特位,將8位當做一個整體來處理,對要保存的數(shù)據(jù)除8就是第幾個字節(jié),對保存的數(shù)據(jù)模8就是在這個字節(jié)中的第幾個位置。

二、位圖的概念

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

那么位圖還有哪些應用呢?

  • 快速查找某個數(shù)據(jù)是否在一個集合中
  • 排序 + 去重
  • 求兩個集合的交集、并集等
  • 操作系統(tǒng)中磁盤塊標記

位圖模擬實現(xiàn)

一、構造函數(shù)

由于不能按位開空間,所以我們選擇每次開一個字節(jié)的空間,由于有范圍最大為N,一位關聯(lián)一個數(shù)據(jù),所以需要開N/8個字節(jié)的空間,但是有時可能不能整除,所以要開N/8+1個字節(jié)的空間。所以

直接在構造函數(shù)中開好空間:

bitset()
		{
			_bits.resize(N / 8 + 1,0);
		}

二、set,reset,test函數(shù)

set函數(shù)的作用是對位圖中的某一位進行填充

i就表示是第幾個字節(jié),而j表示該位在該字節(jié)中的第幾位,所以對1進行左移j位后與該字節(jié)按位或,按位或的作用時不論該位為0還是為1,都將該位變?yōu)?.

void set(size_t x)
		{
			int i = x / 8;
			int j = x % 8;
			_bits[i] |= (1 << j);
		}

reset的作用是將某一位清空

同樣的將要清空的那一位置為0,進行按位與,不論原本該位是0還是1,都將該位置0

void reset(size_t x)
		{
			int i = x / 8;
			int j = x % 8;
			_bits[i] &= ~(1 << j);
		}

test的作用是檢測位圖中某一位是否存在

bool test(size_t x)
		{
			int i = x / 8;
			int j = x % 8;
			return _bits[i] & (1 << j);
		}

三、代碼測試

void test_bit_set1()
	{
		bitset<100> bs1;
		bs1.set(8);
		bs1.set(9);
		bs1.set(20);
		cout << bs1.test(8) << endl;
		cout << bs1.test(9) << endl;
		cout << bs1.test(20) << endl;
		bs1.reset(8);
		bs1.reset(9);
		bs1.reset(20);
		cout << bs1.test(8) << endl;
		cout << bs1.test(9) << endl;
		cout << bs1.test(20) << endl;
	}

四、完整代碼

namespace tmt
{
	template<size_t N>
	class bitset
	{
	public:
		bitset()
		{
			_bits.resize(N / 8 + 1,0);
		}
		void set(size_t x)
		{
			int i = x / 8;
			int j = x % 8;
			_bits[i] |= (1 << j);
		}
		void reset(size_t x)
		{
			int i = x / 8;
			int j = x % 8;
			_bits[i] &= ~(1 << j);
		}
		bool test(size_t x)
		{
			int i = x / 8;
			int j = x % 8;
			return _bits[i] & (1 << j);
		}
	private:
		vector<char> _bits;
	};
	void test_bit_set1()
	{
		bitset<100> bs1;
		bs1.set(8);
		bs1.set(9);
		bs1.set(20);
		cout << bs1.test(8) << endl;
		cout << bs1.test(9) << endl;
		cout << bs1.test(20) << endl;
		bs1.reset(8);
		bs1.reset(9);
		bs1.reset(20);
		cout << bs1.test(8) << endl;
		cout << bs1.test(9) << endl;
		cout << bs1.test(20) << endl;
	}

到此這篇關于C++中bitset位圖介紹及模擬實現(xiàn)的文章就介紹到這了,更多相關C++ bitset位圖內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言設計模式之命令模式介紹

    C語言設計模式之命令模式介紹

    大家好,本篇文章主要講的是C語言設計模式之命令模式介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • c++ 調用python傳輸圖片實例

    c++ 調用python傳輸圖片實例

    今天小編就為大家分享一篇c++ 調用python傳輸圖片實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • C語言中野指針和空指針的區(qū)別

    C語言中野指針和空指針的區(qū)別

    本文主要介紹了野指針和空指針的概念、用途、原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-11-11
  • opencv利用鼠標滑動畫出多彩的形狀

    opencv利用鼠標滑動畫出多彩的形狀

    這篇文章主要為大家詳細介紹了opencv利用鼠標滑動畫出多彩的形狀,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C語言實現(xiàn)俄羅斯方塊源代碼

    C語言實現(xiàn)俄羅斯方塊源代碼

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)俄羅斯方塊的源代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • C語言判斷語句和if語句形式及多層if使用示例

    C語言判斷語句和if語句形式及多層if使用示例

    這篇文章主要為大家介紹了C語言判斷語句和if語句形式及多層if使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • C++中的繼承方式與菱形繼承解析

    C++中的繼承方式與菱形繼承解析

    這篇文章主要介紹了C++中的繼承方式與菱形繼承解析,繼承是類和類之間的關系,是代碼復用的重要手段,允許在保持原有類結構的基礎上進行擴展,創(chuàng)建的新類與原有的類類似,只是多了幾個成員變量和成員函數(shù),需要的朋友可以參考下
    2023-08-08
  • C語言中static與sizeof查缺補漏篇

    C語言中static與sizeof查缺補漏篇

    static在修飾變量的時候,如果是修飾全局變量,則跟全局變量功能一樣;如果是修改局部變量,則每次調用的時候,保持著上一次的值;而sizeof是用來判斷一個變量及數(shù)據(jù)類型所占字節(jié)數(shù)的,下面我們詳細來看看
    2022-07-07
  • C++深淺拷貝和寫時拷貝圖文詳解

    C++深淺拷貝和寫時拷貝圖文詳解

    這篇文章主要給大家介紹了關于C++深淺拷貝和寫時拷貝的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • C語言算法練習之數(shù)組元素排序

    C語言算法練習之數(shù)組元素排序

    這篇文章主要為大家介紹了C語言算法練習中數(shù)組元素排序的實現(xiàn)方法,文中的示例代碼講解詳細,對我們學習C語言有一定幫助,需要的可以參考一下
    2022-09-09

最新評論

大名县| 东城区| 天长市| 怀集县| 恭城| 洪洞县| 汶上县| 绩溪县| 灌云县| 阿克| 正镶白旗| 定陶县| 黔江区| 榕江县| 黄陵县| 通渭县| 周口市| 永顺县| 翁源县| 许昌市| 义马市| 平凉市| 合川市| 浮山县| 光山县| 同心县| 南京市| 招远市| 榆树市| 南投市| 曲靖市| 微博| 峨眉山市| 额尔古纳市| 县级市| 冷水江市| 和田县| 明星| 舒城县| 霍城县| 荆门市|