计算机问题求解关于递归与分治法合

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Maximum subarray
简单的遍历所有可能的子序列
下面的过程遍历的顺序为: (0,0), (0,1), …, (0,n-1); (1,1), (1,2), …, (1,n-1), …… (n-2,n-2), (n-2, n-1), (n-1,n-1)
MaxSum = 0; for (i = 0; i < N; i++) { ThisSum = 0; for (j = i; j < N; j++) { ThisSum += A[j]; if (ThisSum > MaxSum) MaxSum = ThisSum; } } return MaxSum;
Part 1
Part 2
问题5:跨中点的部分如何计算?
非递归代价:常量
递归,理想状况下 问题规模是原来的 一半。 非递归代价: 线性
非递归代价: 常量
O(n log n)
矩阵乘法:似乎非得(n3)
1个n阶方阵相乘的问题 可以分解为8个n/2阶方 阵相乘的子问题。
仍然是立方复杂度
问题6:
决定上面的递归代价 比较大的原因是什么?
c((1/16)n)2
c((1/16)n)2
……
…… c((1/16)n)2
3 cn 16
2
2
T(1) T(1) T(1) T(1) T(1) T(1) T(1) T(1) T(1) T(1)T(1)T(1) T(1) T(1)
log 43 n


Note:3
lo g n 4
问题3:
如何考虑分治算法的代价?
递归代价与非递归代价
导出递归式
两次递归,理想情 况下每次问题规模 是原来的一半。
非递归开销
cn log n
确实比插入 排序效率高。
n
这里似乎假设n是2的整次幂,在我们涉 及的大多数情况下,这不影响结果。
问题4:
书上的投资回报问题是怎样 被转化为最大子数组问题的?
the sequence
i=0 i=1 i=2 j
in O(n2)
i=n-1
用分治法解最大子数组问题
Part 1 the sub with largest sum may be in: recursion Part 2
Part 1 or:
Part 2
The largest is the result
n/2
T(n/2)
n/2
T(n/4)
n/4
T(n/4)
n/4
T(n/4)
n/4
T(n/4)
n/4
对应于 T(n)=T(n/2)+T(n/2)+n 的递归树
对应于分治法的递归树方程

divide-and-conquer:
T(n) = aT(n/b) + f(n)

After kth expansion:
log ba n
a2 f (n/ b2)

Note: a
lo g n b
n
lo g a b
Total ?
Solving the Divide-and-Conquer

T(n)=aT(n/b)+f(n)作为一种典型的分治算法递归式:



Let base-cases occur at depth D(leaf), then n/bD=1, that is D=lg(n)/lg(b) Let the number of leaves of the tree be L, then L=aD, that is L=a(lg(n)/lg(b)). By a little algebra: L=nlg(a)/lg(b), lg(a)/lg(b)=logba
n
lo g 3 4
Total: (n2)
T(n)=aT(n/b)+f(n)
f(n) f(n )
a
f(n/b) f(n/b) f(n/b)
af(n/ b)
a
logbn f(n/b2) f(n/b2) f(n/b2) f(n/b2) f(n/b2) f(n/b2) f(n/b2) f(n/b2) f(n/b2) …… …… … T(1) T(1) T(1) T(1) T(1) T(1) T(1) T(1) T(1) T(1) … T(1) T(1) T(1)
问题7:源自文库
你能否描述Strassen 方法的基本思想?
复杂的组合为了减少一次乘法
诸Si只需通过加减法计算
这个算法曾经引起轰动
问题8:
你对于这个结果是否有感性认识?
问题9:
为什么降低子问题个数会导致 复杂度的阶下降?
递归树
T(size) T(n) n nonrecursive cost
T(n/2)
lg a L b 2 2 lg n lg b
lg n lg b
lg n lg a lg b
log a b 2 n
lg a lg n lg b
因此,这个值决定了树的“胖”度。
Divide-and-Conquer: the Solution




The recursion tree has depth D=lg(n)/ lg(c), so there are about that many row-sums. The 0th row-sum is f(n), the nonrecursive cost of the root. logb a n The Dth row-sum is , assuming base cases cost 1, or ( ) in any event. The solution of divide-and-conquer equation is the non-recursive costs of all nodes in the tree, which is the sum of the row-sums.
计算机问题求解 – 论题2-3 - 分治法与递归
2013年03月12日
Mergesort Revisited
问题1:
这个算法究竟是如何“排”序的?
5
2
4
7 Divide
1
3
2
6
conquer
5 2 4 7
1
3
2
6
Divide further, until…
问题2:
人的思维“分而治之” 如何变为算法策略的呢?
k 1 n k i 1 n T ( n ) a T a f k i 1 b i b 1
T(n)=3T(n/4)+(n2)
cn2 cn2
3 cn 16
2
c(¼
n)2
c(¼ n)2
c(¼
n)2
log4n c((1/16)n)2 c((1/16)n)2 …… ……
相关文档
最新文档