分治法与递归式求解剖析
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
合并排序
MergeSort(A, p, r) { if (p < r) { q = floor((p + r) / 2); MergeSort(A, p, q); MergeSort(A, q+1, r); Merge(A, p, q, r); }
}
// 合并排序将两个已排序的子数组合并成一个有序数组 // (时间复杂度?)
其它的渐近记号
非紧上界f(n)=o(g(n)) 是指对于任意正常数 c,存在正常数n0 使得当n n0时,
f(n) < c g(n) 非紧下界f(n)=(g(n)) 是指对于任意正常数 c,存在正常数n0使得当n n0时,
f(n)> c g(n)
分治法的基本步骤
Divide: 将问题分割为若干的具有原问题类 型的子问题; Conquer: 递归求出子问题的解。当子问题 规模仍不够小而不易求解时,将子问题继 续分割。直到子问题规模足够小以便于求 解。 Combine: 合并子问题的解得到原问题的解
第二章 分治法与递归式求解
内容提要
1. 求解递归式 2. 主定理 3. 合并排序、快速排序 4. 堆排序 5. 最大和子数组问题 6. 矩阵乘积的Strassen方法
重点与难点
重 点 : Merge Sort 、 Quick-Sort 、 Maximum-Subarray 、 Strassen’s algorithm 等算法的思想及其时间复杂度的表示、递 归式的求解方法、The Master Theorem、 HeapSort算法的复杂度分析。 难点:主定理及堆排序算法的复杂度分析 。
学习目的与要求
1. 理解掌握归并排序、快速排序、最大 子数组、Strassen矩阵乘法方法的主要思 想,及其时间复杂度表示; 2. 掌握求解递归式的几种常用方法; 3. 理解主定理的思想及应用场合; 4. 理解堆排序的主要思想及算法的复杂 度分析方法。
复习: 渐近记号
渐近上界O:
f(n)=O(g(n)) 是指存在 正常数 c and n0 使得当 n n0时, f(n) c g(n) O(g(n)) = { f(n): 正常数 c and n0 s.t. f(n) c g(n) n n0}
}
T(n) (1) (1) T(n/2) T(n/2) (n)
T(n) =
T(n)=?
(1)
当 n = 1,
2T(n/2) + (n) 当 n > 1
递归式
表达式:
c
n 1
T
(n)
2T
n 2
cn
n 1
是一个递归式.
递归式例子
s(n)
c
0 s(n
1)
n0 n0
0
n0
s(n) n s(n 1) n 0
q=floor((2+2)/2)=2
30 10 40 20 60 50
30 10 40 20 60 50 30 10 40 20 60 50
Merge
30 10 40 20 60 50
10 30 40 20 60 50 10 30 40 20 60 50
q=floor((3+3)/2)=3
30 10 40 20 60 50
T(n) = 2T(n/2 + 17) + n T(n) = (n lg n)
迭代法
迭代法
展开递归式 进行若干步代数运算 求和
例如
0
n0
s(n) c s(n 1) n 0
s(n) = c + s(n-1) c + c + s(n-2) 2c + s(n-2) 2c + c + s(n-3) 3c + s(n-3) … kc + s(n-k) = ck + s(n-k)
MergeSort(A, left, right) { if (left < right) { mid = floor((left + right) / 2); MergeSort(A, left, mid); MergeSort(A, mid+1, right); Merge(A, left, mid, right); }
c
n 1
T
(n)
2T
n 2
c
n 1
c
n 1
T
(n)
aT
n b
cn
n 1
求解递归式的方法
替换法(猜想法) 迭代法 主定理 公式法
替换法
替换法
也称为 “猜测法”
先猜测答案, 然后用归纳法进行证明
例如:
猜想
T(n) = 2T(n/2) + (n) T(n) = (n lg n) T(n) = 2T(n/2) + n T(n) = (n lg n)
30 10 40 20 60 50 30 10 40 20 60 50
q=floor((1+1)/2)=1
30 10 40 20 60 50
30 10 40 20 60 50 30 10 40 20 60 50
Merge
30 10 40 20 60 50
30 10 40 20 60 50 30 10 40 20 60 50
合并排序例子
30 10 40 20 60 50
q=floor((1+6)/2)=3
30 10 40 20 60 50
q=floor((1+3)/2)=2
30 10 40 20 60 50
30 10 40 20 60 50
q=floor((1+2))/2=1
30 10 40 20 60 50
10 30 40 20 60 50 10 30 40 20 60 50
Merge
30 10 40 20 60 50
10 30 40 20 60 50 10 30 40 20 60 50
Merge
30 10 40 20 60 50
10 30 40 20 60 50 10 30 40 20 60 50
复习: 渐近记号
渐近下界:
f(n)=(g(n)) 是指 正常数 c 及 n0 使得
0 cg(n) f(n) n n0
渐近紧界:
f(n)=(g(n))是指 正常数 c1, c2, 及 n0 使得
c1 g(n) f(n) c2 g(n) n n0 f(n) = (g(n)) 当且仅当 f(n) = O(g(n)) 及 f(n) = (g(n))
类似地,对右边子序列进行合并排序
30 10 40 20 60 50Fra Baidu bibliotek
10 30 40 20 60 50
…. ..
10 30 40 20 50 60
进行合并
30 10 40 20 60 50
10 30 40 20 60 50
…. ..
10 20 30 40 50 60
合并排序算法分析
语句
时间复杂度