繁体   English   中英

递归关系:证明(n / 2)+(n / 2)= O(n)

[英]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)中的complex1complex2 ,则总复杂度将为n * O(1)= O(n)。 这说明什么大O表示法确实:抽象从持续性因素,如complexity1complexity2了。

如果每次迭代都需要O(f(n)) ,那么您的总时间复杂度将为O(n * f(n))。

如果每次迭代都进行递归调用 ,即使用较小的参数调用dummy_algorithm ,则确实需要一个递归关系来计算时间复杂度。 递归关系的外观取决于您进行递归调用的频率和参数。 http://en.wikipedia.org/wiki/Recurrence_relation向您展示如何查找和解决适当的重复关系。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM