我正在观看关于合并排序的Coursera普林斯顿算法讲座,我理解所有分析,除了合并最多6 n log n数组访问。
为什么6?
答案 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页。)