第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
算法总体思想
❖ 将求出的小规模的问题的解合并为一个更大规模的问 题的解,自底向上逐步求出原来问题的解。
分析✓:分比解较出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
算法总体思想
❖ 将求出的小规模的问题的解合并为一个更大规模的问 题的解,自底向上逐步求出原来问题的解。
合集下载
分治法
分 治 法
顾铁成
1
引例:称硬币
如果给你一个装有16枚硬币的袋子,其中有一
枚是假的,并且其重与真硬币不同。你能不能 用最少的比较次数,找出这个假币?
为了帮助你完成这个任务,将提供一台可用来 比较两组硬币重量的仪器,利用这台仪器,可
以知道两组硬币的重量是否相同。
2
引例:称硬币
常规的解决方法是先将这些硬币分成两
15
当 k = 1 时,各种可能的残缺棋盘
16
三格板的四个不同方向
17
【输入】
第一行输入棋盘 的总行数,第二 行输入残缺棋盘 的格子坐标。
【样例输入】 4
4 1
【样例输出】 2 2 3 3 2 1 1 3 4 4 1 5
【输出】
覆盖的矩阵图。
0 4 5 5
18
问题分析
很明显,当K=0时,是不需要三格板的,而当
24
【样例输入】 5 3 23 8 91 56 4 【样例输出】 1
25
问题分析
对于一组混乱无序的数来说,要找到第k
小的元素,通常要经过两个步骤才能实 现:
第一步:将所有的数进行排序; 第二步:确定第k个位置上的数。
26
问题分析
传统的排序算法(插入排序、选择排序
、冒泡排序等)大家都已经很熟悉了, 但已学过的排序方法无论从速度上பைடு நூலகம்还 是从稳定性方面,都不是最佳的。
将7作为一个参照数;
将这个数组中比7大的数放在7的左边; 比7大的数放在7的右边;
这样,我们就可以得到第一次数组的调整:
[ 4 2 6 6 1 ] 7 [ 10 22 9 8 ]
29
顾铁成
1
引例:称硬币
如果给你一个装有16枚硬币的袋子,其中有一
枚是假的,并且其重与真硬币不同。你能不能 用最少的比较次数,找出这个假币?
为了帮助你完成这个任务,将提供一台可用来 比较两组硬币重量的仪器,利用这台仪器,可
以知道两组硬币的重量是否相同。
2
引例:称硬币
常规的解决方法是先将这些硬币分成两
15
当 k = 1 时,各种可能的残缺棋盘
16
三格板的四个不同方向
17
【输入】
第一行输入棋盘 的总行数,第二 行输入残缺棋盘 的格子坐标。
【样例输入】 4
4 1
【样例输出】 2 2 3 3 2 1 1 3 4 4 1 5
【输出】
覆盖的矩阵图。
0 4 5 5
18
问题分析
很明显,当K=0时,是不需要三格板的,而当
24
【样例输入】 5 3 23 8 91 56 4 【样例输出】 1
25
问题分析
对于一组混乱无序的数来说,要找到第k
小的元素,通常要经过两个步骤才能实 现:
第一步:将所有的数进行排序; 第二步:确定第k个位置上的数。
26
问题分析
传统的排序算法(插入排序、选择排序
、冒泡排序等)大家都已经很熟悉了, 但已学过的排序方法无论从速度上பைடு நூலகம்还 是从稳定性方面,都不是最佳的。
将7作为一个参照数;
将这个数组中比7大的数放在7的左边; 比7大的数放在7的右边;
这样,我们就可以得到第一次数组的调整:
[ 4 2 6 6 1 ] 7 [ 10 22 9 8 ]
29
2023年高中信息技术教学课件 分治算法 PPT
• 其中L_ans,R_ans是与计算ans相同类型的子问题, 递归计算即可。主要考虑(i,j)分立两侧的逆序对数 C_ans:
• 结论:对两半段的数分别排序, (i 在左半段,j 在右 半段,排在不同位置不影响先后关系) ,C_ans 不变
• 例如:对于A=[3 2 5 1 4],分成两段A1 = [3 2 5], A2 = [1 4],对A1 和A2 进行排序,A’ = [2 3 5 1 4], C_ans 仍 然为4(3>1,2>1, 5>1, 5>4)
• 此时把原问题分解成4个结构与原问题一样的子问题, 棋盘的大小(边长)每次减半,最终会出现边长为1的 情况,直接求解即可。
经典问题1—棋盘覆盖
• 定义cover(x,y,len,x0,y0)表示求解左上角格子在(x,y)边长为len,其中(x0,y0)不能 覆盖的棋盘覆盖方案。
• 根据黑色格子的位置分为以下四种情况: • 情况1:黑点位于左上部分
• 考虑第一段中两个数A[i],A[j],如果i<j,则A[i] 肯定 比A[j] 要早出现
• 策略:比较两个序列最小的数, 谁小谁在前; 重复比 较直到没有数为止。时间复杂度为O(n)。
1356
2478
12
3
456
7
8
经典问题2—归并排序—代码
• void merge(l,m,r)// 合并操作
=4*(2*F(n’/8)+n’/4)+2*n’=8*F(n’/8)+3*n’ =……=2^k*F(1)+k*n’=2^k+k*2^k=n’+n’*lgn’ • 设n’<=n<2*n’,则有F(n’)<=F(n)<F(2*n’) • n’+n’lgn’<=F(n)<=2*n’+2*n’*lg(2*n’) • n’+n’lgn’<=F(n)<=2*n’+2*n’*lg2+2*n’*lgn’ • 所以F(n)=O(nlgn)。
• 结论:对两半段的数分别排序, (i 在左半段,j 在右 半段,排在不同位置不影响先后关系) ,C_ans 不变
• 例如:对于A=[3 2 5 1 4],分成两段A1 = [3 2 5], A2 = [1 4],对A1 和A2 进行排序,A’ = [2 3 5 1 4], C_ans 仍 然为4(3>1,2>1, 5>1, 5>4)
• 此时把原问题分解成4个结构与原问题一样的子问题, 棋盘的大小(边长)每次减半,最终会出现边长为1的 情况,直接求解即可。
经典问题1—棋盘覆盖
• 定义cover(x,y,len,x0,y0)表示求解左上角格子在(x,y)边长为len,其中(x0,y0)不能 覆盖的棋盘覆盖方案。
• 根据黑色格子的位置分为以下四种情况: • 情况1:黑点位于左上部分
• 考虑第一段中两个数A[i],A[j],如果i<j,则A[i] 肯定 比A[j] 要早出现
• 策略:比较两个序列最小的数, 谁小谁在前; 重复比 较直到没有数为止。时间复杂度为O(n)。
1356
2478
12
3
456
7
8
经典问题2—归并排序—代码
• void merge(l,m,r)// 合并操作
=4*(2*F(n’/8)+n’/4)+2*n’=8*F(n’/8)+3*n’ =……=2^k*F(1)+k*n’=2^k+k*2^k=n’+n’*lgn’ • 设n’<=n<2*n’,则有F(n’)<=F(n)<F(2*n’) • n’+n’lgn’<=F(n)<=2*n’+2*n’*lg(2*n’) • n’+n’lgn’<=F(n)<=2*n’+2*n’*lg2+2*n’*lgn’ • 所以F(n)=O(nlgn)。
《分治策略》课件
分治策略的原理
总结词
分治策略的原理是将问题分解为若干个较小的子问题,解决 这些子问题,然后将子问题的解决方案组合起来,形成对整 个问题的解决方案。
详细描述
分治策略的核心是将问题分解为若干个子问题,这些子问题 应该尽可能地简单、独立,并且能够被有效地解决。解决这 些子问题后,将它们的解决方案组合起来,形成对整个问题 的解决方案。
项目管理
在项目管理中,分治策略有助于将一个复杂的项目分解为多个子项目,分别进行管理和推 进,提高项目的管理效率。
决策分析
在决策分析中,分治策略有助于将一个复杂的问题分解为多个子问题,分别进行评估和决 策,提高决策的科学性和准确性。
问题解决
在日常生活中,分治策略有助于将一个复杂的问题分解为多个小问题,逐一解决,最终找 到问题的解决方案。例如,在解决家庭纠纷、组织活动等场景中都可以运用分治策略。
THANKS。
高解决问题的速度。
简化问题
将复杂问题分解为更小、更易 于处理的部分,有助于理解和
解决每个子问题。
资源优化
分治策略可以更有效地分配资 源,例如计算资源和人力资源 ,从而提高资源利用效率。
提高准确性
通过分别解决子问题,可以减 少全局解决方案中的错误和误
差。
分治策略的缺点
数据传输成本
合并子问题的复杂性
在解决分治问题时,子问题之间可能需要 进行大量数据传输和通信,这可能导致额 外的计算和通信开销。
问题的目的。
组合数学
在组合数学中,分治策略常用于 解决一些与排列、组合、概率等 相关的问题。通过将问题分解为 多个子问题,简化问题的难度,
从而找到解决方案。
几何学
在几何学中,分治策略常用于解 决一些与面积、体积、最值等相 关的问题。通过将大问题分解为 小问题,逐一解决,最终找到问
五大常用算法ppt课件
桥了。
A B→ 2 A←1
AC → 5 A←1
AD → 8
一共就是2+1+5+1+8=17分钟。
Your company slogan
贪心算法
但其实有更快的办法: AB→2 A←1 CD→8 B←2 AB→2
一共是2+1+8+2+2=15分钟。这个办法的聪明之处在于让两个走得最慢的人同时过桥, 这样花去的时间只是走得最慢的那个人花的时间,而走得次慢的那位就不用另花时间过 桥了。可以把所有可能的方案都列举一遍,就会发现这是最快的方案了。
Your company slogan
贪心算法
2015年周得水等人提出一种基于Dijkstra的贪心算法来实现模糊连接度的快速计算。 基于模糊连接度的图像分割过程如下: (1)由用户在图像中选取种子点; (2)计算图像中各点相对于种子点的模糊连接度,同时得到各点到种子点的最优路径; (3)对得到的最优路径进行各点相对于种子点的属性相似度计算,同时得到图像中各点新 的隶属度; (4)用户通过选取阈值来分割图像。
1. if |P|≤n0
2. then return(ADHOC(P)) 3. 将P分解为较小的子问题 P1 ,P2 ,...,Pk
4. for i←1 to k 5. do yi ← Divide-and-Conquer(Pi) △ 递归解决Pi 6. T ← MERGE(y1,y2,...,yk) △ 合并子问题
后将各子问题的解合并得到原问题的解。(分治与递归)
适用情况: 1) 该问题的规模缩小到一定的程度就可以容易地解决; 2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质; 3) 利用该问题分解出的子问题的解可以合并为该问题的解; 4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。
分治算法
65 97
13 76
38 49 65 97
13 27 76
13 27 38 49 65 76 97
黑盒划分典型问题—合并排序
合并排序算法改进
从分治过程入手,容易消除mergeSort算法中的递归 调用
49 38 65 97 76 13 27
38 49
65 97
13 76
27
38 49 65 97
题的解,自底向上逐步求出原来问题的解。
T(n)
=
n
递归的概念
由分治法产生的子问题往往是原问题的较小模式,这 就为使用递归技术提供了方便。在这种情况下,反复 应用分治手段,可以使子问题与原问题类型一致而其 规模却不断缩小,最终使子问题缩小到很容易直接求 出其解。这自然导致递归过程的产生。
直接或间接地调用自身的算法称为递归算法。用函数 自身给出定义的函数称为递归函数。
黑盒划分典型问题—合并排序
【例5】合并排序
任务描述:任意给定一包含n个整数的集合,把n个整数按升序排列。 输入:每测试用例包括两行,第一行输入整数个数,第二行输入n个整 数,数与数之间用空格隔开。最后一行包含-1,表示输入结束。 输出:每组测试数据的结果输出占一行,输出按升序排列的n个整数。 样例输入:
13 27 76
13 27 38 49 65 76 97
黑盒划分典型问题—合并排序
黑盒划分典型问题—合并排序
合并排序算法改进
从分治过程入手,容易消除mergeSort算法中的递归调用 自然合并排序
49 38 65 97 76 13 27
49
38 65 97
76
13 27
38 49 65 97
黑盒划分典型问题—逆序对问题
分治法
{ tmpa[k]=a[i]; i++; k++; }
while (j<=high)
//将第2子表余下部分复制到tmpa
{ tmpa[k]=a[j]; j++; k++; }
for (k=0,i=low;i<=high;k++,i++) //将tmpa复制回a中
a[i]=tmpa[k];
free(tmpa);
QuickSort(a,s,i-1); //对左子序列递归排序
QuickSort(a,i+1,t); //对右子序列递归排序
}
}
【算法分析】快速排序的时间主要耗费在划分操作上,对长度为n的
区间进行划分,共需n-1次关键字的比较,时间复杂度为O(n)。
对n个记录进行快速排序的过程构成一棵递归树,在这样的递归树中, 每一层至多对n个记录进行划分,所花时间为O(n)。
divide-and-conquer(P)
{ if |P|≤n0 return adhoc(P);
将P分解为较小的子问题 P1,P2,…,Pk;
for(i=1;i<=k;i++)
//循环处理k次
yi=divide-and-conquer(Pi); return merge(y1,y2,…,yk); }
2,5,1,7,10, 6,9,4,3,8 顶
2,5,1,7,10
6,9,4,3,8
分解
2,5,1 7,10 6,9,4 3,8
2,5 1 7 10 6,9 4 3 8
合并
25
7,10 6 9
底 3,8
2,5
2009-2010-2《算法分析》ppt-3分治法
合并排序
复杂度分析 O(1) n 1 T (n) 2T (n / 2) O(n) n 1 T(n)=O(nlogn) 渐进意义下的最优算法
合并排序(P97)
初始序列
[49] [38] [65] [97] [76] [13] [27]
第一步
[38 49]
[65 97]
[13 76]
例如正整数6有如下11种不同的划分: 6; 5+1; 4+2,4+1+1; 3+3,3+2+1,3+1+1+1; 2+2+2,2+2+1+1,2+1+1+1+1; 1+1+1+1+1+1。
整数划分问题
前面的几个例子中,问题本身都具有比较明显的 递归关系,因而容易用递归函数直接求解。 在本例中,如果设p(n)为正整数n的划分数,则难 以找到递归关系,因此考虑增加一个自变量:将 最大加数n1不大于m的划分个数记作q(n,m)。可以 建立q(n,m)的如下递归关系。
大整数乘法
例 A=2348,B=3825 a1=23,a2=48,b1=38,b2=25 p=(a1+a2)(b1+b2)=71 *63=4473 q=a1b1=874, r=a2b2=1200 AB=8740000+(4473-874-1200)*100+1200 =8740000+239900+1200 =8981100
分治法的复杂性分析
O(1) n 1 T (n) kT (n / m) f (n) n 1
分治法 “分”而治之.ppt
利用上述公式,可有: S(n) = (1+1/n)U(n) -1
当n→∞,S(n) ∝ U(n) ,而U(n) = Θ(logn)
谢谢你的观赏
19
基于二元比较树的分析
若x在A中出现,则算法的执 行过程在一个圆形的内结点处结 束。 若x不在A中出现,则算法的 执行过程在一个方形的外结点处 结束
——外结点不代表元素的比 较,因为比较过程在该外结点的 上一级的内结点处结束。
5
2
7
1 3 68
4
9
谢6 谢你的观赏
谢谢你的观赏
8
分治法的另一种模型表示
proc dividandconquer(n)
if n<=n0 then g(n)
else { divid n into small suninstances
n1 n2 n3…nk
for i=1 to k do
yi=dividandconquer(ni)
return merge(y1…yk) }
效率较好。 一般进行2分法。
谢谢你的观赏
谢谢你的观赏
10
3.2 二分检索(折半查找) 1. 问题的描述
已知一个按非降次序排列的元素表a1, a2, …,an,判定某给定的元素x是否在该表中出 现。
若是,则找出x在表中的位置并返回其所在下标 若非,则返回0值。
谢谢你的观赏
谢谢你的观赏
11
故:成功检索在i级终止所需要的元素比较次数是i 不成功检索在i级外部结点终止的元素比较次数是i-1
谢谢你的观赏
谢谢你的观赏
21
BINSRCH计算复杂度的理论分析
1)不成功检索的最好、最坏和平均情况的计算时间
当n→∞,S(n) ∝ U(n) ,而U(n) = Θ(logn)
谢谢你的观赏
19
基于二元比较树的分析
若x在A中出现,则算法的执 行过程在一个圆形的内结点处结 束。 若x不在A中出现,则算法的 执行过程在一个方形的外结点处 结束
——外结点不代表元素的比 较,因为比较过程在该外结点的 上一级的内结点处结束。
5
2
7
1 3 68
4
9
谢6 谢你的观赏
谢谢你的观赏
8
分治法的另一种模型表示
proc dividandconquer(n)
if n<=n0 then g(n)
else { divid n into small suninstances
n1 n2 n3…nk
for i=1 to k do
yi=dividandconquer(ni)
return merge(y1…yk) }
效率较好。 一般进行2分法。
谢谢你的观赏
谢谢你的观赏
10
3.2 二分检索(折半查找) 1. 问题的描述
已知一个按非降次序排列的元素表a1, a2, …,an,判定某给定的元素x是否在该表中出 现。
若是,则找出x在表中的位置并返回其所在下标 若非,则返回0值。
谢谢你的观赏
谢谢你的观赏
11
故:成功检索在i级终止所需要的元素比较次数是i 不成功检索在i级外部结点终止的元素比较次数是i-1
谢谢你的观赏
谢谢你的观赏
21
BINSRCH计算复杂度的理论分析
1)不成功检索的最好、最坏和平均情况的计算时间
算法设计与分析-分治法详解64页PPT
37、我们唯一不会改正的缺点是软弱。——拉罗什福科
xiexie! 38、我这个人走得很慢,但是我从不后退。——亚伯拉罕·林肯
39、勿问成功的秘诀为何,且尽全力做你应该做的事吧。——美华纳
40、学而不思则罔,思而不学则殆。——孔子
算法设计与分析-分治法详解
•
26、我们像鹰一样,生来就是自由的 ,但是 为了生 存,我 们不得 不为自 己编织 一个笼 子,然 后把自 己关在 里面。 ——博 莱索
•
27、法律如果不讲道理,即使延续时 间再长 ,也还 是没有 制约力 的。— —爱·科 克
•
28、好法律是由坏风俗创造出来的。 ——马 克罗维 乌斯
•
29、在一切能够接受法律支配的人类 的状态 中,哪 里没有 法律, 那里就 没有自 由。— —洛克
•
30、风俗可以造就法律,也可以废 法律。 ——塞·约翰逊
谢谢!
36、自己的鞋子,自己知道紧在哪里。——西班牙
分治算法PPT
第一步
[38 49] [65 97] [13 76] [27]
第二步 第三步
[38 49 65 97]
[13 27 76]
18
[13 27 38 49 65 76 97]
归并排序主函数
void mergesort(int A[], int l, int r, int T[]) {
if(l < r) { int mid = (l + r) / 2; //二分 mergesort(A, l, mid, T);//继续对左子序列递归排序 mergesort(A, mid+1, r, T);//继续对右子序列递归排序 merge(A, l, mid, r, T); //合并
8
方法1
假设袋中有n个金块。可以通过n-1次比较找到最重 的金块。然后可以从余下的n-1个金块中用类似的方 法通过n-2次比较找出最轻的金块。这样,比较的总 次数为2n-3。具体的实现方法如下:
max = a[1]; min = a[1]; for(i=2; i<=n; i++) //2n-2次比较 {
问题,最后合并其结果就得到原问题的解。当分解(Divide):将原问题分成一系列子问题。 解决(Conquer):递归地解各子问题。若子问题
足够小,则可直接求解。 合并(combine);将子问题的结果合并成原问题
的解。
14
分治思想
问题的分解
方法1:每枚硬币都至少进行了一次比较,而有一枚硬 币进行了15次比较
方法2:每一枚硬币只进行了一次比较 方法3:将硬币分为两组后一次比较可以将硬币的范
围缩小到了原来的一半,这样充分地利用了只有1枚 伪币的基本性质。
