我对这些算法的时间复杂性有一些疑问:
These are all the possible options for these algorithms
算法1
int i=0, j=0, sum = 0;
while i*i < n {
while j*j < n {
sum = sum + i * j;
j = j+2;
}
i = i+5;
}
//我真的不知道这个可能是什么,但我的糟糕逻辑表明O(sqrt(n))
算法2
sum = 0;
for (i=0; i<=n; i++){
j = n;
while j>i {
sum = sum + j - i;
j = j – 1;
}
}
//虽然我知道这个算法有一些嵌套循环,但我不知道实际答案是否为O(n ^ 2)
算法3
for (int i=0; i<=n; i++)
for (int j=0; j<=n; j++){
k = 0;
while k<n {
c = c+ 1;
k = K + 100;
}
}
//我相信这个时间复杂度为O(n ^ 3),因为它有3个嵌套循环
算法4
Algorithm int f(int n) {
if n==0 or n == 1
return n
else
return f(n-2)+f(n-1)
//我知道这个算法是O(2 ^ n),因为它是斐波那契的不良实现
我想我知道答案可能是什么,但我想对他们得到第二意见。提前谢谢。
答案 0 :(得分:1)
好的,这就是我的想法,粗体答案
我认为这是最有趣的算法。让我们从一个简单的案例中构建它
让我们暂时假设它只是2个嵌套循环,只检查i,j
是<n
而不是这些值的平方。现在,i
和j
分别增加5
和2
的事实是无关紧要的。复杂性只是 O (n 2 )。
现在让我们考虑支票实际上是i*i < n
和j * j < n
这一事实。这意味着你的迭代器的有效值是它们的平方而不仅仅是它们的绝对值。如果它只是一个循环,那么复杂性就是 O ( sqrt (n))。但由于我们有2个嵌套循环,因此复杂性变为 O ( sqrt (n)* sqrt (n)),它变为 0 (n)的强>
你的推理是正确的。它是 O (n 2 )
你的推理是正确的。它是 O (n 3 )
我不认为这是斐波纳契实现,但你的时间复杂性猜测是正确的。为什么我不认为这是一个斐波那契是因为这个算法需要大量的反向工作。您可以发送类似10
的内容,甚至不是斐波那契数字。
一种很好的思考方式就是二叉树。在您的情况下,每个节点,对fn
1
或0
的{{1}}的每次调用都会产生2个孩子。每次调用都会从发送的初始值中删除1
,例如n
。因此会有n
级别。深度为n
的二叉树中的最大节点数为2 n - 1.因此 O (2 n )是对的