高級數據結構及應用 —— 使用 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. 問題與思考
- 序列中出現負數怎么辦;
