使用bit map可以解決的題

2021-06-21 22:11:25 字數 1830 閱讀 3870

來自於《程式設計珠璣》。所謂的bit-map就是用乙個bit位來標記某個元素對應的value, 而key即是該元素。由於採用了bit為單位來儲存資料,因此在儲存空間方面,可以大大節省。

如果說了這麼多還沒明白什麼是bit-map,那麼我們來看乙個具體的例子,假設我們要對0-7內的5個元素(4,7,2,5,3)排序(這裡假設這些元素沒有重複)。那麼我們就可以採用bit-map的方法來達到排序的目的。要表示8個數,我們就只需要8個bit(1bytes),首先我們開闢1byte的空間,將這些空間的所有bit位都置為0,然後遍歷這5個元素,首先第乙個元素是4,那麼就把4對應的位置為1(可以這樣操作 p+(i/8)|(0×01<

一、兩個整數集合a和b,求其交集

1、讀取整數集合a中的整數,將讀到的整數插入到map中,並將對應的值設為1.

2、讀取整數集合b中的整數,如果該整數在map中並且值為1,則將此數加入到交集當中,並將在map中的對應值改為2.

通過更改map中的值,避免了將同樣的值輸出兩次。

二、找出1到10w中沒有出現的兩個數字

有1到10w這10w個數,去除2個數並打亂次序,如何找出那兩個數?

想法一:申請10w個bit的空間,每個bit代表乙個數字是否出現過。

開始時,將這10w個bit都初始化為0,表示所有數字都沒有出現過。

然後依次讀入已經亂序的數字,並將對應的bit設為1.

當處理完所有書之後,根據為0的bit得出沒有出現的數字。

想法二:首先計算1到10w的和、平方和

然後計算給定數字的和、平方和

兩次得到的數字相減,可以得到這兩個數字的和、平方和

有:x + y = n

x^2 + y^2 = m

解方程可以得到x、y的值。

三、有1000瓶水,其中有一瓶有毒,小白鼠只要嘗一點帶毒的水,24小時候就會死亡,至少要多少只小白鼠才能在24小時時鑑別出哪瓶水有毒?

將1000瓶水編號。準備10只小白鼠並編號2^10=1024,用二進位制表示為10000000000,一共有11位,因為1024>1000,所以1000瓶水分別可以抽象表示為10位二進位制數。將10只小白鼠分別對應每一位。 讓小白鼠按位去喝藥水(遇見1喝,遇見0不喝)      

類似下圖:

如果小白鼠a、b、c都沒死(000),則編號為0的水瓶中的水有劇毒;

如果小白鼠a、b沒死,c死(001),則編號為1的水瓶中的水有劇毒;

如果小白鼠a、c沒死,b死(010),則編號為2的水瓶中的水有劇毒;

如果小白鼠a沒死,b、c死(011),則編號為3的水瓶中的水有劇毒;

如果小白鼠a死,b、c沒死(100),則編號為4的水瓶中的水有劇毒;

如果小白鼠a、c死,b沒死(101),則編號為5的水瓶中的水有劇毒;

(實質上:我們可以保持小白鼠的位置不變,給沒死的小白鼠貼上標籤0,死的貼上標籤1,會得出一串二進位製碼,在將此段二進位製碼轉換成為十進位制,即得出有劇毒水瓶的編號)

四、判斷數字是否出現在40億個書中

給40億個不重複的unsigned int 的整數,無序,如何查詢乙個數是否在那40億個數當中

情況一:記憶體足夠

unsigned int的取值範圍是0到2^32-1。我們可以申請連續的2^32/8 = 512m,用每乙個bit對應乙個unsigned int數字。首先將512m記憶體都初始化為0,然後每處理乙個數字就將其對應的bit設定為1。當需要查詢時,直接找到對應bit,看其值是0還是1。

情況二:記憶體不足

使用二分搜尋,每次將範圍限定在數量較少的那一半空間中,這樣頂多 logn 次搜尋之後就可以限定所求整數(n為整數個數)。

關於使用BitMap的小結

建立bitmap bitmap bm null bm bitmap.createbitmap w,h,config.alpha 8 每個畫素佔乙個位元組 8位 bm bitmap.createbitmap w,h,config.argb 4444 兩個位元組 bm bitmap.createbitm...

Redis中Bitmap的使用

優勢 1.基於最小的單位bit進行儲存,所以非常省空間。2.設定時候時間複雜度o 1 讀取時候時間複雜度o n 操作是非常快的。3.二進位制資料的儲存,進行相關計算的時候非常快。4.方便擴容 限制redis中bit對映被限制在512mb之內,所以最大是2 32位。建議每個key的位數都控制下,因為讀...

用二分可以簡單解決的題

二分,字面上的意思,將乙個問題分為兩個變簡的子問題,從而使問題變得簡化 引入 最大化平均值 有n個物品的重量和價值分別是wi和vi。從中選出k個物品使得單位重量的價值最大。向這些題,通常可以使用二分搜尋法就可以解決了。設 c x 可以選擇使得單位重量的價值不小於x 那麼問題可以變成求滿足c x 的最...