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