位圖(bitmap)—— C語言實現


高級數據結構及應用 —— 使用 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. 問題與思考

  • 序列中出現負數怎么辦;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM