嵌套循环的复杂性

我试图找出使用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次列表.至于第二个循环,我有点迷路!
感谢您在分析中提供的帮助.每个循环都在自己的空间中,它们不在一起.

最佳答案 考虑第一个代码片段,

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.的第一个log2n项的总和.具有起始项n和公共比率1/2是(n(1-(1/2)log2n))/(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(n2logan).

点赞