代码的复杂性

只有一个循环的程序的复杂性是什么,是log n吗? 有人可以给我一些关于估算代码复杂性的想法吗?

那么,这实际上取决于该循环中发生的事情。

该循环是线性时间,即O(n):

int sum = 0; foreach( int i in SomeCollection ) { sum += i; } 

但是,请考虑在每次迭代期间执行子字符串搜索的循环。 现在你必须考虑字符串搜索算法的复杂性。 你的问题无法回答。 如果您需要有意义的答案,则需要提供代码示例。

软件复杂性

有一个研究领域试图量化这一点。

它被称为圈复杂度 。

在这种情况下,我相信你的复杂性评级是p = 2 ,因为循环是有条件的,这意味着通过该方法有两条路径。

时间复杂

如果你指的是时间复杂度 ,它仍然只是O(1),除非循环迭代计数是通过多项式或指数函数导出的,也许间接是因为该方法本身在更高的循环中被调用,或者因为循环计数器被有效地乘以通过字符串操作或更低级别的东西。

要获得一段代码的Big-O复杂性,您需要问自己“完成了多少次迭代”?

问题当然是,从代码本身中弄清楚它并不总是很容易,有时候只需要查看大图并计算完成的操作量就更好了。

例子:

 For (i = 0 ; i < n ; i++ ) { //Do stuff } 

这是一个 上 复杂

 For (i = n ; i > 0 ; i= i/2 ) { //Do stuff } 

这是一个 LOGN 复杂性...因为在每次迭代中我被减半。

 void Mess (int n) { for (i = 0 ; i < n ; i++) { //Do stuff Mess(n-1); } } 

现在这看起来像一个简单的循环,因为它用递归调用自身,它实际上非常混乱....每次迭代用n-1调用自己n次。
所以在这里从头到尾想起来会更容易。 如果n == 1,则进行1次迭代。 如果n == 2则它会调用前一个场景两次。
所以,如果我们打电话给这个function 在此处输入图像描述 ,我们可以看到我们将以递归方式获得的内容: 在 到底哪个最终会给我们n!

最重要的是,它并不总是微不足道的。

如果只有一个循环,它可能是循环体执行的次数….但是当然你可能在库调用中有许多隐藏的循环。 如果你在循环体内发生strlenmemcpy等,那么很容易做一个执行nO(n^2)或更糟的循环。

或者更糟糕的是,如果你有一个带有正则表达式的库(或语言)并且它们的正则表达式实现是天真的(比如Perl),那么很容易用一个循环O(2^n)制作一个程序! 正确编写的正则表达式实现不会发生这种情况。

如果你要问的是Big-O时间复杂度,那么对于循环来说,它是循环内任何内容的复杂性的n倍,其中n是循环计数限制。

所以。 如果循环内部的代码占用恒定时间,即如果其时间复杂度为O(1),则循环的复杂度将为O(1 * n)= O(n)。

以类似的方式,如果在循环内你有另一个循环,它将进行m步,那么你的整个代码是O(n * m),依此类推。