第3章 分治法PPT课件
因而这可能如可这独解为增条以否果以条立公问加特满利具考特的共题,征足用备虑征,的贪的因是的分了涉则子计此应,治前及分问心算大用此法两到治题算复部分特完条分法,法杂分治征全特治要此或性问法反取征法做时动一题的映决,的许虽态般满前了于而效多然规是足提递问不率也划随这,归题具,必可。着个它思是备如要用问特也想否第果的分题征是的具三各工治规。大应有条子作法模多用这特 问,,的数条征题重但增问特,是复一加题征则不地般, 用动态规划较好。
分析✓:分比解较出x和的a各的个中子间问元题素是a[相mi互d]独,立若的x=。a[mid],则x在L中的 分可用位如a的分面用[m析以条置x后析或条在id:确件就面:后件]a的定是查面。如很中前找查果xm显的是面i找然nx话d否即=;查此x,1在可是如即找问x表。独必果只x题即中无立然x有分<可。论的排a一解;[因是子m在个出如i此在问ad元的[]果m,这前题素子ix由d个面,,>]问的a于问还因则[题i前]a题是此,只是相面满后满同要递互,足面足理比增独所分查分我较排立以治找治们这序,我法法x只个的,即们的的要元,其在只第第在素因方a要一四[a和i此法][在的m个个x假都就i前适适d] 和在a中查找x一样,只不过是查找的规模缩小了。这就说明 了此问题满足分治法的第二个和第三个适用条件。
第3章 分治法
内容提要
一、分治基本思想 二、二分搜索 三、归并排序 四、分治法的基本模式 五、快速排序 六、大整数的乘法 七、矩阵乘法 八、选择问题:找第k小元素
知识要点
❖ 分治法的基本模式 基本思想 适用范围 基本步骤
❖ 应用举例 ❖ 掌握每一个分治算法的基本思想。
学习要求
❖ 掌握使用分治策略设计算法的基本思路 ❖ 熟悉典型问题的分治算法
二分搜索技术
人们从大量实践中发现,在用分治法设计算法时, 最好使子问题的规模大致相同。即将一个问题分成 大小相等的k个子问题的处理方法是行之有效的。 这种使子问题规模大致相等的做法是出自一种平衡 (balancing)子问题的思想,它几乎总是比子问题 规模不等的做法要好。
分治法的复杂性分析
一个分治法将规模为n的问题分成k个规模为n/m的子问题去 解。设分解阀值n0=1,且adhoc解规模为1的问题耗费1个单位 时间。再设将原问题分解为k个子问题以及用merge将k个子问 题的解合并为原问题的解需用f(n)个单位时间。用T(n)表示该分 治法解规模为|P|=n的问题所需的计算时间,则有:
分治法的基本步骤
divide-and-conquer(P)
{ if ( | P | <= n0) adhoc(P); //解决小规模的问题 divide P into smaller subinstances P1,P2,...,Pk;//分解问题 for (i=1,i<=k,i++) yi=divide-and-conquer(Pi); //递归的解各子问题 return merge(y1,...,yk); //将各子问题的解合并为原问题的解 }
分分治割T法成(n的一) 设些计规思模想较是小=,的将相一同n个问难题以,直以接便解各决个的击大破问,题,
分而治之。
n/2
n/2
n/2
n/2
T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4
分治法的适用条件
分治法所能解决的问题一般具有以下几个特征: ❖ 该问题的规模缩小到一定的程度就可以容易地解决; ❖ 该问题可以分解为若干个规模较小的相同问题,即该问
题具有最优子结构性质 ❖ 利用该问题分解出的子问题的解可以合并为该问题的解; ❖ 该问题所分解出的各个子问题是相互独立的,即子问题
之间不包含公共的子问题。
当mi≤n<mi+1时,T(mi)≤T(n)<T(mi+1)。
二分搜索技术
给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素中找 出一特定元素x。 分析:✓ 该问题的规模缩小到一定的程度就可以容易地解决;
✓ 该问题可以分解为若干个规模较小的相同问题;
✓ 分解出的子问题的解可以合并为原问题的解;
算法总体思想
❖ 对这k个子问题分别求解。如果子问题的规模仍然不够小, 则❖再将划要分求为解k个的子较问大题规,模如的此问递题归分的割进成行k个下更去小,规直模到的问子题问规题模。
足够小,很容易求出其解为止。
T(n)
=n
T(
T(n/2)
算法总体思想
❖ 对将这求k出个的子小问规题模分的别问求题解的。解如合果并子为问一题个的更规大模规仍模然的不问够 小题,的则解再,划自分底为向k上个逐子步问求题出,原如来此问递题归的的解进。行下去,直 到问题规模足够小,很容易求出其解为止。
O(1)
n1
T(n) kT (n/m)f(n) n1
通过迭代法求得方程的解:T(n)nlom gk
lom gn1
kj
f(n/mj)
j0
注意:递归方程及其解只给出n等于m的方幂时T(n)的值,但
是如果认为T(n)足够平滑,那么由n等于m的方幂时T(n)的值
可以估计T(n)的增长速度。通常假定T(n)是单调上升的,从而
T(n)
=n
n/2
n/2
n/2
n/2
T(n/4)T(n/4)T(n/4)T(n/4) T(n/4) T(n/4) T(n/4) T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4
算法总体思想
❖ 将求出的小规模的问题的解合并为一个更大规模的问 题的解,自底向上逐步求出原来问题的解。
T(n)
=n
n/2
n/2
n/2
n/2
T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4
算法总体思想
❖ 将求出的小规模的问题的解合并为一个更大规模的问 题的解,自底向上逐步求出原来问题的解。