这是我想要分析的算法(见下文)。当合并排序有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])
感谢, 丹尼尔
答案 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)