[編程珠璣]位向量與排序
阿新 • • 發佈:2018-04-22
清除 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 位。
[編程珠璣]位向量與排序