|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
学习python,无论你是打算拿他当主要开发语言,还是当辅助开发语言,你都应该学习他,因为有些时间我们耗不起。
【甚么是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(以下图:)
<br>
然后遍历这5个元素,起首第一个元素是4,那末就把4对应的地位为1(能够如许操纵p+(i/8)|(0x01<<(i%8))固然了这里的操纵触及到Big-ending和Little-ending的情形,这里默许为Big-ending),由于是从零入手下手的,以是要把第五地位为一(以下图):
<br>
然后再处置第二个元素7,将第八地位为1,,接着再处置第三个元素,一向到最初处置完一切的元素,将响应的地位为1,这时候候的内存的Bit位的形态以下:
<br>
然后我们如今遍历一遍Bit地区,将该位是一的位的编号输入(2,3,4,5,7),如许就到达了排序的目标。
【Bit-map排序实例】
上面的代码给出了一个BitMap的用法:排序。
//界说每一个Byte中有8个Bit位
#include<memory.h>
#defineBYTESIZE8
voidSetBit(char*p,intposi)
{
for(inti=0;i<(posi/BYTESIZE);i++)
{
p++;
}
*p=*p|(0x01<<(posi%BYTESIZE));//将该Bit位赋值1,1左移posi%BYTESIZE位,即标识上这一名。
return;
}
voidBitMapSortDemo()
{
//为了复杂起见,我们不思索正数
intnum[]={3,5,2,10,6,12,8,14,9};
//BufferLen这个值是依据待排序的数据中最年夜值断定的
//待排序中的最年夜值是14,因而只必要2个Bytes(16个Bit)
//就能够了。
constintBufferLen=2;
char*pBuffer=newchar[BufferLen];
//要将一切的Bit地位为0,不然了局不成预知。
memset(pBuffer,0,BufferLen);
for(inti=0;i<9;i++)
{
//起首将响应Bit位上置为1
SetBit(pBuffer,num);
}
//输入排序了局
for(inti=0;i<BufferLen;i++)//每次处置一个字节(Byte)
{
for(intj=0;j<BYTESIZE;j++)//处置该字节中的每一个Bit位
{
//判别该位上是不是是1,举行输入,这里的判别对照笨。
//起首失掉该第j位的掩码(0x01<<j),将内存区中的
//位和此掩码作与操纵。最初判别掩码是不是和处置后的
//了局不异
if((*pBuffer&(0x01<<j))==(0x01<<j))
{
printf("%d",i*BYTESIZE+j);
}
}
pBuffer++;
}
}
int_tmain(intargc,_TCHAR*argv[])
{
BitMapSortDemo();
return0;
}
【Bit-map有用代码】
Bit-map基础的代码能够收拾以下:
#defineBITMAP_SET(map,p)((void)(((char*)(map))[(p)/CHAR_BIT]|=1<<(p)%CHAR_BIT))
#defineBITMAP_CLEAR(map,p)((void)(((char*)(map))[(p)/CHAR_BIT]&=~(1<<(p)%CHAR_BIT)))
#defineBITMAP_FLIP(map,p)((void)(((char*)(map))[(p)/CHAR_BIT]^=1<<(p)%CHAR_BIT))
#defineBITMAP_TEST(map,p)(((char*)(map))[(p)/CHAR_BIT]&(1<<(p)%CHAR_BIT))
【合用局限】
可举行数据的疾速查找,判重,删除,一样平常来讲数据局限是int的10倍以下
【基础道理及要点】
利用bit数组来暗示某些元素是不是存在,好比8位德律风号码
【扩大】
Bloomfilter能够看作是对bit-map的扩大
【成绩实例】
1)已知某个文件内包括一些德律风号码,每一个号码为8位数字,统计分歧号码的个数。
网络操作命令:ifconfig、ip、ping、netstat、telnet、ftp、route、rloginrcp、finger、mail、nslookup |
|