• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 200, comments - 8, trackbacks - 0, articles - 0

            【什么是Bit-map】

            所謂的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<<(i%8)) 當然了這里的操作涉及到Big-ending和Little-ending的情況,這里默認為Big-ending),因為是從零開始的,所以要把第五位置為一(如下圖):

            然后再處理第二個元素7,將第八位置為1,,接著再處理第三個元素,一直到最后處理完所有的元素,將相應的位置為1,這時候的內存的Bit位的狀態如下:

            然后我們現在遍歷一遍Bit區域,將該位是一的位的編號輸出(2,3,4,5,7),這樣就達到了排序的目的。下面的代碼給出了一個BitMap的用法:排序。

            //定義每個Byte中有8個Bit位 #include <memory.h> #define BYTESIZE 8 void SetBit(char *p, int posi) { 	for(int i=0; i < (posi/BYTESIZE); i++) 	{ 		p++; 	}  	*p = *p|(0x01<<(posi%BYTESIZE));//將該Bit位賦值1 	return; }  void BitMapSortDemo() { 	//為了簡單起見,我們不考慮負數 	int num[] = {3,5,2,10,6,12,8,14,9};  	//BufferLen這個值是根據待排序的數據中最大值確定的 	//待排序中的最大值是14,因此只需要2個Bytes(16個Bit) 	//就可以了。 	const int BufferLen = 2; 	char *pBuffer = new char[BufferLen];  	//要將所有的Bit位置為0,否則結果不可預知。 	memset(pBuffer,0,BufferLen); 	for(int i=0;i<9;i++) 	{ 		//首先將相應Bit位上置為1 		SetBit(pBuffer,num[i]); 	}  	//輸出排序結果 	for(int i=0;i<BufferLen;i++)//每次處理一個字節(Byte) 	{ 		for(int j=0;j<BYTESIZE;j++)//處理該字節中的每個Bit位 		{ 			//判斷該位上是否是1,進行輸出,這里的判斷比較笨。 			//首先得到該第j位的掩碼(0x01<<j),將內存區中的 			//位和此掩碼作與操作。最后判斷掩碼是否和處理后的 			//結果相同 			if((*pBuffer&(0x01<<j)) == (0x01<<j)) 			{ 				printf("%d ",i*BYTESIZE + j); 			} 		} 		pBuffer++; 	} }  int _tmain(int argc, _TCHAR* argv[]) { 	BitMapSortDemo(); 	return 0; }

            【適用范圍】

            可進行數據的快速查找,判重,刪除,一般來說數據范圍是int的10倍以下

            【基本原理及要點】

            使用bit數組來表示某些元素是否存在,比如8位電話號碼

            【擴展】

            Bloom filter可以看做是對bit-map的擴展

            【問題實例】

            1)已知某個文件內包含一些電話號碼,每個號碼為8位數字,統計不同號碼的個數。

            8位最多99 999 999,大概需要99m個bit,大概10幾m字節的內存即可。 (可以理解為從0-99 999 999的數字,每個數字對應一個Bit位,所以只需要99M個Bit==12.4MBytes,這樣,就用了小小的12.4M左右的內存表示了所有的8位數的電話)

            2)2.5億個整數中找出不重復的整數的個數,內存空間不足以容納這2.5億個整數。

            將bit-map擴展一下,用2bit表示一個數即可,0表示未出現,1表示出現一次,2表示出現2次及以上,在遍歷這些數的時候,如果對應位置的值是0,則將其置為1;如果是1,將其置為2;如果是2,則保持不變。或者我們不用2bit來進行表示,我們用兩個bit-map即可模擬實現這個2bit-map,都是一樣的道理。

            做人好厚道,轉載請注明出處:http://diducoder.com/mass-data-4-bitmap.html

            久久99精品久久久久久动态图| 一本色道久久综合亚洲精品| 久久久久女人精品毛片| 国内精品久久久久久99蜜桃| 91久久九九无码成人网站| 久久伊人五月天论坛| 国产香蕉久久精品综合网| 久久天堂AV综合合色蜜桃网| 91精品国产91久久久久久| 国产精品久久久久久久久久影院| 精品永久久福利一区二区| 国产综合免费精品久久久| 亚洲精品乱码久久久久久中文字幕| 久久99国产亚洲高清观看首页| 亚洲国产视频久久| 国产福利电影一区二区三区,免费久久久久久久精 | 国产精品九九久久精品女同亚洲欧美日韩综合区 | 2020久久精品亚洲热综合一本| 国产亚洲综合久久系列| 亚洲精品无码久久不卡| 国产精品久久影院| 午夜精品久久久久久毛片| 久久精品国产亚洲精品| 99久久精品午夜一区二区| 国产成人精品久久| 久久伊人五月天论坛| 国产高潮国产高潮久久久91 | 狠狠人妻久久久久久综合| 久久久久亚洲av无码专区| 久久综合亚洲色HEZYO社区| 国产精品一区二区久久精品无码| 久久精品国产色蜜蜜麻豆| 久久久久无码精品国产app| 97精品久久天干天天天按摩| 久久久www免费人成精品| 亚洲伊人久久成综合人影院| 国产精品成人无码久久久久久| 99久久国产综合精品网成人影院 | 久久狠狠高潮亚洲精品 | 久久久久久国产a免费观看不卡| 久久久91精品国产一区二区三区|