为什么mergesort最多有6 n个log n阵列访问?

时间:2015-10-21 17:31:47

标签: algorithm sorting mergesort array-algorithms

我正在观看关于合并排序的Coursera普林斯顿算法讲座,我理解所有分析,除了合并最多6 n log n数组访问。

为什么6?

2 个答案:

答案 0 :(得分:2)

要获得6个数组访问,这是一个效率稍低的合并过程:

read  - read an element from even run for compare
read  - read an element from odd  run for compare
      - compare
read  - read the lower element again for copy
write - write the lower element to the output array for copy
...   - after merge copy back
read  - read element from output array to copy back
write - write element back to original array to copy back

正常情况是每个元素移动一次读取和一次写入,但考虑元素太大而不能容纳变量的情况,如字符串,因此在比较之后,必须读取要移动的字符串再次。

通常可以避免复制操作,具体取决于合并排序的编码方式。

答案 1 :(得分:0)

我也想知道6.我看过Tim Roughgarden的分析(视频' 1-7 - 合并分类 - 分析(9分钟).mp4')他也说了六个。每个解释都像挥手,但也许因为它很简单,他们没有意识到需要解释:

复制到辅助阵列时,每次n(或k)访问数组两次 aux[k] = a[k]; 然后,在最坏的情况下,你永远不会耗尽一个子阵列(你只是比较常量),这样你就有四个阵列访问 else if (less(aux[j], aux[i])) a[k] = aux[j++];(例如,如果输入的顺序相反)或者每个比较失败并且其他比较(正确的顺序)或两者的某种组合之后开始。这并不重要,只是根据最坏情况的定义,您无法通过常量(使用if (i > mid)else (j > hi))来逃避数组访问,因此您已经获得了四个每个k更多。总计是6。

(每行代码都是Sedgewick的 - 他的文字第p271页。)