为代码

时间:2017-08-22 15:04:04

标签: java algorithm asymptotic-complexity

我在网上看了一篇文章。根据我的理解,下面代码的BigO应该是O(n)。由于循环运行n次。但文章中的正确答案显示为O(1)。随着解释

  

代码正好声明了4个变量:ijkt。 4 =常数= O(1)。

如何?

根据我的理解,循环运行n次,因此O(n)

int fibonacci(int n)
{
   int i = 0, j = 1, k, t;
   for (k = 1; k <= n; ++k)
   {
     t = i + j;
     i = j;
     j = t;
   }
   return j;
}

附上截图 enter image description here

3 个答案:

答案 0 :(得分:11)

您在时间复杂性方面错误地记忆了内存的复杂性。算法的时间复杂度为O(n)。但是,内存有时称为空间,算法的复杂性为O(1),因为分配了4个变量。

答案 1 :(得分:0)

正式地,big-O表示法描述了复杂程度。

计算big-O表示法:

识别算法复杂度的公式。比方说,例如,两个循环与另一个嵌套在内部,然后另外三个循环没有嵌套:2N²+ 3N 删除除最高术语之外的所有内容:2N² 删除所有常量:N² 换句话说,两个循环与另一个嵌套在内部,然后另外三个未嵌套的循环是O(N²)

这当然假设你循环中的内容是简单的指令。如果你在循环中有例如sort(),你将不得不将循环的复杂性乘以你的底层语言/库使用的sort()实现的复杂性

根据它的数学逻辑,程序的Big O表示法是O(N),而不是O(1)。 在这种情况下,文章是错误的,或者您对其所说的内容的理解是不正确和不完整的,只有部分文本被放在这里。

答案 2 :(得分:-1)

如果你通过&#39; n&#39;恒定值它的时间复杂度O(1)

// Here c is a constant   


for (int i = 1; i <= c; i++) {  
        // some O(1) expressions
   }

运行常数次数的循环或递归也被视为O(1)。

如果你通过&#39; n&#39;变量它的时间复杂度O(n)。

 // Here c is a positive integer constant   


for (int i = 1; i <= n; i += c) {  
        // some O(1) expressions
   }

如果循环变量以恒定量递增/递减,则循环的复杂度被视为O(n)。

来源:http://www.geeksforgeeks.org/analysis-of-algorithms-set-4-analysis-of-loops/