輸入:
所輸入的是一個檔案,至多包含n個正整數,每個正整數都要小於n,這是 n = 10^7。如果輸入時某個整數出現了兩次,就會產生一個致命的錯誤。這些整數與其他任何資料都不關聯。
輸出:
以增序形式輸出的經過排序的整數列表。
基本思想:使用一個具有一千萬位的字串表示該檔案,在該字串中,若且唯若整數i在該檔案中時,第i個位才開啟(設為1)。解決該問題的過程可以分為三個自然階段。第一個階段關閉所有的位,將集合初始化為空白集。第二個階段讀取檔案中的每個整數,並開啟相應的位,建立該集合。第三個階段檢查每個位,如果某個位是1,就寫出相應的整數,從而建立已排序的輸出檔案。如果n是向量中位的數目(在本例中是10000000),該程式可以用偽碼如下表示:
/*phase 1: initialize set to empty */
for i = [0, n]
bit[i] = 0;
/*phase 2: insert present elements into the set */
for each i in the input file
bit[i] = 1;
/*phase 3: write sorted output */
for i = [0,n)
if bit[i] == 1
write i on the output file
原則:
位元影像資料結構 此資料結構代表了有限域中的稠集(dense set),每一個元素至少出現一次,沒有其他的資料和元素相關聯。即使不滯這些條件(例如存在多重元素或額外資料時),也可以使用有限域中的鍵作為表索引(表具有更複雜的條目)
多通道(Multiple-Pass)演算法 這些演算法具有多個輸入資料的通道,每讀一次就向完成前進一步。
時間和空間的權衡 二者不可偏廢。
簡單的設計 與複雜程式相比,簡單程式通常要更加可靠、安全、健壯和有效些,構建和維護時也要更加容易一些。
Technorati Tags: 編程珠璣,演算法,排序,磁碟排序