【发布时间】: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