集合 {1,2,5,4,7},可以用位图表示为 01101101。
随机生成1000000个1到1000000的数字,进行排序。这时可以用位图算法,一位0和1表示是否存在。
示例如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define BITSPERWORD 32
#define SHIFT 5
#define MASK 0x1F
#define N 1000000
int a[1+N/BITSPERWORD];
//设置0或1
void set(int i)
{
a[i>>SHIFT] |= (1<<(i & MASK));
}
//清0
void clr(int i)
{
a[i>>SHIFT] &= ~(1<<(i & MASK));
}
//查询0或1
int test(int i)
{
return (a[i>>SHIFT] & (1<<(i & MASK)));
}
int main()
{
int i;
int r;
srand((unsigned)time(NULL));
for (i=0; i<N; i++)
{
clr(i);
}
for (i=0; i<N; i++)
{
r = rand()%N;
set(r);
}
for(i=1; i<=N; i++)
{
if(test(i))
{
printf("%d ", i);
}
}
printf("\n");
printf("running time:%f\n",(double)clock() / CLOCKS_PER_SEC);
return 0;
}