
第二讲分治专题讲座课件.ppt
52页算法设计与分析算法设计与分析第二讲第二讲 分分 治治l 目的目的 分治法的思想分治法的思想分治算法的设计方法分治算法的设计方法将递归算法改写成迭代算法的一般方法将递归算法改写成迭代算法的一般方法l 重点重点 分治法的抽象控制策略分治法的抽象控制策略针对问题的抽象控制策略实现针对问题的抽象控制策略实现l 难点难点将递归算法改写成迭代算法的一般方法和实现将递归算法改写成迭代算法的一般方法和实现2.1 基本策略基本策略 一、求解大规模问题的复杂性一、求解大规模问题的复杂性二、化整为零、分而治之二、化整为零、分而治之 Pnp1n1p2n2pknks0s1skS 分解分解分治分治合并合并三、分治法的抽象控制策略三、分治法的抽象控制策略设:设: 原问题输入为原问题输入为a[n],简记为,简记为(1,,n);; 子问题输入为子问题输入为a[p]~a[q],,1≤p≤q≤n,简记为,简记为(p,,q)已知:已知: SOLUTION; int divide (int, int); int small (int, int); SOLUTION conquer (int, int); SOLUTION combine (SOLUTION, SOLUTION); SOLUTION DandC(p,q) /* divide and conquer */ { if(small(p,q)) return conquer(p,q); else { m=divide(p,q); return combine( DandC(p,m), DandC(m+1,q) ); } }分治法的抽象控制算法分治法的抽象控制算法 已知已知n个按非降次序排列的元素个按非降次序排列的元素a[n], 查找元素查找元素x是否在表中是否在表中出现出现, 若找到若找到, 返回其下标值返回其下标值, 否则否则, 返回一负数返回一负数. 2.2 2.2 二分检索二分检索一、问题一、问题二、分治的思路二、分治的思路原问题原问题: (n, a[0],…,a[n-1], x)数据分组数据分组: a[0]~a[k-2] a[k-1] a[k]~a[n-1]三个子问题三个子问题: (k-1, a[0],…,a[k-2], x) (1, a[k-1], x) (n-k, a[k],…,a[n-1], x) int BinSearch1(p, q, x){ int k=(p+q)/2; if(q
a[k]) return BinSearch1(k+1, q, x);} 三、递归算法三、递归算法l四、计算复杂度四、计算复杂度1. 二元比较树l 以有序表的中间元素为根节点的二分树以有序表的中间元素为根节点的二分树l 左子树上所有元素不比父节点元素值大左子树上所有元素不比父节点元素值大l 右子树上所有元素不比父节点元素值小右子树上所有元素不比父节点元素值小527136849圆形接点称为内节点圆形接点称为内节点, ,对应成功检索的数据元素对应成功检索的数据元素二分检索树的深度二分检索树的深度:二元比较树的深度二元比较树的深度: <11~22~33~44~55~66~77~88~9>9方形接点称为外节点方形接点称为外节点, ,对应不成功检索的数据子集对应不成功检索的数据子集n定理定理2.2 n 若若 n在在 区区 域域 [2k-1, 2k)中中 , 则则 对对 于于 一一 次次 成成 功功 的的 检检 索索 , BinSearch1至至多多作作k次次比比较较; 而而对对于于一一次次不不成成功功的的检检索索, 或或者者作作k-1次比较或者作次比较或者作k次比较。
次比较成功检索最好情况成功检索最好情况:不成功检索最好情况不成功检索最好情况: 成功检索最坏情况成功检索最坏情况: 不成功检索最坏情况不成功检索最坏情况: 2. 时间复杂度时间复杂度•平均情况分平均情况分析析内部路径长度之内部路径长度之和:和:I527136849外部路径长度之外部路径长度之和:和:E, E=I+2n成功检索的平成功检索的平均比较次数:均比较次数:S(n)=(I/n)+1不成功检索的平均比较次数不成功检索的平均比较次数: U(n)=E/(n+1)因为:因为:U(n)=O(log n),,所以:所以:S(n)=O(log n)由此可得:由此可得:S(n)=(1+1/n)U(n)-1 成功检索成功检索 不成功检索不成功检索 最好最好 最坏最坏 平均平均 最好最好 最坏最坏 平均平均 O(1) O(log n) O(log n) O(log n) O(log n) O(log n)•二分检索的时间复杂度结二分检索的时间复杂度结论论n定理定理2.3 n 设设a[n]含有含有n(n≥1)个不同元素个不同元素, 排序为排序为a[1]<…
说明:说明:任何以比较为基础的检索算法任何以比较为基础的检索算法, 最坏情况下的比较次数都最坏情况下的比较次数都不可能低于不可能低于O(log n), 因此因此, 二分检索是最优的最坏情况算法二分检索是最优的最坏情况算法3. 以比较为基础检索的时间下界以比较为基础检索的时间下界n思考题:思考题:n n 1. 请证明请证明 E=I+2nn 2. 请证明请证明 S(n)=(I/n)+1n2.3 找最大和最小元素找最大和最小元素在在n个不同元素的集合个不同元素的集合a[n]中同时找出它的最大和最小元素中同时找出它的最大和最小元素.一、问题一、问题二、直接搜索二、直接搜索 StraitSearch(n, &max, &min){ *max=*min=a[0]; for(i=1; i 再合并结果 递归算法递归算法typedef struct { ElemType max, min; } SOLUTION; SOLUTION MaxMin(i, j){ SOLUTION s, s1, s2; if(i==j) { s.max=s.min=a[i]; return s; } if(i==j-1) { if(a[i]=s2.max) ? (s.max=s1.max):( s.max=s2.max); (s1.min<=s2.min) ? (s.min=s1.min):( s.min=s2.min); return s;} 时间复杂度时间复杂度当当n是是2的幂时的幂时, 即对于某个正整数即对于某个正整数k, n=2k, 有有令令t(n)表示表示MaxMin需要的元素比较次数需要的元素比较次数, 存在下列递推关存在下列递推关系系 t(n)=2t(n/2)+2 = 2(2t(n/4)+2)+2 = 4t(n/4)+4+2 =2k-1t(2)+ =2k-1+2k-2 =3n/2-2 当元素的比较开销与整数比较开销相当时当元素的比较开销与整数比较开销相当时, 将前两条将前两条if语句合并语句合并为:为: if(i>=j-1) /* 对应一元素和两元素的情况 */ { if(a[i]
2.4 分类分类一、问题一、问题l二、插入分二、插入分类类 基本思想基本思想已分已分类类的部分的部分未分未分类类的部分的部分a[1]…a[j-1]a[j]a[j+1]…a[n]InsertSort(int n){ for(j=1; j
