国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C > 正文

數(shù)據(jù)結(jié)構(gòu)之位圖(bitmap)詳解

2020-01-26 15:21:55
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

1.  概述

位圖(bitmap)是一種非常常用的結(jié)構(gòu),在索引,數(shù)據(jù)壓縮等方面有廣泛應(yīng)用。本文介紹了位圖的實(shí)現(xiàn)方法及其應(yīng)用場(chǎng)景。

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

(1)自己實(shí)現(xiàn)
在位圖中,每個(gè)元素為“0”或“1”,表示其對(duì)應(yīng)的元素不存在或者存在。

復(fù)制代碼 代碼如下:

#define INT_BITS sizeof(int)
 
#define SHIFT 5 // 2^5=32
 
#define MASK 0x1f // 2^5=32
 
#define MAX 1024*1024*1024 //max number
 
int bitmap[MAX / INT_BITS];
 
/*
 
* 設(shè)置第i位
 
* i >> SHIFT 相當(dāng)于 i / (2 ^ SHIFT),
 
* i&MASK相當(dāng)于mod操作 m mod n 運(yùn)算
 
*/
 
void set(int i) {
 
bitmap[i >> SHIFT] |= 1 << (i & MASK);
 
}
 
//獲取第i位
 
int test(int i) {
 
return bitmap[i >> SHIFT] & (1 << (i & MASK));
 
}
 
//清除第i位
 
int clear(int i) {
 
return bitmap[i >> SHIFT] & ~(1 << (i & MASK));
 
}

(2)函數(shù)庫(kù)實(shí)現(xiàn)

C++的STL中有bitmap類(lèi),它提供了很多方法,詳見(jiàn):http://www.cplusplus.com/reference/stl/bitset/

3.  位圖應(yīng)用

3.1    枚舉
(1)全組合
字符串全組合枚舉(對(duì)于長(zhǎng)度為n的字符串,組合方式有2^n種),如:abcdef,可以構(gòu)造一個(gè)從字符串到二進(jìn)制的映射關(guān)系,通過(guò)枚舉二進(jìn)制來(lái)進(jìn)行全排序。

復(fù)制代碼 代碼如下:

null――> 000000
f――> 000001
e――> 000010
ef――> 000011
……
abcedf――> 111111

(2)哈米爾頓距離

枚舉算法,復(fù)雜度是O(N^2),怎樣降低復(fù)雜度呢?
如果是N 個(gè)二維的點(diǎn),那么我們可以怎么用較快的方法求出

通過(guò)簡(jiǎn)單的數(shù)學(xué)變形,我們可以得到這樣的數(shù)學(xué)公式:

通過(guò)觀察,我們發(fā)現(xiàn)每一對(duì)相同元的符號(hào)必定相反,如:x_i-y_i,于是我們有了一個(gè)二進(jìn)制思想的思路,那就是枚舉這些二i維的點(diǎn)的x 軸y 軸前的正負(fù)號(hào),這樣就可以用一個(gè)0~3 的數(shù)的二進(jìn)制形式來(lái)表示每個(gè)元素前面的正負(fù)號(hào),1表示+號(hào),0表示−號(hào),如:2 表示的二進(jìn)制位形式為10表示x_i-y_i。這樣我們就可以通過(guò)2^2*N次記錄下這些二元組的不同的符號(hào)的數(shù)值,對(duì)于每個(gè)二進(jìn)制來(lái)表示的不同的式子只需記錄下他們的值,這樣我們只需求max_i 和min_i出這些相同的二進(jìn)制表示的式子max_i

主站蜘蛛池模板: 阜新市| 松潘县| 松江区| 安西县| 榆林市| 宝应县| 高唐县| 恭城| 兴海县| 丹凤县| 新乐市| 肇庆市| 深水埗区| 神池县| 藁城市| 杂多县| 兴安盟| 鹤岗市| 常山县| 灌云县| 边坝县| 原平市| 新建县| 漳州市| 乡宁县| 阆中市| 白沙| 乌拉特前旗| 平谷区| 饶河县| 湖北省| 通山县| 锦屏县| 天气| 新龙县| 上林县| 渭源县| 区。| 蛟河市| 无锡市| 崇信县|