1. Bit Map算法简介
所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。
2. 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)|(0x01<<(i%8)) 当然了这里的操作涉及到Big-ending和Little-ending的情况,这里默认为Big-ending),因为是从零开始的,所以要把第五位置为一(如下图):
aaarticlea/png;base64,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pWdBQUFhYeGECRMKCgpGjRpVXFx8ww03FBcXd6CooqKiMWPGFBQUuOsdO3ZsZynpJDc3d8yYMSNGjCguLh49evSIESPGjBnTASWLiorij/n5+ePGjcvJySkoKJg0aVJubm5OTo77KS8vz9VJu6S4uNgpNnLkyMLCQrfTgfosLCx0Z3c7hYWFRUVF+fn5d911V9Iox8MDZ7kff/zxrVu3dol/IHJLhzV2KJ0ice8Wnx4ddUviA5131VkaxiU7S+B5HrNb16qD9eB82c5VL5akb+YSg9E0XNAucQdKlKHpJMYAkaPcgZIlMfxInqjDRTVTxo3ak4nHseVuhJuI4jryPC9+/3QHlGhDHOLxyLXDo+/keBRNm+HARWudvL1FpAO3ECdere1K6Nx3eDvxfT82SR2+AyUxcLTWOlWJSCnlfNm45DjruF0S3zMxhR2TVuF2WrmBXKweEV155ZW33HLLo48+unnz5i6xJWi207GBbauSbOx4WNmBcuIrdDudrmeyKpNJ5B1TMvmxE/V0Jbtrj5XsWFQHiX4VCSsb123SDHWs/Jg5SRjy9pYT65DsEiW6M509imG4/PLLb7rpprlz57788stdmqniPra0rNJRR+JL+VI+NxGRCy64oKSk5OGHH96wYUOX5A+uS+2wm/WlfCmfpzTrJdx+//79x40bN3v27HXr1nVJPsuJ1sKfX8qX8sWUlv4PgMsvv/zmm2+eN2/e+vXru2Sz2ffff7+8vHz69OnFxcVXXXXVRRdddOGFFw4cOPCaa64ZPHjwtU1l8JfypXwBJEbx2muvve6664YMGTJkyJDrrruuoKBg2rRpzz333CuvvNIlm81+8sknGzZseOaZZ+67777bbrtt0qRJN91006233nrbbbf95Cc/mTx58uTJk5M7X8qX8r8ukxPy04Tcddddc+fOraioePPNN7sYY+rq6v75z39WV1c/++yzjz322GOPPfbEE0/88Y9/fOKJJ5588smnnnrqySefdDvx/pfypXxx5Kmnnno6kvnz5y9fvvzVV1/dsWNHF6217/v19fUff/zx66+//vLLL69evfqll17auHHjpk2bNm/evHnz5k2bNrn9LVu2bP5SvpQvgDgmk5Q62bJlyzvvvLNr1y7f9/8vJA33MoL0iw0AAAAASUVORK5CYII=" alt="" />
然后再处理第二个元素7,将第八位置为1,,接着再处理第三个元素,一直到最后处理完所有的元素,将相应的位置为1,这时候的内存的Bit位的状态如下:
aaarticlea/png;base64,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0dH6liSFr0Gz1jrn/Dtx/Dfebqa/KWH6fdGiRf4lq/4N8F3/eLfib8lPMnsN119/fS++ZFVEbrrppttuu83XQvqi1FL1+Pf1aPLStksvvXTdunU9Nlq7inPud7/7HZJXM6cX7YGq9Kx33333vPPO88p7o4wAcM8991xxxRXpC4zSzrBn5RSR++67b9SoUUh7qhIlNdvpqx4BjB079vbbb/fa0nv3/9pduIno4YcfPuaYY/zr0OfOnVtTU1NfujQ0NKT/nTNnzqmnnnr22Wf3QE8xOeuss84666yampqFCxcWXrEk8a+jb2ho8G9TP/LII6uqqnqxkPPmzTvwwANnz549d+7c+vr6O+64I30peklSXV09Z86c2bNn19XVXX/99YcddlhtbW1643suAwcO7Nu375133llfXz9//vz6+vqGhoa6urpS9fiarK6uHjx48EknnVRbW+u1lSqzZ8/2r6P39VZfX3/nnXf++Mc/njdvXhRF6heAJ48BEXUXblV97733Lrvssj/96U9Dhw71LwMfWaJUVlb6d6qPHDlyxIgRXtXYsWNL1dOFjB49+oorrhg1atTFF19cVlY2atSoYcOGlapk2LBhY8eOvfjii4cPH15eXl5VVfWnP/2pFwtZVVU1evTo8vLyIUOGeP1lZWXDhw/vgarKykpfk2VlZZdddtmQIUOGDBnSW+UcM2aM/69vsmHDhlVWVlZVVZWqp6qqavjw4WVlZZdffnlFRUVFRcWQIUNGjx5dqh4PT+F75seOHXvZZZdt3Lgx9XNSN6+7Pnfq26UuV8/eI1zYr2nysrYedE9diL+9tJw9fk8fEn/GD32CIOjFcvriZbNZX8g96ev9QRRFfsAXBEEvlRFIevnCOuxZlXpaUkcxHfCVqkc6vhVaRDKZTCdV6Utru2u5U9cwPTMMw541tm/LwtvrRV8WBbeNjmO1HhSysGzpmqNeEWutr9K0Yomox/WQvpQxl8sVOqN7LmklFD6BPagHf+6uJrJnpfJjofQ5KRzpoiBE2F3LjY7DlLQLKLVYuw5De51sbySk4DWePYtapk9g4di0d4uKpL173My+RdOASY/js11IGrNLLUXPrpI2dLLTg/bgrgvDL0EQFHrYna7iv+kAd+H1do3jFH7f6Tf7ZJ/8HaXYw/DTn/50yJAhd9xxx+rVq/sUw7cY3Ptkn3yY5eSTT7744otvu+22lStX9vEOeyf/8m/R2e2TfbIX5IQTThg8ePDNN9/8/PPPt/vcmizoStd07fbkvd397JN90j3xfB533HHtcBtjdpuAovv8kH3y/6D85Cc/afe5jTGbN29+4oknJk6ceP7555966qk//vGPTznllDPOOOPMM8/81a9+ddZZZ/1qn+yTD6uc1VEGDBhw5ZVXNjQ0vPjii30ymczWrVvXrFlz9913T5o0qbKy8tJLL7344osrKioqKytHJVKVyKh9sk8+ZDK6QMaNG3fXXXc98cQTmzZt6kNEra2tGzdufPbZZxcsWDB79uxZs2bNnj27urq6trY2TSqoS6QH6QH7ZJ/0uuwKZENDQ0NDw7x585566ql169a1trb2IaIwDBsbGzdt2vTKK6+sXbt21apVq1evXrt27Qv7ZJ98WGXdunWFx+vXr1+3bt26deteeumlN998c/v27a2trf8X6PiJMEpKxQYAAAAASUVORK5CYII=" alt="" />
然后我们现在遍历一遍Bit区域,将该位是一的位的编号输出(2,3,4,5,7),这样就达到了排序的目的。
优点:
1.运算效率高,不许进行比较和移位;
2.占用内存少,比如N=10000000;只需占用内存为N/8=1250000Byte=1.25M。
缺点:
所有的数据不能重复。即不可对重复的数据进行排序和查找。
3. Map映射表
假设需要排序或者查找的总数N=10000000,那么我们需要申请内存空间的大小为int a[1 + N/32],其中:a[0]在内存中占32为可以对应十进制数0-31,依次类推:
bitmap表为:
a[0]--------->0-31
a[1]--------->32-63
a[2]--------->64-95
a[3]--------->96-127
..........
那么十进制数如何转换为对应的bit位,下面介绍用位移将十进制数转换为对应的bit位。
4. 位移转换
申请一个int一维数组,那么可以当作为列为32位的二维数组,
| 32位 |
int a[0] |0000000000000000000000000000000000000|
int a[1] |0000000000000000000000000000000000000|
………………
int a[N] |0000000000000000000000000000000000000|
例如十进制0,对应在a[0]所占的bit为中的第一位: 00000000000000000000000000000001
0-31:对应在a[0]中
i =0 00000000000000000000000000000000
temp=0 00000000000000000000000000000000
answer=1 00000000000000000000000000000001
i =1 00000000000000000000000000000001
temp=1 00000000000000000000000000000001
answer=2 00000000000000000000000000000010
i =2 00000000000000000000000000000010
temp=2 00000000000000000000000000000010
answer=4 00000000000000000000000000000100
i =30 00000000000000000000000000011110
temp=30 00000000000000000000000000011110
answer=1073741824 01000000000000000000000000000000
i =31 00000000000000000000000000011111
temp=31 00000000000000000000000000011111
answer=-2147483648 10000000000000000000000000000000
32-63:对应在a[1]中
i =32 00000000000000000000000000100000
temp=0 00000000000000000000000000000000
answer=1 00000000000000000000000000000001
i =33 00000000000000000000000000100001
temp=1 00000000000000000000000000000001
answer=2 00000000000000000000000000000010
i =34 00000000000000000000000000100010
temp=2 00000000000000000000000000000010
answer=4 00000000000000000000000000000100
i =61 00000000000000000000000000111101
temp=29 00000000000000000000000000011101
answer=536870912 00100000000000000000000000000000
i =62 00000000000000000000000000111110
temp=30 00000000000000000000000000011110
answer=1073741824 01000000000000000000000000000000
i =63 00000000000000000000000000111111
temp=31 00000000000000000000000000011111
answer=-2147483648 10000000000000000000000000000000
浅析上面的对应表,分三步:
1.求十进制0-N对应在数组a中的下标:
十进制0-31,对应在a[0]中,先由十进制数n转换为与32的余可转化为对应在数组a中的下标。比如n=24,那么 n/32=0,则24对应在数组a中的下标为0。又比如n=60,那么n/32=1,则60对应在数组a中的下标为1,同理可以计算0-N在数组a中的下标。
2.求0-N对应0-31中的数:
十进制0-31就对应0-31,而32-63则对应也是0-31,即给定一个数n可以通过模32求得对应0-31中的数。
3.利用移位0-31使得对应32bit位为1:
找到对应0-31的数为M, 左移M位:即2^M. 然后置1.
由此我们计算10000000个bit占用的空间:
1byte = 8bit
1kb = 1024byte
1mb = 1024kb
占用的空间为:10000000/8/1024/1024mb。
5. 扩展
Bloom filter可以看做是对bit-map的扩展
6. Bit-Map的应用
1)可进行数据的快速查找,判重,删除,一般来说数据范围是int的10倍以下。
2)去重数据而达到压缩数据
7. Bit-Map的具体实现
#define BITSPERWORD 32
#define SHIFT 5
#define MASK 0x1F
#define N 10000000 int a[ + N/BITSPERWORD];//申请内存的大小 //set 设置所在的bit位为1
void set(int i) {
a[i>>SHIFT] |= (<<(i & MASK));
}
//clr 初始化所有的bit位为0
void clr(int i) {
a[i>>SHIFT] &= ~(<<(i & MASK));
}
//test 测试所在的bit为是否为1
int test(int i){
return a[i>>SHIFT] & (<<(i & MASK));
} int main()
{
int i;
for (i = ; i < N; i++)
clr(i);
while (scanf("%d", &i) != EOF)
set(i);
for (i = ; i < N; i++)
if (test(i))
printf("%d\n", i);
return ;
}
注明: 左移n位就是乘以2的n次方,右移n位就是除以2的n次方
解析本例中的void set(int i) { a[i>>SHIFT] |= (1<<(i & MASK)); }
1) i>>SHIFT:
其中SHIFT=5,即i右移5为,2^5=32,相当于i/32,即求出十进制i对应在数组a中的下标。比如i=20,通过i>>SHIFT=20>>5=0 可求得i=20的下标为0;
2) i & MASK:
其中MASK=0X1F,十六进制转化为十进制为31,二进制为0001 1111,i&(0001 1111)相当于保留i的后5位。
比如i=23,二进制为:0001 0111,那么
0001 0111
& 0001 1111 = 0001 0111 十进制为:23
比如i=83,二进制为:0000 0000 0101 0011,那么
0000 0000 0101 0011
& 0000 0000 0001 0000 = 0000 0000 0001 0011 十进制为:19
i & MASK相当于i%32。
3) 1<<(i & MASK)
相当于把1左移 (i & MASK)位。
比如(i & MASK)=20,那么i<<20就相当于:
0000 0000 0000 0000 0000 0000 0000 0001 << 20
=0000 0000 0001 0000 0000 0000 0000 0000
注意上面 “|=”。位运算符及其应用 提到过这样位运算应用:
将int型变量a的第k位清0,即a=a&~(1<<k)
将int型变量a的第k位置1, 即a=a|(1<<k)
这里的将 a[i/32] |= (1<<M)); 第M位置1 .
4) void set(int i) { a[i>>SHIFT] |= (1<<(i & MASK)); } 等价void set(int i) { a[i/32] |= (1<<(i%32)); }
即实现上面提到的三步:
1.求十进制0-N对应在数组a中的下标: n/32
2.求0-N对应0-31中的数: N%32=M
3.利用移位0-31使得对应32bit位为1: 1<<M,并置1;
然后打印结果:
0=11000000000000000000000000001110
1=1000001000000000000000010
6=10000000
32位表示,实际结果一目了然了,看看1,2,3,30,31, 33,50,56,199数据所在的具体位置:
31 30 3 2 1
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAPCAIAAACJJmN7AAAByklEQVQokXXSzUvUURTG8fk3DYQiaCBoHzoTQaCm9kK5qZRZ1CYQEiyhgiBdFRFCC3tZFPkSqOgMjvO7955znm+LUUYnussDH865zzk1eoYHpUf0RElSDg6dLbg2tbDTwQMCLwDFjdNXIyjdHpHNjqrcNTjKdKH1dv3qxJO51nIxLFNShBCck54yslAySoYMvw6pTzwebdxvTi9sfN+TQBxndwa4JgdALqyK3DHvOnNPV56tbYxcn/34bX9idj4bKatyylmJCCG5Y51SJVj/ut240/oJF8bvduDBo+dv3n1wyJDPDFwL4dGPwDIcpHL7YWv1y/YPZ2RsZtfY3EuTM3PbuwcVpLM9i3AIvGdVhtVPnyfvzbfhN4w2p9uQYPHFyuLScoJqSBY3EUE5tur1+7Wd/dQONuHijam2yEGvsqWXr5Jk5xICEWBQnDAo4gi24FLjVheKAFzmMCwhoEARJoigJ/6Iy42bx+AKsFB24txW6DdUhgIGKEiwC1fGGz0UylAUSf9KUVBGuS9xitgT9eZ4kqMMiVM5uKFAkqOCMsRAQr05lk7qfcmwDCSKKCc1p4h9qDfH8ulHFLkvB9MaFEWEqX+H+q8cyvYv0jsfu2bQ+9kAAAAASUVORK5CYII=" alt="" /> aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAPCAIAAACJJmN7AAAByklEQVQokXXSzUvUURTG8fk3DYQiaCBoHzoTQaCm9kK5qZRZ1CYQEiyhgiBdFRFCC3tZFPkSqOgMjvO7955znm+LUUYnussDH865zzk1eoYHpUf0RElSDg6dLbg2tbDTwQMCLwDFjdNXIyjdHpHNjqrcNTjKdKH1dv3qxJO51nIxLFNShBCck54yslAySoYMvw6pTzwebdxvTi9sfN+TQBxndwa4JgdALqyK3DHvOnNPV56tbYxcn/34bX9idj4bKatyylmJCCG5Y51SJVj/ut240/oJF8bvduDBo+dv3n1wyJDPDFwL4dGPwDIcpHL7YWv1y/YPZ2RsZtfY3EuTM3PbuwcVpLM9i3AIvGdVhtVPnyfvzbfhN4w2p9uQYPHFyuLScoJqSBY3EUE5tur1+7Wd/dQONuHijam2yEGvsqWXr5Jk5xICEWBQnDAo4gi24FLjVheKAFzmMCwhoEARJoigJ/6Iy42bx+AKsFB24txW6DdUhgIGKEiwC1fGGz0UylAUSf9KUVBGuS9xitgT9eZ4kqMMiVM5uKFAkqOCMsRAQr05lk7qfcmwDCSKKCc1p4h9qDfH8ulHFLkvB9MaFEWEqX+H+q8cyvYv0jsfu2bQ+9kAAAAASUVORK5CYII=" alt="" /> aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAPCAIAAACJJmN7AAAByklEQVQokXXSzUvUURTG8fk3DYQiaCBoHzoTQaCm9kK5qZRZ1CYQEiyhgiBdFRFCC3tZFPkSqOgMjvO7955znm+LUUYnussDH865zzk1eoYHpUf0RElSDg6dLbg2tbDTwQMCLwDFjdNXIyjdHpHNjqrcNTjKdKH1dv3qxJO51nIxLFNShBCck54yslAySoYMvw6pTzwebdxvTi9sfN+TQBxndwa4JgdALqyK3DHvOnNPV56tbYxcn/34bX9idj4bKatyylmJCCG5Y51SJVj/ut240/oJF8bvduDBo+dv3n1wyJDPDFwL4dGPwDIcpHL7YWv1y/YPZ2RsZtfY3EuTM3PbuwcVpLM9i3AIvGdVhtVPnyfvzbfhN4w2p9uQYPHFyuLScoJqSBY3EUE5tur1+7Wd/dQONuHijam2yEGvsqWXr5Jk5xICEWBQnDAo4gi24FLjVheKAFzmMCwhoEARJoigJ/6Iy42bx+AKsFB24txW6DdUhgIGKEiwC1fGGz0UylAUSf9KUVBGuS9xitgT9eZ4kqMMiVM5uKFAkqOCMsRAQr05lk7qfcmwDCSKKCc1p4h9qDfH8ulHFLkvB9MaFEWEqX+H+q8cyvYv0jsfu2bQ+9kAAAAASUVORK5CYII=" alt="" /> aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAPCAIAAACJJmN7AAAByklEQVQokXXSzUvUURTG8fk3DYQiaCBoHzoTQaCm9kK5qZRZ1CYQEiyhgiBdFRFCC3tZFPkSqOgMjvO7955znm+LUUYnussDH865zzk1eoYHpUf0RElSDg6dLbg2tbDTwQMCLwDFjdNXIyjdHpHNjqrcNTjKdKH1dv3qxJO51nIxLFNShBCck54yslAySoYMvw6pTzwebdxvTi9sfN+TQBxndwa4JgdALqyK3DHvOnNPV56tbYxcn/34bX9idj4bKatyylmJCCG5Y51SJVj/ut240/oJF8bvduDBo+dv3n1wyJDPDFwL4dGPwDIcpHL7YWv1y/YPZ2RsZtfY3EuTM3PbuwcVpLM9i3AIvGdVhtVPnyfvzbfhN4w2p9uQYPHFyuLScoJqSBY3EUE5tur1+7Wd/dQONuHijam2yEGvsqWXr5Jk5xICEWBQnDAo4gi24FLjVheKAFzmMCwhoEARJoigJ/6Iy42bx+AKsFB24txW6DdUhgIGKEiwC1fGGz0UylAUSf9KUVBGuS9xitgT9eZ4kqMMiVM5uKFAkqOCMsRAQr05lk7qfcmwDCSKKCc1p4h9qDfH8ulHFLkvB9MaFEWEqX+H+q8cyvYv0jsfu2bQ+9kAAAAASUVORK5CYII=" alt="" /> aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAPCAIAAACJJmN7AAAByklEQVQokXXSzUvUURTG8fk3DYQiaCBoHzoTQaCm9kK5qZRZ1CYQEiyhgiBdFRFCC3tZFPkSqOgMjvO7955znm+LUUYnussDH865zzk1eoYHpUf0RElSDg6dLbg2tbDTwQMCLwDFjdNXIyjdHpHNjqrcNTjKdKH1dv3qxJO51nIxLFNShBCck54yslAySoYMvw6pTzwebdxvTi9sfN+TQBxndwa4JgdALqyK3DHvOnNPV56tbYxcn/34bX9idj4bKatyylmJCCG5Y51SJVj/ut240/oJF8bvduDBo+dv3n1wyJDPDFwL4dGPwDIcpHL7YWv1y/YPZ2RsZtfY3EuTM3PbuwcVpLM9i3AIvGdVhtVPnyfvzbfhN4w2p9uQYPHFyuLScoJqSBY3EUE5tur1+7Wd/dQONuHijam2yEGvsqWXr5Jk5xICEWBQnDAo4gi24FLjVheKAFzmMCwhoEARJoigJ/6Iy42bx+AKsFB24txW6DdUhgIGKEiwC1fGGz0UylAUSf9KUVBGuS9xitgT9eZ4kqMMiVM5uKFAkqOCMsRAQr05lk7qfcmwDCSKKCc1p4h9qDfH8ulHFLkvB9MaFEWEqX+H+q8cyvYv0jsfu2bQ+9kAAAAASUVORK5CYII=" alt="" />
0= 1 1 00 0000 0000 0000 0000 0000 0000 1 1 1 0
56 50 33
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAPCAIAAACJJmN7AAAByklEQVQokXXSzUvUURTG8fk3DYQiaCBoHzoTQaCm9kK5qZRZ1CYQEiyhgiBdFRFCC3tZFPkSqOgMjvO7955znm+LUUYnussDH865zzk1eoYHpUf0RElSDg6dLbg2tbDTwQMCLwDFjdNXIyjdHpHNjqrcNTjKdKH1dv3qxJO51nIxLFNShBCck54yslAySoYMvw6pTzwebdxvTi9sfN+TQBxndwa4JgdALqyK3DHvOnNPV56tbYxcn/34bX9idj4bKatyylmJCCG5Y51SJVj/ut240/oJF8bvduDBo+dv3n1wyJDPDFwL4dGPwDIcpHL7YWv1y/YPZ2RsZtfY3EuTM3PbuwcVpLM9i3AIvGdVhtVPnyfvzbfhN4w2p9uQYPHFyuLScoJqSBY3EUE5tur1+7Wd/dQONuHijam2yEGvsqWXr5Jk5xICEWBQnDAo4gi24FLjVheKAFzmMCwhoEARJoigJ/6Iy42bx+AKsFB24txW6DdUhgIGKEiwC1fGGz0UylAUSf9KUVBGuS9xitgT9eZ4kqMMiVM5uKFAkqOCMsRAQr05lk7qfcmwDCSKKCc1p4h9qDfH8ulHFLkvB9MaFEWEqX+H+q8cyvYv0jsfu2bQ+9kAAAAASUVORK5CYII=" alt="" /> aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAPCAIAAACJJmN7AAAByklEQVQokXXSzUvUURTG8fk3DYQiaCBoHzoTQaCm9kK5qZRZ1CYQEiyhgiBdFRFCC3tZFPkSqOgMjvO7955znm+LUUYnussDH865zzk1eoYHpUf0RElSDg6dLbg2tbDTwQMCLwDFjdNXIyjdHpHNjqrcNTjKdKH1dv3qxJO51nIxLFNShBCck54yslAySoYMvw6pTzwebdxvTi9sfN+TQBxndwa4JgdALqyK3DHvOnNPV56tbYxcn/34bX9idj4bKatyylmJCCG5Y51SJVj/ut240/oJF8bvduDBo+dv3n1wyJDPDFwL4dGPwDIcpHL7YWv1y/YPZ2RsZtfY3EuTM3PbuwcVpLM9i3AIvGdVhtVPnyfvzbfhN4w2p9uQYPHFyuLScoJqSBY3EUE5tur1+7Wd/dQONuHijam2yEGvsqWXr5Jk5xICEWBQnDAo4gi24FLjVheKAFzmMCwhoEARJoigJ/6Iy42bx+AKsFB24txW6DdUhgIGKEiwC1fGGz0UylAUSf9KUVBGuS9xitgT9eZ4kqMMiVM5uKFAkqOCMsRAQr05lk7qfcmwDCSKKCc1p4h9qDfH8ulHFLkvB9MaFEWEqX+H+q8cyvYv0jsfu2bQ+9kAAAAASUVORK5CYII=" alt="" /> aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAPCAIAAACJJmN7AAAByklEQVQokXXSzUvUURTG8fk3DYQiaCBoHzoTQaCm9kK5qZRZ1CYQEiyhgiBdFRFCC3tZFPkSqOgMjvO7955znm+LUUYnussDH865zzk1eoYHpUf0RElSDg6dLbg2tbDTwQMCLwDFjdNXIyjdHpHNjqrcNTjKdKH1dv3qxJO51nIxLFNShBCck54yslAySoYMvw6pTzwebdxvTi9sfN+TQBxndwa4JgdALqyK3DHvOnNPV56tbYxcn/34bX9idj4bKatyylmJCCG5Y51SJVj/ut240/oJF8bvduDBo+dv3n1wyJDPDFwL4dGPwDIcpHL7YWv1y/YPZ2RsZtfY3EuTM3PbuwcVpLM9i3AIvGdVhtVPnyfvzbfhN4w2p9uQYPHFyuLScoJqSBY3EUE5tur1+7Wd/dQONuHijam2yEGvsqWXr5Jk5xICEWBQnDAo4gi24FLjVheKAFzmMCwhoEARJoigJ/6Iy42bx+AKsFB24txW6DdUhgIGKEiwC1fGGz0UylAUSf9KUVBGuS9xitgT9eZ4kqMMiVM5uKFAkqOCMsRAQr05lk7qfcmwDCSKKCc1p4h9qDfH8ulHFLkvB9MaFEWEqX+H+q8cyvYv0jsfu2bQ+9kAAAAASUVORK5CYII=" alt="" />
1= 0000 0001 0000 0100 0000 0000 0000 0010
199
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAPCAIAAACJJmN7AAAByklEQVQokXXSzUvUURTG8fk3DYQiaCBoHzoTQaCm9kK5qZRZ1CYQEiyhgiBdFRFCC3tZFPkSqOgMjvO7955znm+LUUYnussDH865zzk1eoYHpUf0RElSDg6dLbg2tbDTwQMCLwDFjdNXIyjdHpHNjqrcNTjKdKH1dv3qxJO51nIxLFNShBCck54yslAySoYMvw6pTzwebdxvTi9sfN+TQBxndwa4JgdALqyK3DHvOnNPV56tbYxcn/34bX9idj4bKatyylmJCCG5Y51SJVj/ut240/oJF8bvduDBo+dv3n1wyJDPDFwL4dGPwDIcpHL7YWv1y/YPZ2RsZtfY3EuTM3PbuwcVpLM9i3AIvGdVhtVPnyfvzbfhN4w2p9uQYPHFyuLScoJqSBY3EUE5tur1+7Wd/dQONuHijam2yEGvsqWXr5Jk5xICEWBQnDAo4gi24FLjVheKAFzmMCwhoEARJoigJ/6Iy42bx+AKsFB24txW6DdUhgIGKEiwC1fGGz0UylAUSf9KUVBGuS9xitgT9eZ4kqMMiVM5uKFAkqOCMsRAQr05lk7qfcmwDCSKKCc1p4h9qDfH8ulHFLkvB9MaFEWEqX+H+q8cyvYv0jsfu2bQ+9kAAAAASUVORK5CYII=" alt="" />
6= 0000 0000 0000 0000 0000 0000 1000 0000
【问题实例】
1)已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数。8位最多99 999 999,大概需要99m个bit,大概10几m字节的内存即可。 (可以理解为从0-99 999 999的数字,每个数字对应一个Bit位,所以只需要99M个Bit==1.2MBytes,这样,就用了小小的1.2M左右的内存表示了所有的8位数的电话)
2)2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。将bit-map扩展一下,用2bit表示一个数即可,0表示未出现,1表示出现一次,2表示出现2次及以上,在遍历这些数的时候,如果对应位置的值是0,则将其置为1;如果是1,将其置为2;如果是2,则保持不变。或者我们不用2bit来进行表示,我们用两个bit-map即可模拟实现这个2bit-map,都是一样的道理。
//用char数组存储2-Bitmap,不用考虑大小端内存的问题
unsigned char flags[]; //数组大小自定义
unsigned get_val(int idx) {
// | 8 bit |
// |00 00 00 00| //映射3 2 1 0
// |00 00 00 00| //表示7 6 5 4
// ……
// |00 00 00 00| int i = idx/; //一个char 表示4个数,
int j = idx%;
unsigned ret = (flags[i]&(0x3<<(*j)))>>(*j);
//0x3是0011 j的范围为0-3,因此0x3<<(2*j)范围为00000011到11000000 如idx=7 i=1 ,j=3 那么flags[1]&11000000, 得到的是|00 00 00 00|
//表示7 6 5 4
return ret;
} unsigned set_val(int idx, unsigned int val) {
int i = idx/;
int j = idx%;
unsigned tmp = (flags[i]&~((0x3<<(*j))&0xff)) | (((val%)<<(*j))&0xff);
flags[i] = tmp;
return ;
}
unsigned add_one(int idx)
{
if (get_val(idx)>=) { //这一位置上已经出现过了??
return ;
} else {
set_val(idx, get_val(idx)+);
return ;
}
} //只测试非负数的情况;
//假如考虑负数的话,需增加一个2-Bitmap数组.
int a[]={, , , , , , , , , , , ,, , ,,,,,,}; int main() {
int i;
memset(flags, , sizeof(flags)); printf("原数组为:");
for(i=;i < sizeof(a)/sizeof(int); ++i) {
printf("%d ", a[i]);
add_one(a[i]);
}
printf("\r\n");
printf("只出现过一次的数:");
for(i=;i < ; ++i) {
if(get_val(i) == )
printf("%d ", i);
}
printf("\r\n"); return ;
}