雜湊表擴充套件—點陣圖
1.什麼是點陣圖?
點陣圖就是bitmap的縮寫。所謂bitmap,就是用每一位來存放某種狀態,適用於大規模資料,但資料狀態又不是很多的情況。通常是用來判斷某個資料存不存在的。在STL中有一個bitset容器,其實就是點陣圖。
所以我們可以瞭解到,點陣圖就是一個只用每一位來儲存數的狀態的結構。
2.點陣圖的用處?
點陣圖主要用於海量資料處理,索引,資料壓縮等方面有廣泛應用
3.點陣圖的結構
關於點陣圖的結構,類似於雜湊,點陣圖就是一個用每一位的0,1來表示一個數的狀態。
比如,我們現在有一個檔案,這個檔案中有數 1,5,4294967295。我們就把第1位,第5位,第4294967295位改為狀態1。
4.點陣圖題目操練
給4 0 億個不重複的無符號整數,沒排過序。給一個無符號整數,如何快速判斷一個數是否在這4 0 億個數中。
題目分析:這是一道關於海量資料查詢的題,其實這道題,我們就可以和雜湊表聯絡在一起,為何說是海量資料呢,對於一個40億整數,我們如果要存的話,按照無符號整數來儲存,那麼下來,大概就需要40億*4這麼些位元組,下來大概就是16G的 記憶體。
對於現在的64位機,普遍標配記憶體也就是4-8G的記憶體,顯而易見,16G是沒有辦法一次性處理的。那麼我們如何是好?進行拆分?這樣顯然也是不好的,怎麼拆,還有效率問題。
所以在這裡我們採取一種新的思路,這種思路就是點陣圖。
點陣圖結構定義
typedef struct BitMap
{
size_t* _bits;
size_t _range;
}BitMap;
點陣圖相關介面
void BitMapInit(BitMap *bm,size_t range) //初始化
{
assert(bm);
bm->_bits = NULL;
bm->_range = range;
bm->_bits = (size_t *)malloc(sizeof(char)*bm->_range/8);
assert(bm->_bits);
memset(bm->_bits,0,sizeof(char)*bm->_range/8);
}
void BitMapSet(BitMap *bm,size_t x)//標記相應位
{
size_t num = x>>5;
size_t bit = x%32;
bm->_bits[num] |=(1<<bit);
}
void BitMapReset(BitMap *bm,size_t x)//恢復相應位
{
size_t num = x>>5;
size_t bit = x%32;
bm->_bits[num] &= (~(1<<bit));
}
int BitMapTest(BitMap *bm,size_t x)
{
size_t num = x>>5;
size_t bit = x%32;
if ((1<<bit)&bm->_bits[num])
return 0;
return -1;
}
測試案例及結果截圖:
void TestBitMap()
{
BitMap bm;
BitMapInit(&bm,-1);
BitMapSet(&bm,5);
BitMapSet(&bm,6);
BitMapSet(&bm,7);
BitMapSet(&bm,8);
BitMapSet(&bm,-1);
printf("%d\n",BitMapTest(&bm,4));
printf("%d\n",BitMapTest(&bm,5));
printf("%d\n",BitMapTest(&bm,6));
printf("%d\n",BitMapTest(&bm,7));
printf("%d\n",BitMapTest(&bm,8));
printf("%d\n",BitMapTest(&bm,-1));
}
這道題中點陣圖結構程式碼不難,注意理解思路,必須熟練掌握位運算。
5.總結
優缺點:
(1)可讀性差
(2)點陣圖儲存的元素個數雖然比一般做法多,但是儲存的元素大小受限於儲存空間的大小。點陣圖儲存性質:儲存的元素個數等於元素的最大值。比如, 1K 位元組記憶體,能儲存 8K 個值大小上限為 8K 的元素。(元素值上限為 8K ,這個侷限性很大!)比如,要儲存值為 65535 的數,就必須要 65535/8=8K 位元組的記憶體。要就導致了點陣圖法根本不適合存 unsigned int 型別的數(大約需要 2^32/8=5 億位元組的記憶體)。
(3)點陣圖對有符號型別資料的儲存,需要 2 位來表示一個有符號元素。這會讓點陣圖能儲存的元素個數,元素值大小上限減半。 比如 8K 位元組記憶體空間儲存 short 型別資料只能存 8K*4=32K 個,元素值大小範圍為 -32K~32K 。
相關文章
- 雜湊擴充套件攻擊套件
- 雜湊表擴充套件—布隆過濾器(Bloom Filter)套件過濾器OOMFilter
- 擴充套件表套件
- 雜湊表(雜湊表)詳解
- [外掛擴充套件]焦點圖外掛套件
- 擴充套件表空間套件
- 雜湊表(雜湊表)原理詳解
- es6-陣列擴充套件陣列套件
- 表空間自動擴充套件 AUTOALLOCATE 的擴充套件規律套件
- 雜湊表
- 雜湊表知識點小結
- 【演算法】9 雜湊表【待補充】演算法
- [外掛擴充套件]焦點圖輪播外掛套件
- 第23章:列表、陣列和雜湊表陣列
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式
- es6 陣列擴充套件方法陣列套件
- 【尋跡#3】 雜湊與雜湊表
- INFORMIX表的預設初始擴充套件、下一個擴充套件資料塊以及一個表允許的最大擴充套件數。ORM套件
- 表單驗證使用擴充套件套件
- Redis雜湊表的實現要點Redis
- [外掛擴充套件]多圖上傳欄位擴充套件MultiImages0.4套件
- SpringBoot擴充套件點EnvironmentPostProcessorSpring Boot套件
- 字串雜湊表字串
- 6.7雜湊表
- 圖解兩數之和:雜湊表法圖解
- 查詢(3)--雜湊表(雜湊查詢)
- [外掛擴充套件]圖片牆套件
- 從雜湊表(HashTable)的角度深入理解《PHP 陣列的雜湊碰撞攻擊》PHP陣列
- ES6之陣列的擴充套件陣列套件
- WCF擴充套件:行為擴充套件Behavior Extension套件
- 報表開發之擴充套件GROUP BY套件
- 深入理解雜湊表(JAVA和Redis雜湊表實現)JavaRedis
- IOS setOnclick - 點選事件完美擴充套件iOS事件套件
- 巧用SpringBoot擴充套件點EnvironmentPostProcessorSpring Boot套件
- 【LeetCode 1_陣列_雜湊表】Two SumLeetCode陣列
- 【Kotlin】擴充套件屬性、擴充套件函式Kotlin套件函式
- 雜湊表應用
- 雜湊表的原理