【问题标题】:Tricky time complexity棘手的时间复杂度
【发布时间】:2014-08-08 08:03:06
【问题描述】:

我已经非常擅长计算时间复杂度,但仍然对如何确定指数时间算法感到困惑。下面的算法具有最坏情况下的运行时间 O(k^n)。他们是如何得到这个值的?第一个 for 循环花费 n 时间,第二个 for 循环花费 k 时间,第三个带有 q 的 for 循环令人困惑。如果运行时间是 n * k * q-something,他们是如何得到 O(k^n) 的?

int exp(k, n) {
    power = 1
    for i = 1 to n {
        newpower = 0
        for j = 1 to k {
            for q = 1 to power {
                newpower++
            }  
        }
        power = newpower
    }
    return (power)
}

【问题讨论】:

  • 第三个 for 循环在哪里?
  • "第三个 for 循环在哪里?"他这很棘手。
  • 永远不要在你累死的时候发帖。更新了代码。

标签: algorithm time-complexity


【解决方案1】:

你给出的算法复杂度不是O(k^n)。复杂度只是O(nk)。该算法评估 nk

【讨论】:

  • 实际上,它评估k n 次:)
  • @Deepu 您的答案仅对问题的第一个(未完成)版本正确。
【解决方案2】:

O(k^n) 对我来说似乎是正确的。

j-q-loop 总共有 k * power 迭代。但是power 每次i-loop 迭代都会以指数方式更新。

  • i=1j-q-loopk * 1迭代时。
  • i=2j-q-loopk * k迭代。
  • i=3j-q-loopk * (k*k)迭代。
  • i=mj-q-loopk * (k^(m-1))迭代。

k*(k^(m-1)) 就是 k^m,其中 1 O(k^n)。

【讨论】:

    【解决方案3】:

    第三个循环出现后,O(k^n) 的复杂度就说得通了。

    首先你必须看到算法计算k^n

    • q-loop 将当前power 添加到newpower
    • k-loop 运行 q-loop k 次,所以这个计算 k * power
    • 这是由 i-loop 执行 n

    所以你得到k* .... k*(k*(k*1)) (n-times) = k^n

    现在我们知道算法计算k^n,它只通过加1来做到这一点,所以他需要加k^n1,所以复杂度是O(k^n)(Θ(k^n)确切地说)

    【讨论】:

      【解决方案4】:

      这个

             for q = 1 to power {
                  newpower++
             }  
      

      可以简化为

             newpower += power;
      

      还有这个

          newpower = 0
          for j = 1 to k {
              for q = 1 to power {
                  newpower++
              }  
          }
          power = newpower
      

         power *= k;
      

      所以它实际上是通过重复递增来计算k^n。这是O(k^n)

      【讨论】:

        【解决方案5】:

        要解决这些棘手的问题,您必须仔细计算正在执行的指令数量,这并不总是那么容易(可能需要更高的数学水平)。

        在这个问题中,让我们尝试计算 newpower++ 发生的次数(即最内层循环中的循环数),并在 k 循环的块中查看它。在第一次运行中,有 k 个块,每个运行 1 个:

        1 1 1 1 ...
        = 循环 1*k 次 = k 次

        然后幂 = k。然后我们有 k 个 k 块: k k k k ...
        = 循环 k*k 次 = k^2 次​​p>

        继续这个模式,你会看到newpower++执行的次数是:
        k + k^2 + k^3 + ... k^n 次。

        但是 k^n 项支配其余项,因此您只剩下 O(k^n)。

        【讨论】:

          猜你喜欢
          • 2011-02-28
          • 2016-02-13
          • 2012-08-14
          • 2013-09-12
          • 2018-08-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多