【发布时间】:2011-12-31 13:35:22
【问题描述】:
我正在解决一个练习测验并遇到以下问题
写下与以下分而治之算法对应的递归,准确标记每个组件:划分、征服和组合。
1. Foo (p, r):
2. if p = r
3. return (1)
4. else
5. s ← 1
6. for i = p to r
7. s ← s * i
8. q ← Foo(p, r − 1) * s
9. return (q)
我的答案尝试。
-
令 T(n) 为 Foo 在 p 到 r 上所做的功,因此 T(n) 等价于 Foo(p, r),其中 n 为 r - p + 1。
我得到以下递归 T(n) = T(n - 1) + Θ(n) + Θ(1)
除法部分将是一个常数 Θ(1),对应于 r-1 操作。
征服部分是递归解决子问题的 T(n - 1)。
组合部分是一个常数Θ(1),用于T(n - 1) * s的乘法运算。
但这似乎是错误的,因为我没有提到 Θ(n)。第6,7行的Θ(n)应该属于分、治、合的哪一部分?
【问题讨论】:
-
嗯,上面代码中的“Theta”是从哪里来的?还是“T”?
-
@JimClay 我指的是渐近符号的 theta,并编辑了我的帖子以试图澄清我所说的 T(n) 的意思
-
哇,现在连除以1(只调用自己一次)都可以称为“分而治之”……
-
@KennyTM +1 LOL 你说得对,这是分而治之的一个非常糟糕的例子......而且算法本身没有任何意义,对于 Foo(p, r) 它计算产品r (r-1)^2 (r-2)^3 ... p^(r-p+1) ... 为什么有用?该算法也与微不足道的迭代实现一样快,因此在这里“分而治之”没有任何好处
标签: algorithm divide-and-conquer