【问题标题】:Nested for-loop complexity嵌套的 for 循环复杂度
【发布时间】:2013-10-29 12:05:38
【问题描述】:

每个案例 (a-d) 的增长函数是什么?
我很难找到每个嵌套 for 循环的运行时间。我想我已经找到了一些,但我不确定。

a)

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

b)

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

c)

for(i = 1; i*i <= N; i=i+1);
    for(j=1; j <= i ; j=j+1);

d)

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

【问题讨论】:

  • 您的问题到底是什么? for循环的每次迭代需要多长时间?
  • 复杂性如何?你的问题还不清楚。你想知道哪一个 for 循环 (a - d) 是最复杂的吗?
  • 不,对于他们每个人,我都想找到增长函数。

标签: time complexity-theory


【解决方案1】:

这是我得到的:

增长:

  1. O(log(sqrt(N)))
  2. O(N)
  3. O(N)
  4. O(log(sqrt(N)!)) = O(sqrt(N)*log(sqrt(N))) 使用 Stirling's approximation

确切数字:[X] 是 X 的整数部分)

  1. [log([sqrt(N)])]+1
  2. 2^([log(N)]+1)
  3. [sqrt(N)]*[sqrt(N)+1]/2
  4. 不太确定。

这里有一个小检查:我用计数器实现了 for 循环,这是 N=10000000 的输出:

a(N)= 12           a(10*N)= 14
b(N)= 16777216     b(10*N)= 134217728
c(N)= 5000703      c(10*N)= 50005000
d(N)= 33861        d(10*N)= 123631

编辑:根据要求,解释
首先,一些考虑:

  • 我们正在处理整数,因此对于您看到的任何实际函数(基本上是sqrtlog),您实际上应该采用整数部分。
  • 在计算机科学领域几乎总是如此,log = log base 2

现在:

  1. i 从 1 变为 sqrt(N),但它只“使用”了 2 的幂。在 1 和 M 之间有 log(M)(实际上是 +1)2 的幂,所以使用 @ 987654338@你得到公式。

  2. i1N 的幂是 2,和以前一样。每个i 都有i js。如果我们对每个 i 的 js 求和:
    1 + 2 + 4 + 8 + 16 + ... + 2^log(N) = 2N - 1 = O(N)

  3. i1 变为 sqrt(N)。对于每个i,都有i js。和之前一样,我们将每个 i 的 js 数量相加:
    1 + 2 + 3 + 4 + 5 + ... + sqrt(N) = sqrt(N) * sqrt(N+1) / 2 = O(N)

  4. i1 变为 sqrt(N)。对于每个 ij 仅使用 2 的幂从 1 变为 i,因此对于每个 i,您都有 log(i) js。如果你为每一个 i 计算所有的 js:

    log(1) + log(2) + log(3) + log(4) + log(5) + ... + log(sqrt(N))
    对于对数的属性log(a) + log(b) = log(a*b)。将此应用于我们的总结:
    log(1*2*3*4*5*..*sqrt(N)) = log( sqrt(N)! )
    结果是什么。鉴于阶乘对于大数来说是个问题,您可以使用斯特林的近似值:ln(N!) -&gt; N*log(N) - N 来处理大数。

使用整数部分的差异示例

考虑 2。log(N) 的整数部分保持不变,直到 N 加倍。这意味着,例如,对于 N=65536 和 N=131071,此 for 循环执行相同数量的操作 (131072)。当N 变为131072(仅多一个)时,操作数翻倍(262144)。

【讨论】:

    【解决方案2】:

    您可以使用 Sigma 表示法正式解决代码片段:

    a)

    b)

    c)

    d)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-18
      • 1970-01-01
      • 1970-01-01
      • 2019-03-17
      • 1970-01-01
      • 2021-02-15
      • 2022-01-21
      相关资源
      最近更新 更多