【发布时间】:2021-08-09 14:53:13
【问题描述】:
我一直在研究合并排序在链表中的应用。我看过的一些文章吹捧归并排序是对链表进行排序的最佳算法。对于分而治之策略中的征服部分来说,合并两个排序的链表是有意义的,因为最终节省了所需的内存(与数组相比)。但是,我不明白的是算法中除法步骤的时间复杂度。
对于数组,此步骤是通过利用随机访问并将数组拆分为更小的块来固定时间的。但是,对于一个链表,这不是需要额外的 O(n) 吗?我见过 Floyd 的算法(龟兔)用于找到链表的中点并将问题分成更小的块。我对除法步骤做了一些分析。假设链表的大小为n,那么刚刚划分问题所涉及的操作数如下,
n/2 + n/4 * 2 + n/8 * 4 + ... = n/2 * log(n)
从上面看来,与数组的情况相比,弗洛伊德的算法出现了一个额外的“n”因子。因此,最终的时间复杂度为 O(n^2 * log(n))。有人可以解释一下差异吗?
编辑:根据@Yves 的评论,我发现了错误,
当应该添加时,我在将已排序的块从下到上合并的同时增加了工作量。因此,净时间为:nlogn/2 + nlogn = O(nlogn),
这可能是对上述问题的最有效答案;其他答案有点间接/不提供解释
【问题讨论】:
-
你的 n log(n)/2 如何变成 O(n² log(n)) ?
-
@Yves 谢谢!分析有误,望指正
标签: algorithm linked-list mergesort