【问题标题】:Compute the complexity of the following Algorithm? [duplicate]计算以下算法的复杂度? [复制]
【发布时间】:2014-10-12 19:58:57
【问题描述】:

计算以下算法的复杂度?

我有以下代码sn-p:

i = 1;
while (i < n + 1) {
    j = 1;
    while (j < n + 1) {
        j = j * 2;
    }
    i = i + 1;
} 

请详细解释一下

我想知道解决问题的步骤,以便我可以解决此类问题

【问题讨论】:

  • 内循环采用O(log(n)),因为j 呈指数增长。外循环采用O(n),因为i 线性增长。因此总体复杂度为O(n*log(n))
  • @Jarod42:OP 很可能是指i&lt;n+1
  • @Jarod42:哈哈,不,这里有 cmets 的最小长度 :)

标签: c++ algorithm time-complexity


【解决方案1】:

这个类似于下面的代码:

for( int i = 1;i < n+1 ; i++){ // this loop runs n times
    for(int j = 1 ; j<n+1 ; j=j*2){// this loop runs log_2(n)(log base 2 because it grows exponentially with 2)
      //body
    }
} 

因此在 Big-Oh 表示法中它是 O(n)*O(logn) ;即 O(n*logn)

【讨论】:

    【解决方案2】:

    你可以像下面这样继续:

    【讨论】:

    • cn * log(n+1) = O(n) 怎么办?
    • 一个小错误,抱歉。
    【解决方案3】:

    您可以简单地理解外循环(使用i),因为它恰好循环了n 次。 (1, 2, 3, ..., n)。但是内循环(j) 有点难理解。

    假设n 是8。它循环了多少?从j = 1开始,它会以指数方式增加:1、2、4、8。当j超过8时,循环将终止。它恰好循环了 4 次。然后我们可以考虑这个问题的一般形式......

    想想这个序列 1, 2, 4, 8, ...。如果 n 是 2^k(k 是非负整数),内循环将占用 k+1 次。 (因为 2^(loop-1) = 2^k)由于假设:n = 2^k,我们可以说k = lg(n)。所以我们可以说内循环需要lg(n)+1 次。

    n 不完全适合 2^k 时,它需要多一点时间。 ([lg(n)]+1) 虽然它有地板功能,但复杂性并不是什么大问题。这次你可以考虑了。

    所以总成本将是这样的:n*(lg(n)+1)。如果您熟悉 Big-O 表示法,可以表示为:O(n lg n)

    【讨论】:

    • 哦,我是慢慢写的……
    • 没关系,你终于帮助了一些人理解了。
    【解决方案4】:
    i = 1;
    while(i < n + 1){
        j = 1;
        While(j < n + 1){
            j = j * 2:
        }
    
        i = i + 1;
    } 
    

    外循环需要 O(n),因为它以常数递增。

    i = 1;
    while(i < n + 1){
    
        i = i + 1;
    } 
    

    内循环:j = 1, 2, 4, 8, 16, ...., 2^k
    j = 2^k (k >= 0) j什么时候停止?
    当 j == n,
    对数(2^k)=对数(n)
    => k * lg(2) = lg(n) ... 所以 k = lg(n)。

    While(j < n + 1){
    
            j = j * 2;
    }
    

    所以总 O(n * lg(n))

    【讨论】:

      【解决方案5】:

      由于j 呈指数增长,内部循环采用O(log(n))

      由于i 是线性增长的,所以外部循环采用O(n)

      因此整体复杂度为O(n*log(n))

      【讨论】:

      • +1 表示简洁、正确的答案和正确使用数学单词。
      • @Conduit:谢谢 :) ... 简洁是什么意思?
      • 非常感谢 Barak manos,但请详细说明:p
      • @sangeen:更多细节??考虑到代码的庞大规模,这有点困难......
      • @sangeen:对不起,但我不认为这个网站是为了让人们向其他人提供足以让他们的老师给他们满分的答案。我为你提供了一个基本的答案(顺便说一下,对你的问题投了赞成票),我认为你在这里完成剩下的工作是合理的。
      猜你喜欢
      • 1970-01-01
      • 2016-04-06
      • 1970-01-01
      • 2013-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多