我正在阅读一篇关于非常受欢迎的网站(下面给出的链接)的循环时间复杂度分析的文章,根据该文章,下面第1和第2循环的时间复杂度是O(1)和O(n)分别。 但我认为两个循环的时间复杂度是相同的O(n)
for (int i = 1; i <= c; i++) {
// some O(1) expressions
}
我的推理:`c * n = O(n)
在通过下面的答案之后,我的推理是错误的,因为没有变化的输入n。循环运行是固定的c次。因此,无论输入值n如何,循环都将运行恒定时间。所以O(1)复杂性
for (int i = 1; i <= n; i += c) {
// some O(1) expressions
}
我的推理:c*n=O(n)
我错过了什么吗?如果有人可以提供帮助和解释,我将不胜感激
这是文章的链接:http://www.geeksforgeeks.org/analysis-of-algorithms-set-4-analysis-of-loops/
答案 0 :(得分:3)
运行常数次数的循环或递归也是 被视为O(1)。
此处:C
是一个常量值。所以基本上,无论n
// Here c is a constant
for (int i = 1; i <= c; i++) {
// some O(1) expressions
}
同样在第二圈:
for (int i = 1; i <= n; i += c) {
// some O(1) expressions
}
您的原因c*n = O(n)
不正确。这里
按C
增加。对于n
元素,循环发生n/c
渐近O(n/c) ~ O(n)
答案 1 :(得分:2)
for(int i = 1; i&lt; = c; i ++){// some O(1)expressions}
此处c
是常量。所以基本上,无论n
的值如何,您都在执行恒定的操作次数。这就是为什么它被视为常数复杂性O(1)
。
for(int i = 1; i&lt; = n; i + = c){// some O(1)expressions}
您正在使用输入值n
进行循环,该值基本上随程序或算法的给定输入而变化。现在,c
也是一个常量,对于n
的所有不同值,它将保持不变。复杂性被视为O(n)
。
for(int i = 1; i&lt; = n; i ++){// some O(1)expressions}
这与上述内容相同,只是c
的值为1
。
所有复杂性都以渐近符号格式表示。 常数因子将被删除,因为无论n
的值如何,它们都是相同的。
答案 2 :(得分:1)
1)图片中没有n
,我不知道为什么你认为O(n)
。 loop
来自1 to c
,因此其O(c)
和c
是常量,复杂度为O(1)
。
2)循环从1
开始直至n
,每步增加c
。显然,复杂性为O(n/c)
,渐近为O(n)
。
答案 3 :(得分:0)
O(1):此循环的复杂性为O(1),因为它运行恒定的时间c。
// Here c is a constant
for (int i = 1; i <= c; i++) {
// some O(1) expressions
}
O(n):如果循环的增加或减少恒定量,则循环的复杂度为O(n)。例如,这些循环具有O(n)时间复杂度。
// Here c is a positive integer constant
for (int i = 1; i <= n; i += c) {
// some O(1) expressions
}
for (int i = n; i > 0; i -= c) {
// some O(1) expressions
}