【问题标题】:How does O(log log N) complexity loop look like? [duplicate]O(log log N) 复杂性循环是什么样的? [复制]
【发布时间】:2015-10-03 12:15:18
【问题描述】:

我有一个非常基本的问题

for(int i = 1; i < N/2; i++) {

}

我最初的理解是上述循环的时间复杂度为 O(logn),但在阅读了一些文章后,很明显它只是 O(n),而 O(logn) 看起来像 for (i = 1; i &lt;= n; i *= 2)

现在我的问题是O(log log N) 循环是什么样的?

【问题讨论】:

标签: algorithm data-structures time-complexity complexity-theory


【解决方案1】:

O(log n)循环:

for (i = 1; i <= n; i *= 2)

所以你在每一步都加倍i。基本上:

  1. 增量 => O(n)
  2. 加倍 => O(log n)
  3. ??? => O(log log n)

乘法之后会发生什么?指数。所以这将是O(log log n):

for (i = 2; i <= n; i *= i) // we are squaring i at each step

注意:您的循环是O(n),而不是O(log n)。与上面的increment / double / exponentiate 理念保持一致,您可以使用增量重写循环:

for(int i = 1; i < n; i += 2)

即使你增加更多,它仍然是增加,仍然是O(n)

【讨论】:

  • @piechuckerr i *= 2表示i 在每次循环迭代后翻倍。 N / 2 表示您始终使用一半的 NN 在你的情况下永远不会改变它的价值。以n= 64 为例。您将迭代 i = 1, 2, 3, 4, 5, 6, 7, ..., 64 / 2 = 32。我的示例将针对i = 1, 2, 4, 8, 16, 32, 64 进行迭代。注意到区别了吗?
【解决方案2】:

那个循环看起来不像 O(log N)。它就是这样,一个 O(N/2) 循环。引用定义:

函数 f(x) 被称为 O(g(x)) 当且仅当存在一个正实数 c 和一个实数 x0 使得 |f(x)| = x0。例如,您也可以调用该循环 O(N)、O(N^2)、O(N^3),因为您可以轻松找到所需的参数。但是,您找不到适合 O(log N) 的参数。

至于 O(log log N),我想您可以重写此处给出的插值搜索实现 https://en.wikipedia.org/wiki/Interpolation_search 以使用 for 循环。平均为 O(log log N)!

【讨论】:

    【解决方案3】:

    您的成本不是 O(logN),您的成本是 O(N*logN)。

    阅读link 你会看到一个函数示例:

    无论多项式开头的数字是最大的多项式。

    在你的情况下是

    1/2 * n * log(n) ,其中 1/2 没有区别,您的复杂度是 O(N*logN)

    【讨论】:

      猜你喜欢
      • 2011-12-12
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 2017-01-25
      • 1970-01-01
      • 2015-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多