合并k个链表的时间复杂度为O(nk log(k))

时间:2016-02-20 19:36:42

标签: algorithm merge linked-list time-complexity

我知道有几个问题,但我无法解决我的问题。

问题很简单:合并k n长度排序链表。

有许多答案,使用k长度优先级队列,复杂度为O(n log(k))

不知道如何。以下是链接Merging K- Sorted Lists using Priority Queue

这让我觉得我错了。所以我的解决方案是:

要合并两个n长度列表,我们需要O(2n)时间。

  1. 在合并每一对时合并两个==== k / 2合并* 2n时间的列表 留下k / 2,2n长度列表
  2. 重复步骤1,直到你离开1个n * k大小的数组。
  3. 所以时间的复杂性就是。

    k / 2 * 2n = k * n

    k / 4 * 4n = k * n

    k / 2 ^ x * 2 ^ x n = k n

    最后一项将是k * n,其中2 ^ x = k或x = log(k)

    所以总log(k)次迭代在每次迭代中进行k * n次比较。所以时间复杂度为O(k * n * log(k))

    有人可以告诉我哪里错了吗?

    感谢您的时间。

1 个答案:

答案 0 :(得分:2)

除非另有说明,否则当算法的复杂性以表示时,N是输入的大小。因此,当我们“合并k个链表是O(N log k)”时,我们的意思是N是所有列表中元素的总数。

正如您所说,合并k个m长度列表是O(km log k)。这里输入的大小是km(元素的总数),因此这与上面的陈述一致。

但是,你的陈述并不那么强烈,因为它只涵盖了相同长度的k个列表。 “合并k个链表是O(N log k)”是真的无论如何在列表中分配这些N个元素。