algorithm - 合并k个排序链表——分析

标签 algorithm merge list

我正在考虑针对一个问题的不同解决方案。假设我们有 K 个排序的链表,我们正在将它们合并为一个。所有这些列表共有 N 个元素。

众所周知的解决方案是使用优先级队列并从每个列表中弹出/推送第一个元素,我可以理解为什么它需要 O(N log K) 时间。

但是让我们来看看另一种方法。假设我们有一些 MERGE_LISTS(LIST1, LIST2) 过程,它合并两个排序列表,它会花费 O(T1 + T2) 时间,其中 T1T2 代表 LIST1LIST2 大小。

我们现在所做的通常是将这些列表配对并逐对合并它们(如果数字是奇数,例如,最后一个列表可以在第一步中忽略)。这通常意味着我们必须制作以下合并操作“树”:

N1, N2, N3... 代表LIST1, LIST2, LIST3 尺寸

  • O(N1 + N2) + O(N3 + N4) + O(N5 + N6) + ...
  • O(N1 + N2 + N3 + N4) + O(N5 + N6 + N7 + N8) + ...
  • O(N1 + N2 + N3 + N4 + .... + NK)

很明显,这些行将有 log(K) 行,每一行都实现了 O(N) 操作,所以 MERGE(LIST1, LIST2, ... , LISTK) 操作实际上等于 O(N log K)

我 friend 告诉我(两天前)这需要 O(K N) 时间。所以,问题是——我是在什么地方搞砸了还是他真的错了?如果我是对的,为什么不能使用这种“分而治之”的方法来代替优先队列方法?

最佳答案

如果要合并的列表数量较少,这种成对方案可能比优先级队列方法更快,因为每次合并的操作极少:基本上每个项目只有一次比较和两次指针重新分配(转移到一个新的单链表)。正如您所展示的,它是 O(N log K)(log K 个步骤处理 N 个项目)。

但我认为,最好的优先级队列算法是 O(sqrt(log K))O(log log U) 用于插入和删除(其中 U 是可能的不同优先级的数量)——如果你可以用一个值来确定优先级而不是必须使用比较——那么如果你正在合并可以给出的项目,例如整数优先级,并且 K 很大,那么您最好使用优先级队列。

关于algorithm - 合并k个排序链表——分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2705366/

相关文章:

algorithm - 网络上的泛洪算法

algorithm - 允许特殊 Action 的网格游戏 - ZCO 2009,P1

python - R - 使用行级条件变量合并两个 Data.Frame

Python: 'object in list' 检查和 '__cmp__' 溢出

java - 将arraylist对象的某些参数显示到Android中的 ListView 中

java - paintFill 函数的实现

algorithm - 从有序集中查找包含图

mysql - 从另一个网络表获取数据

python - 如何限制将特定分支 merge 到 Gitlab 中的其他分支?

python - 列表中满足条件的元素序列