【问题标题】:Time Complexity of two for loops [duplicate]两个for循环的时间复杂度[重复]
【发布时间】:2011-08-17 20:17:00
【问题描述】:

所以我知道时间复杂度:

for(i;i<x;i++){
   for(y;y<x;y++){
      //code
   }
}

是 n^2

但会:

for(i;i<x;i++){
   //code
}
for(y;y<x;y++){
   //code
}

n+n?

【问题讨论】:

    标签: algorithm complexity-theory big-o


    【解决方案1】:

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

    这就是为什么 big-O 没有提及绝对速度的原因。谁假设 O(n^2) 函数 f() 总是比 O(log n) 函数 g() 慢,那就错了。 big-O 表示法只是说,如果你不断增加 n,就会有一个点 g() 会在速度上超过 f(),但是,如果 n 在实践中始终保持在该点以下,那么 f() 可以在实际程序代码中总是比 g() 快。

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


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

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

    【讨论】:

    • +1 为您解答。只是对您的解释的补充-> O(kn) = O(n) 其中k是任何非负常数并且n>=0。在这种情况下 O(2n) = O(n)。通常,O(kf(n)) = O(f(n)) 其中 f(n) 是 n 的函数。有关渐近符号的更多信息,请参阅 wiki en.wikipedia.org/wiki/Big_O_notation
    • 您的第二段指出 O(n^2) 并不总是比 O(log n) 慢。你能举一个具体的例子吗?如果我plot n^2 and log n,我看不到曲线相交。 O(log n) 似乎总是更快。我的思维错误在哪里?
    • @Lernkurve 我删除了我之前的评论,而是将它包含的示例迁移到我上面的答案中。
    【解决方案2】:

    应该是 2n,所以是的,你是对的。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多