1. 程式人生 > >[編程珠璣]位向量與排序

[編程珠璣]位向量與排序

清除 ask IT tro 輸出 習題 clas 我們 題目

[編程珠璣]位向量與排序

源於《編程珠璣》第2版(修訂版) 第1章中第8頁習題2

什麽是位向量?

位向量是一種高效的整數結構,每一個32位的整數通過設置或清除它的某一位,可以保存32個數。如果是一個數組,則可以存更多的數。

此題目的是用於對一組小於N的無重復的非負整數排序:

1 #define BITSPERWORD 32
2 #define SHIFT 5
3 #define MASK 0x1F
4 #define N 10000000
5 int a[1 + N/BITSPERWORD];
6 void set(int i) { a[i>>SHIFT] |= (1<<(i & MASK));}
7 void clr(int i) { a[i>>SHIFT] & ~(1<<(i & MASK));} 8 int test(i) { return a[i>>SHIFT] & (1<<(1 & MASK));}

分析:

對輸入數據作如下假定:(1)都是非負整數,(2)每個整數最多出現一次,(3)最大整數小於 n。

這種方法采用哈希函數的思想,用一個整型數組 array[n] 來實現對輸入數據的排序工作。具體點就是:

(1)初始化,將數組的每個元素清 0;

(2)插入數據並實現排序,對於輸入數據 i,置 array[i] 為 1;

(3)輸出排序結果,如果 array[i] 為 1,就輸出整數 i。

如果我們用整型數組來實現排序,那麽標識一個數據需要 32 位;如果用 bool 類型數組來實現,需要 8 位;最後,如果用下面要說的位向量來實現的話,標識一個數據只需 1 位。

[編程珠璣]位向量與排序