以下样本循环具有O(n ^ 2)时间复杂度 任何人都可以解释为什么它是O(n ^ 2)?因为它取决于c的价值......
循环1 ---
for (int i = 1; i <=n; i += c)
{
for (int j = 1; j <=n; j += c)
{
// some O(1) expressions
}
}
循环2 ---
for (int i = n; i > 0; i -= c)
{
for (int j = i+1; j <=n; j += c)
{
// some O(1) expressions
}
}
如果c = 0;然后它运行无限次,以类似的方式,如果c值增加,那么内循环运行的次数将减少
有人可以向我解释一下吗?
答案 0 :(得分:1)
这些代码部分中的每一部分都花费时间O(n ^ 2 / c ^ 2)。 c在这里可能被认为是严格的正常数,因此O(n ^ 2 / c ^ 2)= O(n ^ 2)。但这完全取决于背景......
答案 1 :(得分:1)
Big-O表示法是算法复杂性的相对表示。
Big-O没有说明算法在任何情况下会进行多少次迭代。
它说在最坏的情况下你的算法将进行n平方计算。如果你必须比较2种算法,那么这很有用。
在你的代码中,如果我们假设 c 是一个常量,则可以从Big-O表示法中忽略它,因为Big-O完全是关于比较以及如何缩放。常数不起作用的地方。
但是当c不是常数时,正确的Big-O表示法将是O(n ^ 2 / c ^ 2)。
通过cletus阅读this对Big-O的精彩解释。
答案 2 :(得分:0)
对于每个FIXED c,时间为O(n ^ 2)。除非c = 0,否则迭代次数大致为max(n ^ 2 / c ^ 2,n ^ 2)。对于每个固定的n,n ^ 2 / c ^ 2是O(n ^ 2)。
如果您有在循环期间更改了c的代码,您可能会得到不同的答案。