如何确定以下代码的时间复杂度

问题描述 投票:0回答:1
public void test(int n)
{
   for(i=1;i<=n;i=i*2)
  {
     for(j=1;j<n;j=j+(j*i))
      {
         // some code
      }
  }
}

上面的代码有两个循环。执行log(n)次的外循环。我们如何计算内部循环执行的次数?以上代码的时间复杂度是多少?

algorithm time-complexity big-o complexity-theory
1个回答
1
投票

内部循环需要log_ {i + 1}(n)时间(n的对数底数i + 1)。假设n为2的幂,并使用基本公式的更改转换为以2为基数:log_ {i + 1)(n)= lg(n)/ lg(i + 1),这意味着“某些代码”将执行多次:lg(n)/ lg(2)+ lg(n)/ lg(3)+ lg(n)/ lg(5)+ ... + lg(n)/ lg(n +1)。

现在1 / lg(2)+ 1 / lg(3)+ ... + 1 / lg(n + 1)<= 1 + 1 / lg(2)+ 1 / lg(4)+ .. .1 / lg(n)= 1 + 1/1 / + 1/2 + 1/3 + ... + 1 / lg(n)〜=(1 + log(lg(n)))。

类似地,1 / lg(2)+ 1 / lg(3)+ ... + 1 / lg(n + 1)> = 1 / lg(4)+ 1 / lg(8)+ ... + 1 / lg(2n)〜=(log(lg(2n))-1)。 (使用谐波数的近似值:H(n)〜= log(n))。

因此,看来复杂度是log(n)log(log(n))。

这是一个粗略的证明,但希望能为您指明正确的方向。

© www.soinside.com 2019 - 2024. All rights reserved.