學習一個算法題過程中涉及到外排序,就把外排序的知識複習一遍。複習中對趟數計算,我似乎覺得應該很好理解,但又好像不能透徹的理解,就問自己能不能給出一個清晰的證明。嘗試了進一步的理解。
I估計外排序的時間。
某文件共10000個記錄,設每個物理塊可以容納200個記錄,內存緩衝區可以容納5個物理塊
1)經過10次內排序後得到10個初始歸併段R1~R10
2)採用兩路歸併,需四趟可以得到排好序的文件
R1 R2 R3 R4 R5 R6 R7 R8 R9 R10
R1’ R2’ R3’ R4’ R5’
R1’’ R2’’ R3’’
R1’’’ R2’’’
R1’’’’
是得到一個初始歸併段進行內部排序所需時間的均值;進行一次讀/寫時間的均值;平均歸併一個元素所需的時間。
10個初始段的內部排序時間是10
總的I/O時間的估計方法。
計算產生R1的I/O時間。爲得到R1,R1包含的5個物理塊都要被讀入內存,然後再寫到硬盤,所以時間是10。所以得到十個初始歸併段的I/O時間是100。
計算產生R1’的時間。爲得到R1’,R1和R2的所有塊都有被陸續讀入內存,並陸續寫入硬盤,所以I/O時間是(5+5)*2=20。所以得到R1’到R5’的總的時間是100。
計算產生R1’’的時間。爲得到R1’’,R1’和R2’的所以塊都要被陸續讀入內存,並陸續寫入硬盤,所以I/O時間是(10+10)*2=40,所以得到R1’’和R2’’的總的I/O時間是80
類似,得到R1’’’的I/O時間是(20+20)*2=80
類似,得到R1’’’’的I/O時間是(40+10)*2=100
所以,總的I/O時間是(100+100+80+80+100)=460。
總的歸併時間。(10000+8000+8000+10000)=46000
II.m個初始歸併段,k路歸併的趟數s=。
結論1:如果一個k路歸併段集合的總歸併段數是,則歸併趟數是s。
證明:
進行第一趟歸併,歸併段總數是;
進行第二趟歸併,歸併段總數是;
… …
進行第s-1趟歸併,歸併段總數是k。
進行第s趟歸併,得到一個有序歸併段。
所以歸併趟數是s。結論得到證明。
結論2:所有k路歸併段集合的總歸併段數在區間的歸併段集合進行k路歸併時有相同的歸併趟數2。
證明:假設歸併集的歸併段總數是。根據上一個結論,知道歸併趟數是2.
假設一個歸併段集合的歸併段總數是m,。則有,1。進行一次歸併後歸併集合的歸併段總數是。進行第2次歸併後,就得到一個有序的歸併段。結論得到證明。
結論3:所有k路歸併集合的總歸併段數在區間(r爲正整數)的歸併段集合進行k路歸併時有相同的歸併趟數r+1。
證明:
i. r=1時,由上面的結論得到證明。
ii. 假設r=n是結論成立,即某個歸併段集合總數在,進行k路歸併時趟數爲n+1.
iii. 證明r=n+1時結論成立。假設一個歸併集合的歸併段總數是。根據上面的結論知道,這個集合的歸併趟數是n+2。
假設一個歸併段集合總數爲,則有。進行一次歸併得到新集合總數=a,並且當=a時,。因爲,所以新集合的歸併趟數爲n+1。從而得出原歸併段集合的趟數爲n+2。r=n+1時,結論得到證明。
最終結論得到證明。
結論4:歸併集合有m個初始歸併段,k路歸併的趟數s=
證明:如果m是k的整數次冪。即存在正整數r,,根據結論1,趟數。
如果m不是k的整數次冪。令。則。根據結論3,歸併趟數s=。結論得到證明。