合并排序时间复杂度与我的算法。大O.

时间:2012-08-09 13:14:17

标签: big-o analysis asymptotic-complexity

这是我想要分析的算法(见下文)。当合并排序有O(n)时,我不明白为什么这会有O(n logn)时间复杂度,他们似乎都在做同样的事情。

然后两者具有相同的j时间复杂度,如果你将j保留为行2^j X c(n/2^j) = cn并且它们的运行时间都为log n,其中n是数字元素。

Algorithm: BinarySum(A, i, n)
Input: An array A and integers i and n.
Output: The sum of the n integers in A starting at index i.
if n = 1 then
return A[i]
return BinarySum(A, i, [n/2] ) + BinarySum(A, i + [n/2], [n/2])

感谢, 丹尼尔

3 个答案:

答案 0 :(得分:2)

您正在处理数组中每个成员的常量时间。无论你如何做到这一点,最终的复杂性将是O(n)。顺便说一句,如果你使用笔和纸方法作为一个简单的例子,你会发现实际上你正在调用数组的元素,就像它们出现在数组中一样,这意味着这个算法相当于简单的迭代求和。

O(n)复杂性的形式证明直接来自Master theorem。算法的递归关系是

T(n) = 2 T(n/2)

由定理的案例1涵盖。从这个复杂性计算为

O(n ^ log_2_(2)) = O(n)

对于合并排序,其递归关系为

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

这是一个完全不同的故事 - 大师定理的案例2。

答案 1 :(得分:0)

算法的递推公式为;

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

而合并排序的递推公式为;

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

因为有两个递归调用+一个对O(n)的合并函数的调用。你的函数只进行两次递归调用,检查分解;

http://www.cs.virginia.edu/~luebke/cs332.fall00/lecture3/sld004.htm

答案 2 :(得分:0)

考虑以下伪代码:

 1    MergeSort(a, p, r)
 2      if  P<r                                // check for base case
 3      then q = FLOOR p+r/2                   // Divide
 4      MergeSort(a, p, q)                     // conquer
 5      MergeSort(a, q+1, r)                   // conquer
 6      Merge(a, p, q, r)                      // Merge

现在复杂性如下:

第3行: - O(1),因为它需要恒定的时间。

第4行: - T(n / 2)因为它对一半元素进行操作。

第5行: - T(n / 2)因为它对一半元素进行操作。

第6行: - T(n)因为它对所有元素进行操作

现在使用@Lunar提到的递归关系,我们可以说时间复杂度相当于: - O(nlgn)