我在网上看了一篇文章。根据我的理解,下面代码的BigO应该是O(n)。由于循环运行n次。但文章中的正确答案显示为O(1)。随着解释
代码正好声明了4个变量:
i
,j
,k
和t
。 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;
}
答案 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/