【问题标题】:Calculate time complexity for the following snippet计算以下代码段的时间复杂度
【发布时间】:2018-05-28 03:15:28
【问题描述】:

有人可以计算一下吗?执行上述代码需要哪些步骤?

并验证解决方案,输入一些 n 值。

(找到了一些相关的问题,但没有帮助)

int count=0;
for(int i=1; i<=n ;i=i*2)
{
  for(int j=1; j<=i; j=j*2)
  {   
    count++;
  }
}

【问题讨论】:

  • 我计算了步数 log n(log n -1)/2,但没有给出 n 值的正确结果

标签: time-complexity


【解决方案1】:
         inner-loop
i = 1 --> log(1)  = 0
i = 2 --> log(2)  = 1
i = 4 --> log(4)  = 2
i = 8 --> log(8)  = 3
i = 16 -> log(16) = 4
i = 32 -> log(32) = 5
i = 64 -> log(64) = 6
.
.
.
i = n -> log(n) = log(n)

这是工作量,它将在 log(n) 次迭代后停止,因为 i 命中 n

1 + 2 + 3 + 4 +...+ log(n) = [(1+log(n))*log(n)]/2 = O(log^2(n))

【讨论】:

  • for i=1 内循环运行一次。
  • @Deven,这个额外的 1 操作不会改变最终复杂性 O(log^2(n))
  • for i=1 内部循环运行一次。所以顺序应该是: i=1 (2 提高功率 0) ---> 1 i=2 (2 提高功率 1) ---> 2 i=4 (2 提高功率 2) ---> 3 i= 8 (2 raise power 3) ---> 4 i=16 (2 raise power 4) ---> 5 ..... i= (2 raise power k-1) ----> k 总迭代次数 - --> 1+2+3+.....k-1 = k(k+1) / 2 循环将在 2 提高功率 k = n 时结束,即 k=log (n) 所以总迭代次数 = log (n ) (log (n)+1) / 2 ( log^2 (n) +log (n) ) / 2
  • 是的,但我正在尝试找到几乎完全相同的那个。但是谢谢,您的解决方案给了我提示。 (无法投票!!)
【解决方案2】:

我们可以做一张桌子:

i = 1: j = 1       --> 1 count
i = 2: j = 1,2     --> 2 counts
i = 4: j = 1,2,4   --> 3 counts
i = 8: j = 1,2,4,8 --> 4 counts

模式应该从这里清楚。我们可以重新想象这个模式,使得 i = 1, 2, 3, 4, ...,而不是从 1 到 n,让我们说它从 1 到 log n。这意味着总计数应该是从 i = 1 到 log (base 2) n of i 的总和。 i = 1 到 x 的和就是 x(x+1)/2,所以如果 x = log_2(n),那么这个和就是 (log_2(n) * log_2(n)+1)/2

编辑:好像我在某个地方犯了一个错误,我写的实际上是基于经验测试的 f(n/2)。因此,正确答案实际上是 (log_2(2n) * log_2(2n)+1)/2。尽管如此,这是我解决此类问题的逻辑

编辑 2: 发现我的错误。与其说“让我们说它从 1 到 log n”,我应该说“让我们说它从 0 到 log n”(即,我需要记录系列中每个数字的日志)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-23
    • 2022-01-19
    • 1970-01-01
    • 2019-09-27
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多