【问题标题】:finding the time complexity求时间复杂度
【发布时间】:2013-09-22 19:06:55
【问题描述】:

我试图了解复杂性的细微差别 下面的每个例子。

示例 A

int sum = 0;
for (int i = 1; i < N; i *= 2)
   for (int j = 0; j < N; j++)
      sum++;

我的分析:

第一个 for 循环执行 lg n 次。
内循环独立于外循环,每次外循环执行N次。

所以复杂度一定是:
n+n+n...lg n次

因此复杂度为n lg n

这是正确的吗?

示例 B

int sum = 0;
for (int i = 1; i < N; i *= 2)
   for(int j = 0; j < i; j++)
      sum++;

我的分析:

第一个 for 循环执行 lg n 次。
内循环的执行依赖于外循环。

那么当内循环的执行次数取决于外循环时,我该如何计算复杂度呢?

示例 C

int sum = 0;
for (int n = N; n > 0; n /= 2)
   for (int i = 0; i < n; i++) 
      sum++;

我认为示例 C 和示例 B 必须具有相同的复杂性,因为内循环执行的次数不取决于外循环。

这是正确的吗?

【问题讨论】:

    标签: c algorithm time-complexity


    【解决方案1】:

    在示例 B 和 C 中,内部循环执行 1 + 2 + ... + n/2 + n 次。在这个序列中恰好有lg n 术语,这确实意味着int i = 0 执行lg n 次,但是内部循环中语句的总和是2n。所以我们得到O(n + lg n) = O(n)

    【讨论】:

    【解决方案2】:

    (a) 你的分析是正确的

    (b) 外循环进行 log(N) 次。内部循环以 1, 2, 4, 8, ... 的顺序进行 log(N) 次,这是一个几何级数,等于 (approx) O(2^log(N)) 或最高倍数的两倍。

    例如:1 + 2 + 4 = (approx)2*41 + 2 + 4 + 8 = (approx)2*8

    因此总复杂度为O(2^log(N)) = O(N)

    (c) 这和(b)倒序一样

    【讨论】:

    • 更正确的说法是这是geometric series 的总和,也导致了 O(2^log n)(我认为是 O(n))。
    • 2^log(N) 等于 N;复杂度是 O(n)
    • @Dukeling 我对 O(2^logn) 如何到达那里有一点灰色地带。在 C 部分,内循环运行 log(n) 次,外循环运行 log(n) 次。所以应该是log(n) * log(n) ==> (log(n))^2 然后怎么变成2^log(N) ??
    • @AchalaYasasPiyarathna 内循环运行的次数取决于外循环,不能直接说是log N。由于geometric series sums 的公式,您可以直接从1 + 2 + 4 + 8 + ... + N(这是内部循环实际运行的次数)到达O(2^log N)
    【解决方案3】:

    精细时间复杂度

    I=1;
    K=1;
    While(k<n)
    {
        Stmt;
        K=k+i;
        I++;
    }
    

    【讨论】:

      猜你喜欢
      • 2018-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-13
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多