所以说我有这样的算法:
void dummy_algorithm(int a[]) {
int center = floor(a.length/2);
//For reference purposes: Loop 1
for(int i = 0; i < center; i++) {
//The best code you've ever seen
}
//Loop 2
for(int j = center + 1; j < a.length; j++) {
//Slightly less awesome code
}
}
这是非常基本的东西。我知道两个循环遍历数组的一半,从而给每个循环提供(n / 2)复杂度。但是,该方法所做的总工作显然是O(n)。
所以,我的问题是:我如何证明(通过递归关系)该算法是O(n)?或者我完全错了吗?
注意:我无法将两个循环合二为一。他们预先形成最终进入递归调用的动作。你不能想到的任何其他东西。这个问题有很多限制。
答案 0 :(得分:1)
如果您真的在寻找 O(x)+ O(y)= O(x + y)的证明,它可以按以下方式工作:
R1∈O(x)∧R2∈O(y)
⇒∃a。 R1&lt; ax∧∃b。 R2&lt;通过
⇒∃a,b。 R1&lt; ax∧R2&lt;通过
⇒∃a,b。 R1 + R2&lt; ax + by
⇒∃a,b。 c = max(a,b)∧R1+ R2&lt; cx + cy
⇒∃c。 R1 + R2&lt; C(X + Y)
⇒R1+R2∈O(x + y)
答案 1 :(得分:0)
(N/2) + (N/2)
= 2*(N/2)
= 2N/2
= N
答案 2 :(得分:0)
时间复杂度(以及是否需要递归关系)取决于您在循环中的操作,即
的复杂性//The best code you've ever seen (*complexity1*)
和
//Slightly less awesome code (*complexity2*)
是
如果每次迭代只需要一段时间,即O(1)中的 complexity1 和 complexity2 ,则总复杂度将为是n * O(1)= O(n)。这显示了Big-O-Notation真正做的事情:从 complexity1 和 complexity2 等常数因素中抽象出来。
如果每次迭代需要O(f(n)),那么您的总时间复杂度将为O(n * f(n))。
如果每次迭代进行递归调用,即使用较小的参数调用dummy_algorithm
,则需要使用递归关系来计算时间复杂度。递归关系的外观取决于您进行递归调用的频率以及使用的参数。 http://en.wikipedia.org/wiki/Recurrence_relation向您展示了如何找到并解决相应的递归关系。