Linux编程:Bitmap算法道理仓酷云
学习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;
//要将一切的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 当然你不需搭建所有服务,可以慢慢来。自己多动手,不要非等着别人帮你解决问题。 学习Linux应具备的。[书籍+网络资源] Linux简单,占内存少,特别是对于程序开发人员来说很方便,如果说windows的成功在于其方便用户的窗口管理界面。 Linux操作系统这个名词记得在很早以前就听过,但当时并不知道具体是什么样的操作系统,只知道是一个与嵌入式密切相关的操作系统。 熟悉操作是日常学习Linux中的三大法宝。以下是作者学习Linux的一些个人经验,供参考: 请问谁有Linux的学习心得的吗?简单的说说? 清楚了解网络的基础知识,特别是在Linux下应用知识,如接入internet等等。 现在的linux操作系统如redhat,难点,红旗等,都是用这么一个内核,加上其它的用程序(包括X)构成的。 放手去搞。尽量不要提问,运用搜索找答案,或者看wiki,从原理上理解操作系统的本质,而不是满足于使用几个技巧。尽量看英文资料。 我感觉linux的学习,学习编程~!~!就去学习C语言编程!! 放手去搞。尽量不要提问,运用搜索找答案,或者看wiki,从原理上理解操作系统的本质,而不是满足于使用几个技巧。尽量看英文资料。 Linux是参照Unix思想设计的,理解掌握Linux必须按照Unix思维来进行。思想性的转变比暂时性的技术提高更有用,因为他能帮助你加快学习速度。
页:
[1]