Algorithm 递推关系:证明(n/2)+;(n/2)=O(n)

Algorithm 递推关系:证明(n/2)+;(n/2)=O(n),algorithm,complexity-theory,time-complexity,Algorithm,Complexity Theory,Time Complexity,假设我有一个这样的算法: 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

假设我有一个这样的算法:

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
   }
}
void dummy_算法(int a[]{
内部中心=楼层(a.长度/2);
//供参考:循环1
对于(int i=0;i
这是很基本的东西。我知道这两个循环都会遍历数组的一半,因此每个循环的复杂性为(n/2)。然而,该方法所做的总功显然是O(n)

所以,我的问题是:我如何证明(通过递归关系)这个算法是O(n)?还是我完全错了

注意:我不能将两个循环合并为一个。它们执行最终进入递归调用的操作。任何你能想到的东西都是不允许的。这个问题有很多限制。

时间复杂度(以及是否需要递归关系)取决于您在循环中执行的操作,即

  (N/2) + (N/2)
= 2*(N/2)
= 2N/2
= N
//The best code you've ever seen (*complexity1*)

如果每次迭代只需要恒定的时间量,即O(1)中的复杂性1和复杂性2,则总复杂性将为n*O(1)=O(n)。这显示了真正的功能:从复杂度1和复杂度2等常量因素中抽象出来

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


如果每次迭代都进行递归调用,即使用较小的参数调用
伪_算法
,则需要一个递归关系来计算时间复杂度。递归关系的外观取决于进行递归调用的频率以及使用什么参数。向您展示如何找到并解决适当的递归关系。

如果您真的在寻找O(x)+O(y)=O(x+y)的证明,它将沿着以下路线工作:

R1&in;O(x)∧ R2&in;O(y)
⇒ ∃ A.R1 ⇒ ∃ a、 b。R1 ⇒ ∃ a、 b。R1+R2 ⇒ ∃ a、 b。c=最大值(a,b)∧ R1+R2 ⇒ ∃ CR1+R2
⇒ R1+R2&in;O(x+y)

你真的需要证明O(n/2+n/2)在O(n)中吗?这就是我所说的平凡。你的代码使用两个循环,所以假设循环的内容都是
O(n)
,那么你实际上有
O(n)+O(n)
,这就是
O(2n)
,它与
O(n)
相同。递归关系是用来分析递归函数的。@Kolink(可能不是在证明时,而是在寻找答案时)。@Kolink
O(N/2)
所有标准代数规则都是完全有效的渐近数学。它恰好与
O(N)
相同。O(N)+O(N)不是O(2N)。它仍然是O(N)。@Sani:两者都是,因为O(2N)=O(N)忽略常数因子是大O的全部原因…这只显示O(x)+O(y)\n子部分O(x+y),但另一个方向是类似显示的。因此+1。谢谢大家!非常需要澄清!
 //Slightly less awesome code (*complexity2*)