磁帶檔案排序

磁帶檔案排序

磁帶檔案的排序過程類似於磁碟檔案的排序過程,首先把檔案的記錄分段輸入記憶體進行內部排序,生成若干個有序段並把它們寫到磁帶上,然後對這些有序段進行反覆合併,最後將有序段合併成一個包含檔案中所有記錄的有序段。在磁帶檔案排序的過程中,有序段分布在不同磁帶上和在同一磁帶的不同位的情況對排序的效率有很大的影響。

基本介紹

  • 中文名:磁帶檔案排序
  • 外文名:Tape file sorting
  • 過程:類似於磁碟檔案的排序過程
  • 影響因素:所存取的數據塊在磁帶上的位置
  • 排序方法:平衡合併排序、多階段合併排序
  • 套用學科:數據結構
排序過程,影響因素,兩種排序方法,平衡合併排序,多階段合併排序,

排序過程

磁帶檔案的排序過程類似於磁碟檔案的排序過程,步驟如下:
(1)把檔案的記錄分段輸入記憶體進行內部排序,生成若干個有序段並把它們寫到磁帶上;
(2)對這些有序段進行反覆合併;
(3)最後將有序段合併成一個包含檔案中所有記錄的有序段。
至此,檔案的外部排序過程就結束了。

影響因素

因為磁帶是順序存取的設備,存取數據快的時間與所存取的數據塊在磁帶上的位置有密切關係,所以有序段分布在不同磁帶上和在同一磁帶的不同位的情況對排序的效率有很大的影響。

兩種排序方法

平衡合併排序

所謂平衡排序是指在排序的過程中,進行下一遍合併之前必須把初始有序段或上一遍合併所產生的有序段均勻地分布到各輸入帶上。
與磁碟檔案的排序一樣,對磁帶檔案進行排序所需要的時間與掃描磁帶檔案的遍數有密切關係,採用k(≥2)路合併可以減少掃描磁帶檔案的遍數。
為了避免太多的磁帶尋找時間,當前被合併的有序段必須放在各台不同的磁帶機上。因此,k路合併在合併期間至少需要k台磁帶機作為輸入。另外還需要一台作為輸出。這樣,進行k路合併至少要有(k+1)台磁帶機。如果用(k+1)台磁帶機實現k路合併,那么需要對輸出帶另外做一遍掃描,把上一遍合併時所生成的有序段均勻地分布到k台機上作為下一遍合併之用。如果使用2k台就可以避免上述的重新分布有序段的問題,因為進行k路合併時,可用其中k台作為輸入,而其餘k台作為輸出。在對檔案進行下一遍合併時把輸出帶作為輸入帶,而把輸入帶作為輸出帶。

多階段合併排序

如果使用k路合併,那么為了避免對輸出有序段重新分布所進行的掃描,就需要有2k台磁帶機。如果利用k階斐波那契數列的特性,對k路合併來講,只需要(k+1)台就可以避免對輸出有序段重新分布所進行的掃描。
在這裡,我們假定初始有序段的長度為可在記憶體進行一次內部排序的記錄個數,隨著合併的進行,新產生的有序段的長度也逐漸增加。我們用記號
表示在某台磁帶機目前有n個有序段,其中每個有序段的長度等於s個初始有序段長度之和。如果每個初始有序段有1個記錄,那么這台機上共有1×s×n個記錄。
現在已k=2為例說明多階段合併排序的執行過程。對於兩路合併來講,需要三台磁帶機,記為
。如果輸入檔案可在記憶體用內部排序產生21個初始有序段,那么多階段合併排序的過程可由七個階段所組成:
(1)從輸入檔案產生21個初始有序段,並把13個初始有序段分布在
上,把8個初始有序段分布在
上,
目前是空帶。這樣,
上有
個記錄,
上有
個記錄,而
上沒有記錄。
(2)把
上的
個記錄與
上的
個記錄個記錄合併,把合併後的
個記錄送
,這時
剩下
個記錄,
變成空帶。
(3)把
上的
個記錄與
上的
個記錄個記錄合併,把合併後的
個記錄送
,這時
剩下
個記錄,
變成空帶。
(4)把
上的
個記錄與
上的
個記錄個記錄合併,把合併後的
個記錄送
,這時
剩下
個記錄,
變成空帶。
(5)把
上的
個記錄與
上的
個記錄個記錄合併,把合併後的
個記錄送
,這時
剩下
個記錄,
變成空帶。
(6)把
上的
個記錄與
上的
個記錄個記錄合併,把合併後的
個記錄送
,這時
剩下
個記錄,
變成空帶。
(7)把
上的
個記錄與
上的
個記錄個記錄合併,把合併後的
個記錄送
,這時
都變成空帶,合併排序的過程結束。
由上述過程可知,除最後階段外,在其餘各個階段中有且只有一台磁帶機變成空帶,且各階段的空帶的台號依次取3,2,1循環輪換的。上一階段出現的空帶正好作為下一階段的輸出帶,這樣就避免了有序段的重新分布。同時,各台非空磁帶參加合併的有序段的個數就是這些磁帶中具有最少有序段的個數,因此執行某個階段之後必定出現一台空帶。在各階段中,各台非空的磁帶機參加合併的有序段的個數正好是某個斐波那契數。如果上一階段各台非空的磁帶機參加合併的有序段個數是
,那么下一階段各台非空磁帶機參加合併的有序段個數是
實現正確合併的關鍵在於選擇一種正確的初始有序段的分布,為此,我們先以k=2的情況為例找出一般的規律,然後在加以推廣。
一般來說,對於(k+1)台磁帶機的k路多階段合併排序和指定的n來說,分布在第i(1≤i≤k)台上的初始有序段的個數為:
(1)當n=0時,
(2)當n>0時,
而k台上的初始有序段的總數為

相關詞條

熱門詞條

聯絡我們