【问题标题】:Solve: T(n) = T(n/2) + n/2 + 1求解:T(n) = T(n/2) + n/2 + 1
【发布时间】:2017-10-03 20:21:55
【问题描述】:

我很难用 O 表示法定义以下算法的运行时间。我的第一个猜测是 O(n),但迭代次数和我应用的次数之间的差距并不稳定。我如何错误地定义了这个?

public int function (int n ) 
{
  if ( n == 0) {
    return 0;
  }

  int i = 1;
  int j = n ;
  while ( i < j ) 
  {
    i = i + 1;
    j = j - 1;
  }
  return function ( i - 1) + 1;
}

【问题讨论】:

  • 确切地说,bit-O 是针对上限的,所以有很多可能的答案。例如,说这个算法是 O(n*n) 是正确的,但相当具有误导性。如果可能,通常最好使用 big-Theta 来说明运行时间。已接受答案中的分析对大 Theta 同样有效。

标签: time-complexity computer-science asymptotic-complexity computer-science-theory


【解决方案1】:

while 大约在 n/2 时间执行。

递归被执行为n 一个大约是原始n 一半的值,所以:

n/2 (first iteration)
n/4 (second iteration, equal to (n/2)/2)
n/8
n/16
n/32
...

这类似于geometric serie

事实上它可以表示为

n * (1/2 + 1/4 + 1/8 + 1/16 + ...) 

所以它收敛到n * 1 = n

所以 O 表示法是 O(n)

【讨论】:

    【解决方案2】:

    另一种方法是将其写为T(n) = T(n/2) + n/2 + 1
    while 循环执行n/2 工作。传递给下一个调用的参数是 n/2

    使用master theorem 解决此问题,其中:

    • a = 1
    • b = 2
    • f = n/2 + 1

    Let c=0.9
    1*(f(n/2) + 1) <? c*f(n)
    1*(n/4)+1 <? 0.9*(n/2 + 1)
    0.25n + 1 <? 0.45n + 0.9
         0    <  0.2n - 0.1 
    

    这是:

    T(n) = Θ(n)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-21
      • 2012-06-24
      相关资源
      最近更新 更多