[读书笔记]位图法

       对于自然数序列,如果序列元素范围比较集中,那么位图法是一个巧妙的实现诸如排序和检索之类的工作的方法,再配合位逻辑运算的话,可以在时间和空间效率上都达到较好的水平。我们为了实现这个方法,首先构造一个位向量,然后通过定义以下三个基本的函数,再以序列元素值取操纵这些函数,从而完成所需功能。

 

#define SHIFT 3
#define BMASK 0x7

const int n = 1000;
unsigned char map[n/8 + 1];


void set(const int i)
{
	map[i >> SHIFT] |= 1 << (i & BMASK);
}

void clear(const int i)
{
	map[i >> SHIFT] &= ~(1 << (i & BMASK));
}

bool test(const int i)
{
	return map[i >> SHIFT] & (1 << (i & BMASK));
}

 

       值得注意的是右移操作,在有些平台中,如果右移操作的实现是在左端补1,上面的函数将有错误!至于哪些平台补0,哪些补1,额,我也知道得不具体。。。

       当然,位图法是巧妙的,但也知识众多奇妙技巧中的一员而已,对于C++,标准模板库中的bitset的功能已完全覆盖我们上面所作的工作。所以,更多的恐怕是要去探索更好更简洁的思路,正如Jon Bentley在《编程珠玑》中所表明的意思:与其花1分钟时间思考,然后花一天的时间来写代码(PS: 话说,对我等菜鸟来讲,写代码也是一种极力的思考啊!思想的考验啊!智商的考验啊!),不如先花1个钟头来思考,再用一个钟头来实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值