关于算法:两个for循环的时间复杂度

Time Complexity of two for loops

本问题已经有最佳答案,请猛点这里访问。

所以我知道时间的复杂性:

1
2
3
4
5
for(i;i<x;i++){
   for(y;y<x;y++){
      //code
   }
}

是n ^ 2

但会:

1
2
3
4
5
6
for(i;i<x;i++){
   //code
}
for(y;y<x;y++){
   //code
}

是n + n?


由于big-O表示法不是要比较绝对复杂度,而只是比较相对的,O(n + n)实际上与O(n)相同。每次加倍x时,你的代码将花费两倍于之前的代码,这意味着O(n)。你的代码是通过2个,4个还是20个循环无关紧要,因为无论100个元素需要多长时间,200个元素需要两倍的时间,10万个元素需要100倍的时间,无论多长时间这是在哪个循环中花费的。

这就是为什么big-O没有说绝对速度的原因。假设O(n ^ 2)函数f()总是比O(log n)函数g()慢,谁是错误的。 big-O表示法只表示如果你继续增加n,那么g()将在速度上超过f(),但是,如果n在实践中总是保持低于该点,则f()可以在实际程序代码中总是比g()快。

例1
假设f(x)对于单个元素需要5ms而g(x)对于单个元素需要100ms,但是f(x)是O(n ^ 2),g(x)是O(log2n)。时间图将如下所示:

enter image description here
注意:最多7个元素,f(x)更快,即使它是O(n ^ 2)。
对于8个或更多元素,g(x)更快。

例2
二进制搜索是O(log n),理想的哈希表(没有冲突)是O(1),但是相信我,哈希表并不总是比现实中的二进制搜索更快。使用良好的散列函数,散列字符串可能比整个二进制搜索花费更多的时间。另一方面,使用差的哈希函数会产生大量冲突,冲突越多意味着哈希表查找实际上不会是O(1),因为大多数哈希表以一种方式解决冲突,这将使查找O(log2 n)或甚至O(n)。


这将是2n,所以是的,你是对的。

它通常只表示为O(n),因为它是线性的而不是二次的。

它当然取决于循环中的代码,但我想你已经知道了。