1.影响内部排序时间效率的是移动和比较的次数,影响外部排序时间效率的是i/o次数
2.归并的躺数越少,读写磁盘的次数就越少,归并的躺数=
第一:k为归并路数,增大k,可以降低躺数,减少io次数
第二:r为初始归并段的个数,减少r,可以降低躺数,减少io次数
可是归并路数一旦增大,内部比较的压力就会变大,内部比较效率降低。那么,增大归并路数而提高的时间效率就被内部排序给抵消了。那怎么办呢?有没有可能使得内部排序效率不受归并路数增加的影响呢?这个办法就是“败者树”,用败者树的方法挑选出最小值。
m路归并,不使用败者树,要比较m-1次,使用败者树,只需要比较log2m次,总比较次数为(n-1)log2r,与m无关(总次数有一个计算公式,刚好约掉了log2m,这里请读者阅读书籍)
所以,内部归并的比较次数与归并路数无关,只要内存空间允许,增大归并路数将有效提高排序速度,(单归并路数并不是越大越好)。
将内存缓冲区的个数增加,一次便可以排序更多的数据,使得初始归并段更长,从而初始规定段的个数更小
按照这个的思路,人们总是把归并段划分成长度相同的若干段。这样归并段的数目太多了,很影响效率,有没有可能让归并段的数目变小呢?这个方法就是“选择-置换排序”。
选择-置换的详细过程不介绍,一定要记住,选择-置换排序是用来生成初始归并段的,而且初始归并段的长度并不相同。使用选择-置换的方法又会带来另一个问题,分成了长度各不相同的归并段,那如何安排这些归并段归并的次序呢?这就引入了最佳归并树的概念,其实就是将哈夫曼树的思想推广到m叉树的情形,最佳归并树有最短的带权路径长度,代表着归并过程中读数的次数,那么总的i/o次数就是两倍wpl。
需要注意的是,在构造最佳归并树的时候,为了构成严格的m叉树,有的时候需要添加权值为0的虚结点。
