【问题标题】:How to determine time complexity of below code如何确定以下代码的时间复杂度
【发布时间】:2020-04-04 13:22:49
【问题描述】:
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】:

    内部循环需要 log_{i+1}(n) 时间(log base i+1 of n)。假设 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/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))。

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

    【讨论】:

    • 内部循环的复杂度为 log_{i+1}(n)。我不会将内部时间复杂度乘以其他时间复杂度,因为这不是计算复杂度的有效方法(尽管它适用于常见的多项式情况)。我计算内部运行时,并将其与外部循环所采用的值相加。老实说,这是一个相当困难的例子,如果您不了解工作原理,我不确定我能否提供进一步的帮助。
    • 注意,我很可能在工作中犯了错误。
    猜你喜欢
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 2021-10-23
    相关资源
    最近更新 更多