高级数据结构及应用 —— 使用 bitmap 进行字符串去重

位图应当具备的置一,清零,以及判断三大功能:

#define BITS_PER_WORD 32
#define MASK 0x1f
#define SHIFT 5
            // BITS_PER_WORD 与 MASK、SHIFT 是相匹配的,
            // 如果 BITS_PER_WORD 为 8,则 SHIFT 为 3,MASK 为 0x07
            // 如果 BITS_PER_WORD 为 64,则 SHIFT 为 6,MASK 为 0x3f
            // 同样的存储位图的数组的元素类型也要发生相应的改变,BITS_PER_WORD == 8,char
            // BITS_PER_WORD == 64, ⇒ long long
#define N 10000000
int a[1+N/BITS_PER_WORD];

void set(int i) {
    a[i >> SHIFT] != (1 << (i & MASK));
}
            // a[i >> SHIFT] ⇒ 返回的是int整型,也是长度为 32 的 bit 比特串;
void clr(int i) {
    a[i >> SHIFT] &= ~(1 << (i & MASK));
}

int test(int i) {
    return a[i >> SHIFT] & (1 << (i & MASK));
}

1. 排序以及去重

int main(void) {
    int i;
    for (i = 0; i < N; ++i)
        clr(i);
    while (scanf("%d", &i) != EOF) 
        set(i);
    for (i = 0; i < N; ++i) {          // 自然是有序,且不重复的
        if (test(i)) {
            printf("%d ", i);   
        }
    }
    printf("\n");
}

2. 问题与思考

  • 序列中出现负数怎么办;
posted on 2018-07-13 20:39  未雨愁眸  阅读(2055)  评论(0编辑  收藏  举报