外排序时间估计和趟数计算的理解

学习一个算法题过程中涉及到外排序,就把外排序的知识复习一遍。复习中对趟数计算,我似乎觉得应该很好理解,但又好像不能透彻的理解,就问自己能不能给出一个清晰的证明。尝试了进一步的理解。

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=。结论得到证明。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章