求解递归T(floor [n / 2])+ T(ceil [n / 2])+ n - 1

时间:2015-03-18 15:06:01

标签: algorithm big-o time-complexity recurrence

我有以下重复:

T(n) = c for n = 1.
T(n) = T(floor[n/2]) + T(ceil[n/2]) + n - 1 for n > 1.

看起来像合并排序给我,所以我猜这个重现的解决方案是Θ(nlogn)。根据掌握方法,我有:

a) Θ(1) for n = 1 (constant time).
b) If we drop the floor and ceil we have: (step1)
   T(N) = 2T(N/2) + n - 1 => a = 2, b = 2.
   logb(a) (base b) = lg(2) = 1 so n^lg(2) = n^1 = n

仔细看看,我们知道我们有主方法案例2:

 if f(n) = Θ(log(b)a) our solution to the recurrence is T(n) = Θ(log(b)a log(2)n)

解决方案确实是T(n)=Θ(nlogn),但我们不在常数因子1。 我的第一个问题是: 在第1步,我们丢弃了细胞和地板。它是否正确 ?第二个问题是我如何摆脱常数因子1?我放弃它吗?或者我应该命名为d并证明n - 1确实是n(如果是这样,我如何证明它?)。最后用替换方法证明它更好吗?

编辑:如果我们使用替换方法,我们得到:

  We guess that the solution is O(n). We need to show that T(n) <= cn.
  Substitutting in the recurrence we obtein 
  T(n) <= c(floor[n/2]) + c(ceil[n/2]) + n/2 - 1 = cn + n/2 - 1 

所以它不是合并排序?我错过了什么?

1 个答案:

答案 0 :(得分:2)

很久以前,但是这里去了

第1步我们掉了ceil和地板。这是对的吗?

我宁愿说

T(floor(n/2)) + T(floor[n/2)) <= T(floor(n/2)) + T(ceil[n/2)) 
T(floor(n/2)) + T(ceil[n/2)) <= T(ceil(n/2)) + T(ceil[n/2)) 

如果它们不相等,它们相差1(你可以忽略任何常数)

第二个问题是我如何摆脱常数因子1?

你忽略它。其背后的推理是:即使常数是巨大的10 ^ 100,与n变大时的尺寸相比也会很小。在现实生活中,你不能忽视真正的大常数,但这就是现实生活和理论的不同之处。在任何情况下,1都会产生最小的差异。

最后用替换方法

来证明它更好

你可以证明你的喜好,有些只是更简单。更简单通常更好,但除此之外'更好'没有意义。所以我的回答是否定的。