仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1322|回复: 12
打印 上一主题 下一主题

[其他Linux] Linux编程:Bitmap算法道理仓酷云

[复制链接]
不帅 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:25:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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
精灵巫婆 该用户已被删除
沙发
发表于 2015-1-19 16:13:23 | 只看该作者
当然你不需搭建所有服务,可以慢慢来。自己多动手,不要非等着别人帮你解决问题。
愤怒的大鸟 该用户已被删除
板凳
发表于 2015-1-20 17:03:47 | 只看该作者
学习Linux应具备的。[书籍+网络资源]
柔情似水 该用户已被删除
地板
发表于 2015-1-21 06:54:08 | 只看该作者
Linux简单,占内存少,特别是对于程序开发人员来说很方便,如果说windows的成功在于其方便用户的窗口管理界面。
金色的骷髅 该用户已被删除
5#
发表于 2015-1-22 20:33:19 | 只看该作者
Linux操作系统这个名词记得在很早以前就听过,但当时并不知道具体是什么样的操作系统,只知道是一个与嵌入式密切相关的操作系统。
再见西城 该用户已被删除
6#
发表于 2015-1-31 11:31:32 | 只看该作者
熟悉操作是日常学习Linux中的三大法宝。以下是作者学习Linux的一些个人经验,供参考:
小女巫 该用户已被删除
7#
发表于 2015-1-31 18:56:04 | 只看该作者
请问谁有Linux的学习心得的吗?简单的说说?
海妖 该用户已被删除
8#
发表于 2015-2-6 16:35:09 | 只看该作者
清楚了解网络的基础知识,特别是在Linux下应用知识,如接入internet等等。
谁可相欹 该用户已被删除
9#
发表于 2015-2-8 22:05:45 | 只看该作者
现在的linux操作系统如redhat,难点,红旗等,都是用这么一个内核,加上其它的用程序(包括X)构成的。
不帅 该用户已被删除
10#
 楼主| 发表于 2015-2-26 11:38:35 | 只看该作者
放手去搞。尽量不要提问,运用搜索找答案,或者看wiki,从原理上理解操作系统的本质,而不是满足于使用几个技巧。尽量看英文资料。
透明 该用户已被删除
11#
发表于 2015-3-8 14:33:43 | 只看该作者
我感觉linux的学习,学习编程~!~!就去学习C语言编程!!
活着的死人 该用户已被删除
12#
发表于 2015-3-16 01:16:30 | 只看该作者
放手去搞。尽量不要提问,运用搜索找答案,或者看wiki,从原理上理解操作系统的本质,而不是满足于使用几个技巧。尽量看英文资料。
简单生活 该用户已被删除
13#
发表于 2015-3-22 18:12:49 | 只看该作者
Linux是参照Unix思想设计的,理解掌握Linux必须按照Unix思维来进行。思想性的转变比暂时性的技术提高更有用,因为他能帮助你加快学习速度。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-16 07:37

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表