Algorithm 任何循环(比如for循环)的实际时间复杂度是多少?
当我们必须计算一个循环的复杂度时,比如说一个FOR循环(它需要运行n次),当FOR循环的条件失败并且中断时,我们是否也应该计算迭代次数 下面是一个例子:Algorithm 任何循环(比如for循环)的实际时间复杂度是多少?,algorithm,time-complexity,Algorithm,Time Complexity,当我们必须计算一个循环的复杂度时,比如说一个FOR循环(它需要运行n次),当FOR循环的条件失败并且中断时,我们是否也应该计算迭代次数 下面是一个例子: i和n是正整数 for(i=0;i<n;i++) { //some code. All are constant expressions and there are no break statements. } for(i=0;i计算函数计算复杂度的主要目的是确定该函数是否会随着n的增加而扩展,而不是确定它将为特定的n值运行多少次
i
和n
是正整数
for(i=0;i<n;i++)
{
//some code. All are constant expressions and there are no break statements.
}
for(i=0;i计算函数计算复杂度的主要目的是确定该函数是否会随着n的增加而扩展,而不是确定它将为特定的n值运行多少次。例如,当n为1时,循环可能运行得非常快,但如果n突然变为1000,它是否会(大约)运行是原来时间的1000倍,还是你在寻找一个更高的因素
像您给出的那样的for循环将始终运行(最坏情况下)n次。无论n是100还是10^30,循环都将涉及n次迭代。从更大的角度来看,对该循环进行额外的比较是无关紧要的;如果您处理的是10^30次迭代,那么一次额外的迭代将不会产生任何影响。如果您确实需要确切地说,引入一些常量。a
是检查循环条件一次的时间,b
是运行循环中所有命令的时间。循环将在以下总时间内运行:
a(n+1) + bn = (a+b)n + a
但是,由于其他答案所解释的原因,您很少需要如此精确。当n
比a
大得多时,执行a
一次的时间与全局无关。这就是为什么我们删除所有低阶项和常量,并说:
(a+b)n + a ∈ Θ(n)
如前所述,时间复杂度是渐进的——这意味着如果你有一个从1到n的循环
不管你在循环中做了多少次操作,只要它们是最终的,复杂度将是O(n)
,因为O(10000n)=O(n)
时间复杂度是不考虑常数的。正如MZF所说,..O(an+c)=O(n)其中‘a’和‘c’是常数。但如果for循环中还有一个循环,那么时间复杂度将是O(a(n^2)+c),依此类推……无论如何,O(n+1)
是O(n)
,就像任何给定的g
,O(f+g)=O(f)
由于计算复杂度是渐近的。是的,我理解这一点,但准确地说,如果我必须知道时间复杂度将计算多少次迭代,那么这算什么?这没有意义-复杂度的定义是有原因的。它与迭代次数无关。它与n
影响迭代次数。在这种情况下,它是线性的,即O(n)
。想象一下:如果你为不同的n
绘制迭代次数,它会是一条直线吗?n/100
也是线性的,O(n)
,例如。是@Keyser,我理解。可能我在这里的问题不太清楚。我知道对于时间复杂度(读取Big-O),常数被消除,因为它们不依赖于N(输入大小)。所以O(N+1)=O(N),O(2N)=O(N)以此类推,我想说的是,前面提到的FOR循环的复杂度将需要多少次迭代,n或n+1,尽管它们将得到相同的答案。