[英]Recurrence Relations: Proving (n/2) + (n/2) = O(n)
所以说我有一个像这样的算法:
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)? 还是我完全错了?
注意:我无法将两个循环合而为一。 它们执行最终将被递归调用的操作。 您无法想到的任何其他内容。 这个问题有很多限制。
如果您确实在寻找O(x)+ O(y)= O(x + y)的证明,那么可以遵循以下原则:
R1∈O(x)∧R2∈O(y)
⇒∃ R1 <轴b。 R2 <by
⇒∃a,b。 R1 <斧∧R2 <由
⇒∃a,b。 R1 + R2 <轴+通过
⇒∃a,b。 c = max(a,b)∧R1 + R2 <cx + cy
⇒∃c。 R1 + R2 <c(x + y)
⇒R1 + R2∈O(x + y)
(N/2) + (N/2)
= 2*(N/2)
= 2N/2
= N
时间复杂度(以及是否需要递归关系) 取决于您在循环中执行的操作 ,即
//The best code you've ever seen (*complexity1*)
和
//Slightly less awesome code (*complexity2*)
是。
如果每个迭代仅需要恒定的时间量 ,即O(1)中的complex1和complex2 ,则总复杂度将为n * O(1)= O(n)。 这说明什么大O表示法确实:抽象从持续性因素,如complexity1和complexity2了。
如果每次迭代都需要O(f(n)) ,那么您的总时间复杂度将为O(n * f(n))。
如果每次迭代都进行递归调用 ,即使用较小的参数调用dummy_algorithm
,则确实需要一个递归关系来计算时间复杂度。 递归关系的外观取决于您进行递归调用的频率和参数。 http://en.wikipedia.org/wiki/Recurrence_relation向您展示如何查找和解决适当的重复关系。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.