嵌套循环的复杂性

时间:2013-05-24 20:45:20

标签: loops big-o complexity-theory nested-loops asymptotic-complexity

我试图找出使用Big O表示法的for循环的复杂性。我之前在其他课程中已经完成了这个,但是这个比其他课程更严格,因为它是在实际的算法上。代码如下:

for(i=n ; i>1 ; i/=2) //for any size n
{
    for(j = 1; j < i; j++)
    {
      x+=a
    }
}

for(i=1 ; i<=n;i++,x=1) //for any size n
{
    for(j = 1; j <= i; j++)
    {
      for(k = 1; k <= j; x+=a,k*=a)
      {

      }
    }
}

我已经到了,第一个循环具有O(n)复杂度,因为它经过n次列表。至于第二个循环,我有点迷路! 感谢您在分析中提供的帮助。每个循环都在自己的空间中,它们不在一起。

3 个答案:

答案 0 :(得分:2)

考虑第一个代码片段

for(i=n ; i>1 ; i/=2) //for any size n
{
    for(j = 1; j < i; j++)
    {
      x+=a
    }
}

指令x+=a执行总共n + n/2 + n/4 + ... + 1次。

G.P.的第一个log 2 n项的总和起始期n和公共比率1/2(n(1-(1/2) log 2 n )) /(1/2)即可。因此,第一个代码片段的复杂性是 O(n)

现在考虑第二个代码片段,

for(i=1 ; i<=n; i++,x=1)
{
    for(j = 1; j <= i; j++)
    {
      for(k = 1; k <= j; x+=a,k*=a)
      {

      }
    }
}

两个外部循环一起调用最里面的循环总共n(n+1)/2次。最里面的循环最多执行log<sub>a</sub>n次。因此,第二个代码片段的总时间复杂度为 O(n 2 log a n)

答案 1 :(得分:1)

您可以按照以下方式正式继续:

片段1:

enter image description here

片段2 (Pochhammer,G-Function和Stirling的近似)

enter image description here

使用log(G(n))

[片段2的更新]

来自“DISCRETE LOOPS AND WORST CASE PERFORMANCE”出版物的一些增强,由Johann Blieberger博士(所有案例验证 a = 2 ):

enter image description here

其中:

enter image description here

enter image description here

enter image description here

因此,

enter image description here

答案 2 :(得分:0)

编辑:我同意第一个代码块是 O (n)

你通过跳过2递减外环i,并且在内循环中你运行i次,所以迭代次数将是两个小于或小于2的所有幂的总和。等于N但大于0,即n log(n)+1 - 1,所以 O (n)。

第二个代码块是 O (log a (n)n 2 ),假设a是常量。< / p>

两个最外面的循环等于所有小于或等于n的数字之和,即n(n-1)/ 2,所以 O (n 2 )。最后,内部循环是小于n的上限的幂,即 O (log a n)。

相关问题