【问题标题】:Theta Notation and Worst Case Running time nested loopsTheta 表示法和最坏情况运行时间嵌套循环
【发布时间】:2016-03-07 21:51:46
【问题描述】:

这是我需要分析的代码:

i = 1
while i < n
  do
    j = 0;
    while j <= i
       do
          j = j + 1
    i = 2i

所以,第一个循环应该运行 log(2,n),而最里面的循环应该运行 log(2,n) * (i + 1),但我很确定这是错误的。 如何使用 theta 表示法来证明它?

【问题讨论】:

    标签: algorithm performance time-complexity nested-loops big-theta


    【解决方案1】:

    考虑这一点的一种直观方法是查看循环对外循环变量i的固定值做了多少工作。这显然与 i 本身一样多。因此,如果 i 的值为 256,那么您将执行多次j = j + 1

    因此,完成的总工作是 i 在外循环执行中所取值的总和。该变量正在迅速增加以赶上 n。它的值,由i = 2i(应该是i = 2*i)给出,将类似于:2, 4, 8, 16, ...,因为当i = 1 时,我们从内部循环的2 次迭代开始。这是一个几何系列:a, ar, ar^2 ...a = 1r = 2。如您所见,最后一个术语将是n,并且该系列中将有log2 n 术语。这就是几何级数的简单求和。

    为这个算法设置最坏情况或最好情况没有多大意义,因为输入没有不同的排列,在这种情况下只是一个数字n。当特定输入(例如特定的数字序列)影响算法的运行时间时,最佳情况或最坏情况是相关的。

    那么运行时间就是sum of geometric seriesa.(r^num_terms - 1)/(r-1)):

    T(n) = 2 + 4 + ... 2^(log2 n)
         = 2 . (2^log2 n - 1)
         = 2 . (n - 1)
         ⩽ 3n = O(n)
    

    因此,您所做的工作不能超过 n 的某个常数倍数。因此,该算法的运行时间为O(n)

    您不能做一些小于 n 的某个(其他)常数倍数的工作,因为您必须通过内循环中的增量,如上所示。因此,该算法的运行时间也≥c.n,即Ω(n)

    这意味着这个算法的运行时间是Θ(n)

    【讨论】:

    • 好吧,所以最坏情况下的运行时间就是最内层循环运行的次数,对吗?以及如何使用 theta 表示法来证明它?
    • @Chris 我已经更新它的完整性,让我知道是否清楚(你可以通过接受答案这样说)。
    【解决方案2】:

    您不能在最终表达式中使用i;只有n

    您可以很容易地看到,每次到达内部循环都会执行i 次。听起来您已经弄清楚i 可以具有的不同值。所以把这些值加起来,你就得到了总的工作量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多