【问题标题】:Finding an algorithm for merging sorted list寻找合并排序列表的算法
【发布时间】:2016-07-14 11:09:03
【问题描述】:

问题如下: 有 k 个长度为 n/k 的排序列表(我们假设 k 除以 n)。 我需要找到一种算法,将这些列表合并到一个长度为 n 的列表中 运行时间复杂度为 O(k + nlogk)。

我正在考虑按情侣合并列表, 而不是由夫妻再次合并合并的列表,依此类推,当我到达一个长度为 n 的排序列表时我停止了。

当我计算我的算法的时间复杂度时,我得到了 O(nlogk),它比所需的时间更短。

我想知道我的方式是否错误。 感谢您的帮助!

【问题讨论】:

  • 解释你是如何得到这个结果的。
  • 在每次迭代中,合并列表需要 O(n),并且我们有 log k 次迭代。 @KarolyHorvath
  • 假设k
  • O(n log k) 对我来说听起来不错。由于它更小,它也是 O(k + n log k)。所以我会说任务解决了。
  • @Codor 见我的评论。通过一次“迭代”,OP 意味着将所有当前列表合并到该数字的一半。 IE。如果从 8 个列表开始,则在第一次迭代中将它们合并为 4,在第二次迭代中合并到 2,最后合并到 1。在每次迭代中,您必须查看所有 n 个元素,并且有 logk 次迭代,因此 O(nlogk)。 +k 可能来自选择合并的 k-1 对。

标签: algorithm data-structures


【解决方案1】:

你的方法很好。

如果给定 k=1,则 O(n log k) = O(k + n log k)。 “我们假设 k 除以 n”这句话暗示了这两者,所以你的结果就是它们应该是的。

如果我们放宽这些条件,那么我们必须考虑 k>n 的情况,并且其中一些 k 列表是空的。然后你必须担心合并所有这些空列表所花费的时间,而你的算法需要 O(k + n log k) 时间。

【讨论】:

    【解决方案2】:

    很容易看出 O(nlogk) 是 O(k + nlogk),因为 @MattTimernans 提到的 k

    【讨论】:

      【解决方案3】:

      据我了解,运行时间是可以达到的

      O(k^2*(n/k)) = O(kn)
      

      通过以下想法。假设列表按非降序排序。迭代直到所有列表都为空。在每次迭代中,使用k 步骤来确定哪个列表的第一个元素相对于列表的所有第一个元素是最小的。从列表中删除元素并将其附加到结果中。

      【讨论】:

      • 但是 O(nk) 超过了所需的 O(k+nlogk)。
      猜你喜欢
      • 1970-01-01
      • 2015-07-22
      • 2022-07-08
      • 2013-08-04
      • 2017-01-03
      • 2021-06-27
      • 2014-12-02
      • 1970-01-01
      • 2012-01-18
      相关资源
      最近更新 更多