算法设计技巧与分析 第6章 分治法


Realization of MERGE
已分类序列A 数组A A(0) A(1) A(2) …
比较大小 小 值 比较大小 小 值
已分类序列B
A((n1)/2)
A((n1)/2+1)

A(n-1)
……
剩余已分类元素
辅助 A(0) 数组B
A((n-1)/2+1)
考虑函数需要的参数 原数组a[ ] 目标数组b[ ] a前段的起始位置l a前段的终止位置m,则后段起始位置为m+1 a后段的终止位置r
Analysis
由上可得 O(1) T (n)= kT(n/m)+f(n) 解上式得到
n=1
n>1
T (n) nlogm k
logm n 1 j 0
k j f (n / m j )
Content
分治法原理 算法实例
求最大/最小值 二分搜索 合并排序 寻找中项和第k小元素 快速排序 矩阵乘法 最近点对问题
恰好是在观察结论1.5中对算法BOTTOMUP
SORT下的结论。
Analysis
若n是任意的正整数,则:
C(n)=

0 C( n / 2 )+C( n / 2 )+bn
若 n=1 若 n≥2
C(n)=Θ(n log n)
算法MERGESORT对一个n个元素的数 组排序所需的时间是Θ(n log n),空间 是Θ(n)。
输出: (x, y),A中的最大元素和最小元素。 过程
minmax (low,high)
if A[low]<A[high]
then return (A[low], A[high]) else return (A[high], A[low]) end if
1. if high-low = 1 then
输入: n 个元素的数组 A[1·· 。 ·n] 输出: 按非降序排列的数组 A[1·· 。 ·n] 过程 mergesort (low,high) 1. if low < high then 2.
递归调用,分别对分 解出来的两个子问题 排序
3.
4. 5. 6. end if 主函数调用: mergesort (A,1,n)
输入: 按非降序排列的 n 个元素的数组 A[1·n]和元素 x。 · · 输出: 如果 x = A[j],则输出 j; 否则输出 0。 过程 binarysearch (low,high) 1. if low > high then return 0 2. else mid (low high) / 2 3. 4. if x = A[mid] then return mid 5. else if x < A[mid] then return binarysearch (low,mid -1) 6. else return binarysearch (mid +1,high)
Content
分治法原理 算法实例
二分搜索 合并排序 寻找中项和第k小元素 快速排序 大整数乘法 矩阵乘法 最近点对问题
分治范式
Problem 1
[找伪币问题]给你一个装有1 6个硬币的袋 子。1 6个硬币中有一个是伪造的,并且那 个伪造的硬币比真的硬币要轻一些。你的任 务是找出这个伪造的硬币。为了帮助你完成 这一任务,将提供一台可用来比较两组硬币 重量的仪器,利用这台仪器,可以知道两组 硬币的重量是否相同。
Solution
一种方式 两两对比,找到轻者,最差比较8次。
另外一种 1)将16个硬币分成A、B两半; 2)将A放仪器的一边,B放另一边,如果A袋 轻,则表明伪币在A,解子问题A即可,否则, 解子问题B。
Problem 2
例2:[金块问题]有一个老板有一袋金块。每个 月将有两名雇员会因其优异的表现分别被奖 励一个金块。按规矩,排名第一的雇员将得 到袋中最重的金块,排名第二的雇员将得到 袋中最轻的金块。假设有一台比较重量的仪 器,我们希望用最少的比较次数找出最轻和 最重的金块。
分而治之方法与软件设计的模块化方法非 常相似。为了解决一个大的问题,可以:
1) 把它分成两个或多个更小的问题; 2) 分别解决每个小问题,小问题通常与原问题相 似,可以递归地使用分而治之策略来解决; 3) 把各小问题的解答组合起来,即可得到原问题 的解答。
原问题
相 同 类 型
子问题1
子问题2
子问题k
7. end if 主函数调用:binarysearch (1, n)
Analysis
考察对象:元素间的比较次数; 假设:每个三向比较当作一次比较; n=1时:执行一次比较;
C(n)≤

1 1+ C( n / 2 )
若 n=1 若 n≥2
Deduction Process
设对整数k≥2,满足2k-1≤n≤2k,则:
Solution(1)
1. (两两比较)假设袋中有n 个金块,通过n1次比较找到最重的金块。找到最重的金块后, 可以从余下的n-1个金块中用类似的方法通过n2次比较找出最轻的金块。 比较的总次数为2n-3。
Solution(2)
2. (分治)n≤2时,做一次比较即可。 n>2时, 第一步,把这袋金块平分成两个小袋A和B。 第二步,分别找出在A和B中最重和最轻的金 块:HA 与LA,HB 和LB。 第三步,通过比较HA 和HB,可以找到所有 金块中最重的;通过比较LA 和LB,可以找到 所有金块中最轻的。
若n=1 若n≥2
k 1 j 0
C (n ) 2k C (1) kn 2 j
kn 2 1
k
n log n n 1
算法MERGESORT对大小为n的数组排序,所
执行的元素比较的总次数在
(n log n ) / 2 和
n log n n 1 之间 ,这里n是2的幂。这
最后结果 判断输入规模p是 否足够的小
Consider?
应把原问题分为多少个子问题才较适宜? 每个子问题是否规模相同或怎样才为适当?
Efficiency
原问题规模——n 分成k个子问题,每个规模——n/m 设分解阈值n0=1,Adhoc解规模为1的问 题耗费1个单位时间 设分解原问题及用Merge将k个子问题的解 合并需要f(n)个单位时间 T(n)表示分治法的解规模为|P|=n的问题所 需的计算时间
2.
3. 4.
5. else 6. 7. 8. 9. 10. 11.
mid (low high) / 2
(x 1 , y 1 ) min max(low , mid ) (x 2 , y 2 ) min max(mid 1, high) x min(x 1 , x 2 ) y max(y 1 , y 2 )
分治范式
Max and Min
问题:在一个整数组A[1…n]中,同时寻找 最大值和最小值。
解法1:扫描整个数组,每个值被比较两次。
低效,一共比较2n-2次
解法2:将数组分割成两半,在每一半中找到 最大值和最小值,并对两个最大值和两个最 小值进行比较。
输入: n 个整数元素的数组 A[1·· ·n],n为2的幂 。
2k 1C (2) 2 j
3n / 2 2
j 1
k 1
设数组A[1…n]包含n个元素,其中n是2 的幂,则仅用3n/2-2次元素比较在数组 A中找出最大和最小元素是可能的。
Binary Search
请回忆第1章算法1.2
用递归法求解:
将给定的元素x与数组A[low…high]的中间元 素比较,令mid= (low high) / 2 ; 如果x<A[mid],则不考虑A[mid…high],而对 A[low…mid -1]重复实施相同的方法; 如果x>A[mid],则放弃A[low…mid],并对 A[mid +1…high]重复实施相同的方法。
template< class Type > void Merge( Type a[ ], Type b[ ], int l, int m, int r) {//合并a[l:m]和a[m+1:r]到b[l:r] int i=l; 把a[l:m]和 后半段指针 a[m+1:r]中的数 前半段指针 j=m+1, 数组b的下标指针 据进行比较,按 k=l; 顺序放入b[]中 while( ( i<=m )&&( j<=r )) if( a[ i ]<=a[ j ]) b[ k++ ]=a[ i++ ]; else b[ k++ ]=a[ j++ ]; if( i>m ) for( int q=j; q<=r; q++ ) 如果前一段数据 b[ k++ ]=a[ q ]; 小于后一段的多, else for( int q=I; q<=m; q++) 则先排完,把后 段剩余数付给 b[ k++ ]=a[ q ]; b[n],否则将前 } 段数据付给b[n]
return (x , y)
12. end if 主函数调用:minmax (1, n)
Analysis
考察对象:比较次数。
令:C(n)为由n个元素组成的数组上执行的元素比
较次数。
C (n )
2C (n / 2) 2
1
若n=2 若n>2
Deduction Process
C (n ) 2C (n / 2) 2 2(2(C (n / 4) 2) 2 4C (n / 4) 4 2 4(2(C (n / 8) 2) 4 2 8C (n / 8) 8 4 2 k 1 k 1 k 1 k 2 2 2 C (n / 2 ) 2 2 ... 2 2
合集下载

分治法

分治法
分 治 法
顾铁成
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

分治算法详解ppt课件

分治算法详解ppt课件

精选ppt课件
12
合并排序
&最坏时间复杂度:O(nlogn) &平均时间复杂度:O(nlogn) &辅助空间:O(n)
精选ppt课件
13
棋盘覆盖
在一个2k×2k 个方格组成的棋盘中,恰有一个方格与其它方格 不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋 盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的 特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不 得重叠覆盖。
chessBoard(tr, tc+s, tr+s-1, tc+s, s);} // 覆盖左下角子棋盘
// 覆盖左上角子棋盘
if (dr >= tr + s && dc < tc + s)
iefl/cs(/deh特re{<s/殊/st此rB方+o棋复格as盘r在&杂d中&(此tr度d无,棋ctc特分盘<, d殊t中cT r析,方+d(ck 格s,))s) ; 4T(ke O l/cbs1 /(eho特1 )ae{) r/s殊d/s[用O tB方r o+(格t1 a号s)r在]d[Lt(此c型tk kr++棋骨s s,盘牌t-0 0 c中覆1, ]d盖=r, t右d;c上, s角);
算法总体思想
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选(np/4p)t课T件(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/54)T(n/4

算法设计与分析-分治法

算法设计与分析-分治法

3.2.1 归并排序
算法3.1——归并排序
void MergeSort(int r[ ], int r1[ ], int s, int t) {
if (s= =t) r1[s]=r[s]; //只有一个元素,直接赋值 else {
m=(s+t)/2; Mergesort(r, r1, s, m); //归并排序前半个子序列 Mergesort(r, r1, m+1, t); //归并排序后半个子序列 Merge(r1, r, s, m, t); //合并两个已排序的子序列 } }
A、B、C、D 四个区域
Ø想法
Ø 用二维数组data[N][N]表示N×N的方阵,观察方阵中数
字的规律,可以从外层向里层填数。 Ø 设变量size表示方阵的大小,则初始时size = N,填完一
层则size = size - 2;
Ø想法
Ø 设变量begin表示每一层的起始位置,变量i和j分别表示
MergeSort(r,r1,1,1) r1[1]=r[1]
Merge(r1,r,0,0,1)
MergeSort(r,r1,2,3)
MergeSort(r,r1,2,2) r1[2]=r[2]
MergeSort(r,r1,3,3) r1[3]=r[3]
Merge(r1,r,2,2,3)
Merge(r1,r,0,1,3)
• 分治思想 • 归并排序 • 快速排序 • 折半查找 • 选择问题 • 最大子段和问题 • 棋盘覆盖问题 • 循环赛日程安排问题
3.1 基本思想 3.2 排序问题中的分治算法 3.3 查找问题中的分治算法 3.4 组合问题中的分治算法 3.5 典型问题的C++程序(略)

分治算法讲解

分治算法讲解

分治算法讲解分治算法一:基本概念(分而治之)分治就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。

比如:二分查找,归并排序,快速排序,树的遍历等等任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。

问题的规模越小,越容易直接求解,解题所需的计算时间也越少。

例如,对于n个元素的排序问题,当n=1时,不需任何计算。

n=2时,只要作一次比较即可排好序。

n=3时只要作3次比较即可,…。

而当n 较大时,问题就不那么容易处理了。

要想直接解决一个规模较大的问题,有时是相当困难的。

二:基本思想分治设计思想:将一个大的问题,分解成一个个小的,相同类型的问题,然后逐个击破各个小问题,最后将小问题逐步合并,得到最终的解。

(可能会用到递归,大问题里包含小问题,找到规律然后解决)分治基本策略:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n 较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。

三:分治使用情况1) 该问题的规模缩小到一定的程度就可以容易地解决2) 该问题可以分解为相同类型的小问题(前提)3) 利用该问题分解出的子问题的解可以合并为该问题的解;(关键)4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。

第三条特征是关键,能否利用分治法完全取决于问题是否具有第三条特征,如果具备了第一条和第二条特征,而不具备第三条特征,则可以考虑用贪心法或动态规划法。

四:基本步骤(1)划分:把问题的实例划分成子问题(2)求解:若是子问题比较简单,就直接解决,否则递归求解子问题(3)合并:合并子问题的解得到原问题的解课前引导:一:分段函数例如:高中数学中的分段函数也是类似分治思想的体现,如看图求y关于x的表达式。

6算法分析与设计 第六讲 分治法总结

6算法分析与设计 第六讲 分治法总结
分治法求解实例插入排序合并排序递归阶乘函数fibonacci数列整数划分问题汉诺塔问题快速排序最大元最小元最近点对求第i小元素几个排序算法插入排序合并排序快速排序快速排序的随机化版本递归阶乘函数fibonacci数列汉诺塔问题最大元最小元问题当n2时一次比较就可以找出两个数据元素的最大元和最小元当n2时可以把n个数据元素分为大致相等的两半10求第i小元素分治法期望线性时间求解方法最坏情况线性时间求解方法11求第i小元素期望线性时间求解方法使用randompartition对数组进行划分检查主元元素是否第i小如果是则返回否则确定第i小落在划分后的低区还是高区如果落在低区则在低区的子数组中递归选择如果落在高区则在高区的子数组中递归选择12求第i小元素最坏情况线性时间求解方法1
11
求第i小元素
期望线性时间求解方法
使用Random Partition对数组进行划分 检查主元元素是否第i小,如果是,则返回 否则,确定第i小落在划分后的低区还是高区 如果落在低区,则在低区的子数组中递归选择 如果落在高区,则在高区的子数组中递归选择
12
求第i小元素
最坏情况线性时间求解方法
13
最近点对问题
预处理
将点对按X坐标排序 将点对按Y坐标排序
分解
按照X坐标将点集二分 同时获得分解后的已按Y坐标排好序的点集
递归求解 合并
找出带状区域中的点 检查带状区域中的点(已排序),计算每点与其后面7 个点的距离,更新最近点对距离
14
7
几个排序算法
插入排序 合并排序 快速排序 快速排序的随机化版本
8
递归
阶乘函数 Fibonacci数列 汉诺塔问题
9
最大元、最小元问题
当n=2时,一次比较就可以找出两个数据 元素的最大元和最小元 当n>2时,可以把n个数据元素分为大致相 等的两半

《算法分治法》课件

《算法分治法》课件
分治算法的原理还体现在将一个复杂的问题分解为若干个相 互关联、相互依赖的小问题,这些小问题之间存在着一定的 规律和联系,通过解决这些小问题,可以找出原问题的解决 方案。
分治算法的步骤
分治算法的步骤还包括对问题进行归纳和分类,确定 问题的规模和复杂度,选择合适的分治策略和算法实 现方式等。
单击此处添加正文,文字是您思想的提一一二三四五 六七八九一二三四五六七八九一二三四五六七八九文 ,单击此处添加正文,文字是您思想的提炼,为了最 终呈现发布的良好效果单击此4*25}
分治算法的核心思想是将一个复杂的问题分解为若干个规模较小、相互独立、与 原问题形式相同的子问题,递归地解这些子问题,然后再将子问题的解合并,以 求得原问题的解。
分治算法的原理
分治算法的原理是利用问题的相似性,将大问题分解为小问 题,将复杂问题转化为简单问题,从而降低问题的难度,提 高解决问题的效率。
探索分治算法与其他算法(如贪心算法、动态规划等)的结合
,实现更高效的算法设计。
分治算法的理论基础研究
02
深入探讨分治算法的理论基础,为算法设计和优化提供理论支
持。
分治算法在实际问题中的应用研究
03
针对实际问题,研究分治算法的应用场景和解决方案,推动算
法的实际应用。
THANKS
感谢观看
对于可以并行处理的子问题,可以使 用多线程或分布式计算等技术进行并 行处理,进一步提高算法效率。
动态规划
动态规划是一种常用的优化技术,通 过将子问题存储在表格中并逐步更新 ,可以避免重复计算,提高算法效率 。
分治算法在实际项目中的应用案例
归并排序
归并排序是一种典型的分治算法,通过递归地将数组分解为若干个子数组,然后合并子数 组得到有序数组。在实际应用中,归并排序广泛应用于各种排序场景。

算法设计与分析讲义分治法

递归排序子数组
分别对左右两个子数组递归进行快速排序。
合并已排序的子数组
将两个已排序的子数组合并成一个有序数组。
快速排序的时间复杂度
1 2
最好情况
O(nlogn),即当数据已经有序时的时间复杂度 。
平均情况
O(nlogn),根据概率计算得到的平均时间复杂 度。
3
最坏情况
O(n^2),即当数据已经逆序时的时间复杂度。
合并的结果应该是原问题的 解
完善细节
01
对合并的结果进行检验和调整
02
对算法进行优化,提高运行效 率
03
处理特殊情况或异常情况
03
分治法的优化策略
动态规划优化
总结词
通过将问题拆分为子问题,并存储子问题 的解,以避免重复计算,提高算法效率。
VS
详细描述
动态规划是一种常见的优化技术,其基本 思想是将问题拆分为一系列子问题,并将 子问题的解存储起来,以便在需要时可以 重复使用。通过这种方式,可以避免重复 计算相同的子问题,从而提高算法效率。 此外,动态规划通常用于优化递归问题, 如背包问题、最长公共子序列等。
但是,如果每个子问题的规模很大, 则空间复杂度也可能很大。
THANKS
谢谢您的观看
02
分治法的基本步骤
分解问题
将原问题划分成若干个子问题 每个子问题都包含原问题的一部分 子问题的规模尽可能小,以便更容易解决
解决子问题
对每个子问题进行递归求解 子问题的解可以构成原问题的解的一部分 对每个子问题进行归纳,得出原问题的解
合并子问题的解
将子问题的解合并成一个整 体
合并的过程中需要处理数据 结构或数据类型的一致性
算法设计与分析讲义分治 法

算法设计与分析典型算法概述——分治法与贪心法

算法设计与分析典型算法概述▌分治法与贪心法▌拾光工作室分治法分治算法也叫分治策略,把输入分为若干个部分,递归的解每一个问题,最后将这些子问题合并成为一个全局解。

如果子问题较大,可以再次使用分治策略。

由此可以得到分治策略解决的问题特点:1.该问题的规模缩小到一定的程度就可以容易地解决;2.该问题可以分解为若干个规模较小的相同问题;3.分解出的子问题的解可以合并为原问题的解;4.分解出的各个子问题是相互独立的。

分治法的应用——二叉查找设a[i](1<=i<=n)是一个数组,其中的元素以非降序排列.考虑判断一个元素x是否在数组中的问题。

确定一个j,使得a[j]=x。

如果x在数组中返回j,否则,返回0。

分析该问题符合分治法策略解决问题的特点,可以用分治法解决:如果n=1,直接判断a[n]是否与x相等。

如果n>1,可以把问题分解如下新的问题:选择一个下标q(范围[i,l]中),比较x与a[q],则有三种情况:1.x=a[q].得到解。

2.x>a[q].问题范围转换为(l-q,a[q+1], (x)3.x<a[q].问题范围转换为(q-i,a[i], (x)转换的子问题可以继续分解。

二叉查找的递归算法int BinSrch(Type a[],int i,int n,Type x)//a[i..n]是非递减排列且 1<=i<=n;{if(n==i) { if(x==a[i]) return i;else return 0; }else{int mid=(i+n)/2;if(x==a[mid]) return mid;else if(x<a[mid]) return BinSrh(a,i,mid-1,x);else if(x>a[mid]) return BinSrh(a,mid+1,n,x);}}分治法的应用——查找最大值与最小值在n个元素中找出最大值和最小值首先看下简单的查找算法:void MaxMin(Type a[],int n,Type &max,Type &min){max=min =a[0];for(int i=1;i<n;i++){ if(a[i]>max) max=a[i];if(a[i]<min) min=a[i];}}算法的时间复杂度体现在比较的次数上,当a[n]中的元素是多项式,矢量及非常大的数时或字符串,元素的比较代价就比其他操作代价高的很。

算法设计技巧与分析答案

算法设计技巧与分析参考答案第1章算法分析基本概念1.1(a)6 (b)5 (c)6 (d)61.4算法执行了7+6+5+4+3+2+1=28次比较1.5(a)算法MODSELECTIONSORT执行的元素赋值的最少次数是0,元素已按非降序排列的时候达到最小值。

(b) 算法MODSELECTIONSORT执行的元素赋值的最多次数是3(1)2n n ,元素已按非升序排列的时候达到最小值。

1.7由上图可以看到执行的比较次数为1+1+2+2+2+6+2=16次。

1.11由上图可以得出比较次数为5+6+6+9=26次。

1.13FTF,TTT,FTF,TFF,FTF 1.16(a) 执行该算法,元素比较的最少次数是n-1。

元素已按非降序排列时候达到最小值。

(b) 执行该算法,元素比较的最多次数是(1)2n n -。

元素已按非升序排列时候达到最大值。

(c) 执行该算法,元素赋值的最少次数是0。

元素已按非降序排列时候达到最小值。

(d) 执行该算法,元素赋值的最多次数是3(1)2n n -。

元素已按非升序排列时候达到最大值。

(e)n 用O 符号和Ω符号表示算法BUBBLESORT 的运行时间:2()t O n =,()t n =Ω(f)不可以用Θ符号来表示算法的运行时间:Θ是用来表示算法的精确阶的,而本算法运行时间由线性到平方排列,因此不能用这一符号表示。

1.27不能用关系来比较2n 和2100n 增长的阶。

∵221lim0100100n n n →∞=≠ 2n ∴不是2(100)o n 的,即不能用关系来比较2n 和2100n 增长的阶。

1.32(a)当n 为2的幂时,第六步执行的最大次数是:12,2k k n j -==时,11[log ]log n ni i k n n n ====∑∑(b)由(a)可以得到:当每一次循环j 都为2的幂时,第六步执行的次数最大,则当33,22k kmn j ===(其中32k 取整)时,11[log(31)]log(1)n nkii i m n n ===-=-∑∑(c)用O 符号表示的算法的时间复杂性是(log )O n n 已证明n=2k 的情况,下面证明n=2k +1的情况:因为有⎥⎦⎥⎢⎣⎢+=⎥⎦⎥⎢⎣⎢21222k k所以n=2k +1时,第六步执行的最大次数仍是n log n 。

算法分析——分治法

算法分析——分治法分治算法⼩组的汇报内容:⼀、分治算法的基本概念 (2)⼆、分治算法的基本思想及策略 (2)三、分治法适⽤的情况 (3)四、分治法的基本步骤 (3)五、分治法的复杂性分析 (4)六、快速傅⾥叶变换 (5)七、可使⽤分治法求解的⼀些经典问题 (9)⼋、依据分治法设计程序时的思维过程 (9)九、分治法与其它常见算法的⽐较 (9)⼩组的分⼯情况:彭勇讲前五个部分,天西⼭讲第六个部分,胡化腾讲最后三个部分,吕璐负责汇报的资料收集,⼩组分⼯以及最后的资料整理。

三、分治法适⽤的情况分治法所能解决的问题⼀般具有以下⼏个特征:1) 该问题的规模缩⼩到⼀定的程度就可以容易地解决2) 该问题可以分解为若⼲个规模较⼩的相同问题,即该问题具有最优⼦结构性质。

3) 利⽤该问题分解出的⼦问题的解可以合并为该问题的解;4) 该问题所分解出的各个⼦问题是相互独⽴的,即⼦问题之间不包含公共的⼦⼦问题。

第⼀条特征是绝⼤多数问题都可以满⾜的,因为问题的计算复杂性⼀般是随着问题规模的增加⽽增加;第⼆条特征是应⽤分治法的前提它也是⼤多数问题可以满⾜的,此特征反映了递归思想的应⽤;、第三条特征是关键,能否利⽤分治法完全取决于问题是否具有第三条特征,如果具备了第⼀条和第⼆条特征,⽽不具备第三条特征,则可以考虑⽤贪⼼法或动态规划法。

第四条特征涉及到分治法的效率,如果各⼦问题是不独⽴的则分治法要做许多不必要的⼯作,重复地解公共的⼦问题,此时虽然可⽤分治法,但⼀般⽤动态规划法较好。

四、分治法的基本步骤分治法在每⼀层递归上都有三个步骤:step1 分解:将原问题分解为若⼲个规模较⼩,相互独⽴,与原问题形式相同的⼦问题;step2 解决:若⼦问题规模较⼩⽽容易被解决则直接解,否则递归地解各个⼦问题step3 合并:将各个⼦问题的解合并为原问题的解。

它的⼀般的算法设计模式如下:Divide-and-Conquer(P)1. if |P|≤n02. then return(ADHOC(P))3. 将P分解为较⼩的⼦问题 P1 ,P2 ,...,Pk4. for i←1 to k5. do yi ← Divide-and-Conquer(Pi) △递归解决Pi6. T ← MERGE(y1,y2,...,yk) △合并⼦问题7. return(T)其中|P|表⽰问题P的规模;n0为⼀阈值,表⽰当问题P的规模不超过n0时,问题已容易直接解出,不必再继续分解。

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