1、第第5章章 减治法减治法Reduce and Conquer Method算法设计与分析算法设计与分析算法设计与分析算法设计与分析本科本科本科本科生课程生课程生课程生课程Design and Analysis of AlgorithmDesign and Analysis of Algorithm海南大学信息科学技术学院海南大学信息科学技术学院College of Information Science and College of Information Science and Technology,Hainan UniversityTechnology,Hainan University2
2、024/3/22024/3/2Reduce and Conquer MethodReduce and Conquer Method2 2教学重点教学重点减治法的设计思想,各种经典问题的减治思想减治法的设计思想,各种经典问题的减治思想教学难点教学难点二叉查找树,堆排序二叉查找树,堆排序教学内容教学内容及目标及目标知识点知识点教学要求教学要求了解了解理解理解掌握掌握熟练掌握熟练掌握减治法的设计思想减治法的设计思想折半查找折半查找二叉查找树二叉查找树选择问题选择问题插入排序插入排序堆排序堆排序淘汰赛冠军问题淘汰赛冠军问题假币问题假币问题学习目标学习目标2024/3/22024/3/2Reduce a
3、nd Conquer MethodReduce and Conquer Method3 3第第5章章 减治法减治法 5.1 概述概述 5.2 查找问题中的减治法查找问题中的减治法5.3 排序问题中的减治法排序问题中的减治法5.4 组合问题中的减治法组合问题中的减治法阅读材料阅读材料 假币问题的复杂版本假币问题的复杂版本2024/3/22024/3/2Reduce and Conquer MethodReduce and Conquer Method4 45.1 概述概述 分分治治法法:把把一一个个大大问问题题划划分分为为若若干干个个子子问问题题,分分别别求求解解各各个个子子问问题题,然然后后将
4、将子子问问题题的的解解合合并并得得到到原问题的解。原问题的解。减减治治法法:同同样样把把一一个个大大问问题题划划分分为为若若干干个个子子问问题题,但但无无须须分分别别求求解解这这些些子子问问题题,只只需需求求解解其其中中的的一一个个子子问问题题,因因而而无无需需对对子子问问题题的的解解进进行行合合并。退化了的分治法。并。退化了的分治法。2024/3/22024/3/2Reduce and Conquer MethodReduce and Conquer Method5 5减治法的设计思想减治法的设计思想 减减治治法法将将问问题题划划分分为为若若干干子子问问题题,并并且且规规模模为为n的的原原问
5、问题题的的解解与与较较小小规规模模(通通常常是是n/2)的的子子问问题题的的解解之之间具有某种确定的关系:间具有某种确定的关系:(1)原问题的解只存在于其中一个较小规模的子问题中;原问题的解只存在于其中一个较小规模的子问题中;(2)原问题的解与其中一个较小规模的解之间有某种对应关系。原问题的解与其中一个较小规模的解之间有某种对应关系。由于原问题的解与较小规模的子问题的解之间存在由于原问题的解与较小规模的子问题的解之间存在这种关系,所以,这种关系,所以,只需求解其中一个较小规模的子问题只需求解其中一个较小规模的子问题就可以得到原问题的解就可以得到原问题的解。2024/3/22024/3/2Red
6、uce and Conquer MethodReduce and Conquer Method6 6 子问题子问题 的规模是的规模是n/2 子问题的解子问题的解 原问题的解原问题的解 原问题原问题 的规模是的规模是n减治法的设计思想减治法的设计思想 2024/3/22024/3/2Reduce and Conquer MethodReduce and Conquer Method7 7例:计算例:计算an的值,的值,应用应用减治技术减治技术得到如下计算方法:得到如下计算方法:应用应用分治法分治法得到得到an的计算方法是:的计算方法是:O(log2n)O(n log2n)=-且是奇数且是奇数且是
7、偶数且是偶数1)(1)(122)1(22naananaannn减治法的设计思想减治法的设计思想 2024/3/22024/3/2Reduce and Conquer MethodReduce and Conquer Method8 8 所以,通常来说,所以,通常来说,应用减治法应用减治法处理问题的效率是很高的,处理问题的效率是很高的,一般是一般是O(log2n)数量级数量级。减治法只对一个子问题求解减治法只对一个子问题求解,并且,并且不需要解的合并不需要解的合并。应。应用减治法(例如减半法)得到的算法通常具有如下递推式:用减治法(例如减半法)得到的算法通常具有如下递推式:减治法的设计思想减治法
8、的设计思想 对比分治法:对比分治法:2024/3/22024/3/2第第5 5章章 减治法减治法Page Page 9 9减治法的设计思想减治法的设计思想 一个简单的例子一个简单的例子两个序列的中位数两个序列的中位数问题描述:一个长度为问题描述:一个长度为n(n1)的升序序)的升序序列列S,处在第,处在第n/2个位置的数称为序列个位置的数称为序列S的中的中位数位数。两个序列的中位数是他们。两个序列的中位数是他们所有所有元素的元素的升序序列的中位数。现有两个等长升序序列升序序列的中位数。现有两个等长升序序列A和和B,试设计一个在时间和空间两方面都尽,试设计一个在时间和空间两方面都尽可能高效的算法
9、,找出两个序列的中位数。可能高效的算法,找出两个序列的中位数。A=11,13,15,17,19,B=2,4,10,15,20,则中位数为,则中位数为132024/3/22024/3/2第第5 5章章 减治法减治法Page Page 1010减治法的设计思想减治法的设计思想 想法想法 分别求出两个序列的中位数,记为分别求出两个序列的中位数,记为a和和b;比;比较较a和和b,有下列三种情况:,有下列三种情况:a=b:则:则a即为两个序列的中位数;即为两个序列的中位数;a b:则中位数只能出现在:则中位数只能出现在b和和a之间,在序列之间,在序列A中舍弃中舍弃a之后的元素得到序列之后的元素得到序列A
10、1,在序列,在序列B中舍弃中舍弃b之前的元素得到序列之前的元素得到序列B1;在在A1和和B1中分别求出中位数,重复上述过程,直中分别求出中位数,重复上述过程,直到两个序列中只有一个元素,则较小者即为所求。到两个序列中只有一个元素,则较小者即为所求。2024/3/22024/3/2第第5 5章章 减治法减治法Page Page 1111减治法的设计思想减治法的设计思想 对于两个给定的序列对于两个给定的序列A=11,13,15,17,19,B=2,4,10,15,20,求序列,求序列A和和B的中位数的过程。的中位数的过程。步步骤操作操作说明明序列序列A序列序列B1初始序列初始序列11,13,15,
11、17,192,4,10,15,202分分别求中位数求中位数11,13,15,17,192,4,10,15,2031510,结果在果在10,15之之间舍弃舍弃15之后元素,之后元素,11,13,15舍弃舍弃10之前元素,之前元素,10,15,204分分别求中位数求中位数11,13,1510,15,2051315,结果在果在11,15之之间舍弃舍弃13之前元素,之前元素,13,15舍弃舍弃15之后元素,之后元素,10,156分分别求中位数求中位数13,1510,1571013,结果在果在10,13之之间舍弃舍弃13之后元素,之后元素,13舍弃舍弃10之前元素,之前元素,158长度度为1,较小者小者
12、为所求所求13152024/3/22024/3/2第第5 5章章 减治法减治法Page Page 1212减治法的设计思想减治法的设计思想 算法算法5.1:两个序列中位数:两个序列中位数SearchMid输入:两个长度为输入:两个长度为n的有序序列的有序序列A和和B输出:序列输出:序列A和和B的中位数的中位数1.循环直到序列循环直到序列A和序列和序列B均只有一个元素均只有一个元素 1.1 a=序列序列A的中位数;的中位数;1.2 b=序列序列B的中位数;的中位数;1.3 比较比较a和和b,执行下面三种情况之一:,执行下面三种情况之一:1.3.1 若若a=b,则返回,则返回a,算法结束;,算法结
13、束;1.3.2 若若ab,则则在在序序列列A中中舍舍弃弃a之之后后的的元元素素,在在序序列列B中中舍弃舍弃b之前的元素,转步骤之前的元素,转步骤1;2.序列序列A和序列和序列B均只有一个元素,返回较小者;均只有一个元素,返回较小者;2024/3/22024/3/2第第5 5章章 减治法减治法Page Page 1313减治法的设计思想减治法的设计思想 算法分析算法分析 由于每次求两个序列的中位数后,得到由于每次求两个序列的中位数后,得到的两个子序列的长度都是上一个序列的一半,故循的两个子序列的长度都是上一个序列的一半,故循环共执行环共执行log2n次,时间复杂性为次,时间复杂性为O(log2n
14、)。算法除简单变量外没有额外开辟临时空间,故空间算法除简单变量外没有额外开辟临时空间,故空间复杂性为复杂性为O(1)。2024/3/22024/3/2Reduce and Conquer MethodReduce and Conquer Method1414第第5章章 减治法减治法 5.1 概述概述 5.2 查找问题中的减治法查找问题中的减治法5.3 排序问题中的减治法排序问题中的减治法5.4 组合问题中的减治法组合问题中的减治法阅读材料阅读材料 假币问题的复杂版本假币问题的复杂版本2024/3/22024/3/2Reduce and Conquer MethodReduce and Conq
15、uer Method15155.2 查找问题中的减治法查找问题中的减治法 5.2.1 折半查找折半查找 5.2.2 二叉查找树二叉查找树2024/3/22024/3/2Reduce and Conquer MethodReduce and Conquer Method1616基本思想:基本思想:(1)(1)取中间记录作为比较对象取中间记录作为比较对象,若给定值与中间记录的关键码,若给定值与中间记录的关键码相等,则查找成功;相等,则查找成功;(2)(2)若给定值小于中间记录的关键码,则若给定值小于中间记录的关键码,则在中间记录的在中间记录的左半区左半区继续查找;继续查找;(3)(3)若给定值大于
16、中间记录的若给定值大于中间记录的关键码,则在中间记录的关键码,则在中间记录的右半区右半区继续查找。继续查找。重复上述过程,直到成功,或所查找的区域无记录,查找失败。重复上述过程,直到成功,或所查找的区域无记录,查找失败。折半查找折半查找 r1 rmid-1 rmid rmid+1 rn (mid=(1+n)/2)如果如果 krmid 查找这里查找这里特点:每次与中间记录比较特点:每次与中间记录比较 k 问题问题:在有序表中查找值为在有序表中查找值为k k的记录的记录2024/3/22024/3/2Reduce and Conquer MethodReduce and Conquer Metho
17、d1717例:查找值为例:查找值为14的记录的过程的记录的过程0 1 2 3 4 5 6 7 8 9 10 11 12 13 7 14 18 21 23 29 31 35 38 42 46 49 52low=1high=13mid=7 high=6 mid=3 high=2 mid=1 31141814714low=2mid=2 14=142024/3/22024/3/2Reduce and Conquer MethodReduce and Conquer Method1818算法算法5.1折半查找折半查找输入:有序序列输入:有序序列r1,r2,rn,待查值,待查值k输出:若成功返回记录输出:
18、若成功返回记录k的位置,否则返回失败标志的位置,否则返回失败标志0 1.low=1;high=n;/设置初始查找区间设置初始查找区间 2.测试查找区间测试查找区间low,high是否存在,若不存在,则查找失败;是否存在,若不存在,则查找失败;否则否则 3.取中间点取中间点mid=(low+high)/2;比较比较k与与rmid,有以下三种情况:,有以下三种情况:3.1 若若krmid,则,则 low=mid+1;查找在右半区进行,转;查找在右半区进行,转2;3.3 若若k=rmid,则查找成功,返回记录在表中位置,则查找成功,返回记录在表中位置mid;折半查找折半查找 2024/3/22024
19、/3/2Reduce and Conquer MethodReduce and Conquer Method1919 算法分析算法分析 用判定树描述折半查找的判定过程。每个结用判定树描述折半查找的判定过程。每个结点对应有序序列中的一个记录,结点值为该记录在有序点对应有序序列中的一个记录,结点值为该记录在有序序列中的位置。长度为序列中的位置。长度为n的判定树的构造方法为:的判定树的构造方法为:(1)当)当n=0时,判定树为空;时,判定树为空;(2)当)当n0时,时,根结点:根结点:是有序表中序号为是有序表中序号为mid=(n+1)/2的记录;的记录;左子树:左子树:是有序表是有序表r1 rmid
20、-1对应的判定树;对应的判定树;右子树:右子树:是与是与rmid+1 rn相对应的判定树相对应的判定树折半查找折半查找 2024/3/22024/3/2Reduce and Conquer MethodReduce and Conquer Method2020具有具有1111个结点的判定树个结点的判定树6312548111079 查找查找k k过程:过程:从根结点从根结点该记录结点的路径;该记录结点的路径;和和K K值的比较次数:值的比较次数:等于该记录结点在树中的等于该记录结点在树中的层数层数。具有。具有n个结点的判定数的深度为个结点的判定数的深度为 。折半查找折半查找 2024/3/220
21、24/3/2Reduce and Conquer MethodReduce and Conquer Method21215.2 查找问题中的减治法查找问题中的减治法 5.2.1 折半查找折半查找 5.2.2 二叉查找树二叉查找树2024/3/22024/3/2Reduce and Conquer MethodReduce and Conquer Method2222n n二叉查找树(BST)/二叉排序树的性质n n若它的左子树不空,则左子树上所有结点的值均若它的左子树不空,则左子树上所有结点的值均小于根结点的值;小于根结点的值;n n若它的右子树不空,则右子树上所有结点的值均若它的右子树不空,
22、则右子树上所有结点的值均大于根结点的值;大于根结点的值;n n它的左右子树也都是二叉排序树。它的左右子树也都是二叉排序树。二叉查找树二叉查找树BST 2024/3/22024/3/2Reduce and Conquer MethodReduce and Conquer Method2323二叉查找树二叉查找树BST 由由二二叉叉排排序序树树的的定定义义,在在二二叉叉排排序序树树root中中查查找找给给定定值值k的的过程是:过程是:若若root是空树,则查找失败;是空树,则查找失败;若若k根结点的值,则查找成功;根结点的值,则查找成功;否则,若否则,若k根结点的值根结点的值,则在,则在root左
23、子树上查找左子树上查找;否则,在否则,在root的的右子树上查找右子树上查找;上述过程一直持续到上述过程一直持续到k被找到被找到或者或者待查找的子树为空待查找的子树为空,如,如果待查找的子树为空,果待查找的子树为空,则查找失败则查找失败。v二叉排序树的二叉排序树的查找效率查找效率就在于只需要就在于只需要查找两个子树之一查找两个子树之一。2024/3/22024/3/2Reduce and Conquer MethodReduce and Conquer Method242458427090634555836710二叉查找树二叉查找树BST 查找查找58与与95记录的示例记录的示例2024/3/
24、22024/3/2Reduce and Conquer MethodReduce and Conquer Method2525二叉排序树的结点结构为:二叉排序树的结点结构为:struct BiNode int data;/结点的值,假设查找集合的元素为整型结点的值,假设查找集合的元素为整型 BiNode*lchild,*rchild;/指指向左向左、右子树右子树的指针的指针;算法算法5.2二叉排序树的查找二叉排序树的查找 BiNode*SearchBST(BiNode*root,int k)if(root=NULL)return NULL;else if(root-data=k)return
25、root;else if(kdata)return SearchBST(root-lchild,k);else return SearchBST(root-rchild,k);二叉查找树二叉查找树BSTBST 2024/3/22024/3/2Reduce and Conquer MethodReduce and Conquer Method2626建立二叉查找树算法建立二叉查找树算法BiNode*InsertBST(BiNode*root,int data)if(root=NULL)root=new BiNode;root-data=data;/申请一个新结点申请一个新结点 root-lchi
26、ld=root-rchild=NULL;/叶子结点叶子结点 return root;if(datadata)root-lchild=InsertBST(root-lchild,data);elseroot-rchild=InsertBST(root-rchild,data);return root;二叉查找树二叉查找树BSTBST 2024/3/22024/3/2Reduce and Conquer MethodReduce and Conquer Method2727BiNode*createBST(int a,int n)/建立二叉查找树建立二叉查找树 BiNode*T=NULL;for(
27、int i=0;in;i+)T=InsertBST(T,ai);/在二叉查找树在二叉查找树 T中插入中插入ai return T;二叉查找树二叉查找树BSTBST 2024/3/22024/3/2Reduce and Conquer MethodReduce and Conquer Method2828二叉查找树二叉查找树BSTBST 按按63,90,55,58,70,42,10,45,83,67顺序构造的二叉排序树顺序构造的二叉排序树584270906345558367102024/3/22024/3/2Reduce and Conquer MethodReduce and Conquer
28、Method2929n n算法分析:算法分析:n在二叉排序树上查找关键码在二叉排序树上查找关键码K等于结点值的过程,等于结点值的过程,恰好走了一条恰好走了一条从根结点从根结点k结点结点的路径;的路径;n和和K值的比较次数值的比较次数:等于:等于k值结点值结点在二叉排序树中在二叉排序树中的层数的层数,比较次数,比较次数最少为最少为1次次(即整个二叉排序树(即整个二叉排序树的根结点就是待查结点),的根结点就是待查结点),最多不超过树的深度最多不超过树的深度。n具有具有n个结点的二叉树的个结点的二叉树的深度深度至少是至少是 ,至多是至多是n,所以,所以,二叉排序树二叉排序树的查找性能在的查找性能在
29、O(log2n)和和O(n)之间。之间。二叉查找树二叉查找树BSTBST 2024/3/22024/3/2第第5 5章章 减治法减治法Page Page 3030问题问题 设无序序列设无序序列 T=(r1,r2,rn),T 的第的第k(1kn)小元素定义为小元素定义为T 按升序排列后在第按升序排列后在第k个位置上的元素。给定一个个位置上的元素。给定一个序列序列T和一个整数和一个整数k,寻找,寻找 T 的第的第k小元素的问题称为小元素的问题称为选择问题选择问题。特别地,将寻找第特别地,将寻找第n/2小元素的问题称为小元素的问题称为中值问题中值问题。5.2.3 5.2.3 选择问题选择问题想法想法
30、 固然可将固然可将T排序后取第排序后取第k个元素,但排序算法最好时间个元素,但排序算法最好时间是是O(nlog2n),如应用减治技术,可将算法平均时间性能提高,如应用减治技术,可将算法平均时间性能提高到到O(n)。考虑。考虑快速排序快速排序中的划分过程,一般情况下,设待划中的划分过程,一般情况下,设待划分的序列为分的序列为ri rj,选定一个轴值将序列,选定一个轴值将序列ri rj进行划分,使进行划分,使得比轴值小的元素都位于轴值的左侧,比轴值大的元素都位得比轴值小的元素都位于轴值的左侧,比轴值大的元素都位于轴值的右侧,假定轴值的最终位置是于轴值的右侧,假定轴值的最终位置是s,则:,则:202
31、4/3/22024/3/2第第5 5章章 减治法减治法Page Page 3131(1)若)若k=s,则,则rs就是第就是第k小元素;小元素;(2)若)若ks,则第,则第k小元素一定在序列小元素一定在序列rs+1 rj中;中;无无论论上上面面哪哪种种情情况况,或或者者已已经经得得到到结结果果,或或者者将将选选择择问问题的查找区间减少一半(如果轴值恰好是序列的中值)题的查找区间减少一半(如果轴值恰好是序列的中值)5.2.3 5.2.3 选择问题选择问题 ri rk rs-1 rs rs+1 rj 均均rs 轴值轴值 均均rs ri rs-1 rs rs+1 rk rj 均均rs 轴值轴值 均均r
32、s(a)若若ks,则,则rk在右半区在右半区2024/3/22024/3/2第第5 5章章 减治法减治法Page Page 3232选择问题的例子选择问题的例子:5 3 8 1 4 6 9 2 7 选择问题的查找过程示例(选择问题的查找过程示例(查找第查找第4小元素)小元素)以以5为轴值划分序列为轴值划分序列42,只在右侧查找,只在右侧查找以以4为轴值划分序列为轴值划分序列44,轴值即为第,轴值即为第4小元素小元素 2 3 4 1 5 6 9 8 7 2 3 4 1 .2 4 3 4 3 3 4 5.2.3 5.2.3 选择问题选择问题2024/3/22024/3/2第第5 5章章 减治法减治
33、法Page Page 3333算法算法选择问题选择问题输入:无序序列输入:无序序列r,位置,位置k输出:返回第输出:返回第k小的元素值小的元素值 1.i=1;j=n;/设置初始查找区间设置初始查找区间 2.以以ri为为轴轴值值对对序序列列rirj进进行行一一次次划划分分,得得到到轴轴值的位置值的位置s;3.将轴值位置将轴值位置s与与k比较比较 3.1 如果如果k=s,则将,则将rs作为结果返回;作为结果返回;3.2 否则,如果否则,如果ks,则,则j=s-1,转步骤,转步骤2;3.3 否则,否则,i=s+1,转步骤,转步骤2;5.2.3 5.2.3 选择问题选择问题2024/3/22024/3/2第第5 5章章 减治法减治法Page Page 3434最好情况最好情况:每次划分的轴值恰好是序列的中值,则可以保证处每次划分的轴值恰好是序列的中值,则可以保证处理的区间比上一次减半,由于在一次划