我的问题是如何在以下情况下实现位图? 如果图的顶点在最小生成树(MST)中,则标记相应的位;稍后通过检查位来检查它是否在MST中。
一开始,我正在考虑使用
typedef struct bit_t{
char bit0:1;
} bit;
bit bitmap[num_of_vertex];
使用位图数组记录该位;
但后来我发现sizeof(位图[num_of_vertex])是num_of_vertex字节,而不是num_of_vertex / 8字节。所以它不像我想的那样节省空间;
到目前为止,我使用
long bit_record = 0;
...
bit_record |= 1<< u;//set vertex as in MST
...
然后再检查顶点是否在MST中使用:
static bool is_in_MST(int v, int bit_record){
int mask = 1 << v;
if (mask & bit_record)
return true;
else
return false;
}
尽管代码有效,但如果num_of_vertex大于32,它将无效。
如何实现上述情况中的位图?
答案 0 :(得分:5)
情况是你只是在C中不能有1位类型。最小可寻址单位是C中的一个字节,所以即使你声明一个具有一位位字节的结构,它将被填充到一个字节(至少)。你可以做的是创建一个字节数组,然后使用除法和模数访问数组中的位。
unsigned char bitmap[0x100] = { 0 };
void set_nth_bit(unsigned char *bitmap, int idx)
{
bitmap[idx / CHAR_BIT] |= 1 << (idx % CHAR_BIT);
}
void clear_nth_bit(unsigned char *bitmap, int idx)
{
bitmap[idx / CHAR_BIT] &= ~(1 << (idx % CHAR_BIT));
}
int get_nth_bit(unsigned char *bitmap, int idx)
{
return (bitmap[idx / CHAR_BIT] >> (idx % CHAR_BIT)) & 1;
}
答案 1 :(得分:1)
关于位图,这是一个关于Programming Pearls的例子,我添加了一些注意事项:
#define BITPERWORD 32 //bits of int,which depends on your computer
#define N 10000000 // number of your elements
#define SHIFT 5 // 32 = 2^5
#define MASK 0x1F // 11111 in binary
int a[N/BITPERWORD + 1]; //space for your bitmap
// i is the the bit you want to use
void set(int i) { a[i>>SHIFT] |= (1<<(i&MASK));}
void clr(int i) { a[i>>SHIFT] &= ~(1<<(i&MASK));}
int test(int i) { return a[i>>SHIFT] & (1<<(i&MASK));}
并且不要忘记开头的初始化:
for(i=0;i<N;i++)
clr(i);