【问题标题】:Describing the divide, conquer, combining parts of a divide-and-conquer algorithm描述分、治、组合分而治之算法的各个部分
【发布时间】: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)

我的答案尝试。

  1. 令 T(n) 为 Foo 在 p 到 r 上所做的功,因此 T(n) 等价于 Foo(p, r),其中 n 为 r - p + 1。

  2. 我得到以下递归 T(n) = T(n - 1) + Θ(n) + Θ(1)

  3. 除法部分将是一个常数 Θ(1),对应于 r-1 操作。

  4. 征服部分是递归解决子问题的 T(n - 1)。

  5. 组合部分是一个常数Θ(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


【解决方案1】:

s 从 p 累积到 r 所以这似乎属于“组合”部分。所以我们有来自组合的 Θ(n)。

当我们将元素重新组合在一起时,我们基本上必须将备份压缩到 n 个元素上。

【讨论】:

    猜你喜欢
    • 2013-02-02
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 2016-04-04
    • 2013-11-09
    • 2013-02-03
    • 2017-06-08
    相关资源
    最近更新 更多