【问题标题】:What is the time complexity of the merge step of mergesort?合并排序的合并步骤的时间复杂度是多少?
【发布时间】:2017-03-04 18:25:21
【问题描述】:

我知道这个算法的时间复杂度是 o(nlogn),但是如果我们只讨论合并步骤,这仍然是 o(nlogn) 吗?还是减少到 o(logn)?我相信第二个是答案,但由于我们仍然必须触及数组中的每个元素,我怀疑复杂性保持不变

干杯!

【问题讨论】:

  • 这取决于您使用的合并。传统上,每个人都使用 O(n) 合并。我会很高兴看到 O(lg n) 合并。
  • 你说得对。 “拆分”步骤是采用o(logn)的步骤,而合并步骤是o(n)。我混淆了时间复杂性。这解决了我的问题。谢谢!!!
  • 数组的分步时间复杂度为 O(1)。问题是自顶向下合并排序需要 log2(n) 级递归或自下而上合并排序需要 log2(n) 次迭代,每个递归级别或每次迭代的合并需要 O(n),所以总是 O(n log(n))。
  • 这里有两个可能的问题: 1. 在归并排序期间,归并所花费的总时间是被排序数组长度的函数? 2. 一次合并花费了多少时间,作为被合并数组长度的函数?这两个问题的答案截然不同;您感到困惑的原因可能是您将它们混为一谈。
  • 会有(n-1)次比较,每次都需要一个时间单位。因此当我们选择比较作为基本操作时,合并步骤的时间效率为O(n)。跨度>

标签: algorithm sorting mergesort


【解决方案1】:

“拆分”步骤是o(logn),合并是o(n),通过注释才意识到。

【讨论】:

  • 拆分步骤不需要 O(log n) 时间。这也需要时间 O(n)。 O(log n) 因素来自于总结在所有递归级别上执行所有合并所需的工作。
【解决方案2】:

合并排序的拆分步骤将采用 O(n) 而不是 O(log(n))。 如果我们有split step的runtime函数:

T(n) = 2T(n/2) + O(1)

其中 T(n) 是输入大小 n 的运行时间,2 是新问题的数量,n/2 是每个新问题的大小,O(1) 是将数组分成两半的常数时间。

我们还有基本情况:T(4) = O(1) 和 T(3) = O(1)。

我们可能会想出(不太准确):

T(n) = n/2 * O(1) = O(n/2) = O(n)

另外,要了解Merge step(手指算法)的时间复杂度,我们应该了解子数组的数量。

子数组的数量在最坏情况下的渐近增长率 = O(n/2 + 1) = O(n)。

“手指算法”随着子数组数量的增长线性增长,它将遍历每个子数组 O(n),并且在最坏的情况下,每个子数组需要再循环 2 个times -> 合并步骤的时间复杂度(手指算法)= O(2n) = O(n)。

【讨论】:

    猜你喜欢
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    相关资源
    最近更新 更多