《图问题中的流塑法筛选法调整堆立论问题》由会员分享,可在线阅读,更多相关《图问题中的流塑法筛选法调整堆立论问题(12页珍藏版)》请在金锄头文库上搜索。
1、8.2 图问题中的流塑法图问题中的流塑法8.2.41 筛选法调整堆立论问题筛选法调整堆立论问题 (RecursionRecursion)就是子程序(或函数)直接调用)就是子程序(或函数)直接调用自己或通过一系列调用语句间接调用自己,是一种自己或通过一系列调用语句间接调用自己,是一种描述问题和解决问题的基本方法。描述问题和解决问题的基本方法。有两个基本要素:有两个基本要素: 确定到何时终止;确定到何时终止; 大问题是如何分解为小问题的。大问题是如何分解为小问题的。8.2.41 筛选法调整堆立论问题筛选法调整堆立论问题 ,调调用用函函数数和和被被调调用用函函数数是是同同一一个个函函数数,需需要要注
2、注意意的的是是筛筛选选法法调调整整堆堆函函数数的的调调用用层层次次,如如果果把把调调用用筛筛选选法法调调整整堆堆函函数数的的主主函函数数称称为为第第0 0层层,进进入入函函数数后后,首首次次筛筛选选法法调调整整堆堆调调用用自自身身称称为为第第1层层调调用用;从从第第i层层筛筛选选法法调调整整堆堆调调用用自自身身称称为为第第i+1层层。反反之之,退退出出第第i+1层层调调用用应应该该返返回回第第i层层。采采用用图图示示方方法法描描述述筛筛选选法法调调整整堆堆函函数数的的运运行行轨轨迹迹,从从中中可可较较直直观观地地了解到各调用层次及其执行情况。了解到各调用层次及其执行情况。 一一个个筛筛选选法法
3、调调整整堆堆函函数数的的调调用用过过程程类类似似于于多多个个函函数数的的嵌嵌套套调调用用,只只不不过过调调用用函函数数和和被被调调用用函函数数是是同同一一个个函函数数。为为了了保保证证筛筛选选法法调调整整堆堆函函数数的的正正确确执执行行,系统需设立一个工作栈。具体地说,筛选法调整堆调用的内部执行过程如下:系统需设立一个工作栈。具体地说,筛选法调整堆调用的内部执行过程如下:(1 1)运运行行开开始始时时,首首先先为为筛筛选选法法调调整整堆堆调调用用建建立立一一个个工工作作栈栈,其其结结构构包包括括值值参参、局部变量和返回地址;局部变量和返回地址;(2 2)每每次次执执行行筛筛选选法法调调整整堆堆
4、调调用用之之前前,把把筛筛选选法法调调整整堆堆函函数数的的值值参参和和局局部部变变量量的当前值以及调用后的返回地址压栈;的当前值以及调用后的返回地址压栈;(3 3)每每次次筛筛选选法法调调整整堆堆调调用用结结束束后后,将将栈栈顶顶元元素素出出栈栈,使使相相应应的的值值参参和和局局部部变变量恢复为调用前的值,然后转向返回地址指定的位置继续执行。量恢复为调用前的值,然后转向返回地址指定的位置继续执行。 可读性强,而且容易用数学归纳法来证明算法可读性强,而且容易用数学归纳法来证明算法的正确性,因此,它为设计算法和调试程序带来的正确性,因此,它为设计算法和调试程序带来很大方便,是算法设计中的一种强有力
5、的工具。很大方便,是算法设计中的一种强有力的工具。但是,因为筛选法调整堆算法是一种自身调用自但是,因为筛选法调整堆算法是一种自身调用自身的算法,随着筛选法调整堆深度的增加,工作身的算法,随着筛选法调整堆深度的增加,工作栈所需要的空间增大,筛选法调整堆调用时的辅栈所需要的空间增大,筛选法调整堆调用时的辅助操作增多,因此,筛选法调整堆算法的运行效助操作增多,因此,筛选法调整堆算法的运行效率较低。率较低。 问题描述:一个长度为问题描述:一个长度为n(n1)的)的升序序列升序序列S,处在第,处在第n/2个位置的数称为序列个位置的数称为序列S的中位的中位数数 。两个序列的中位数是他们所有元素的升。两个序
6、列的中位数是他们所有元素的升序序列的中位数。现有两个等长升序序列序序列的中位数。现有两个等长升序序列A和和B,试设计一个在时间和空间两方面都尽,试设计一个在时间和空间两方面都尽可能高效的算法,找出两个序列的中位数。可能高效的算法,找出两个序列的中位数。 规规模模为为n的的原原问问题题的的解解与与较较小小规规模模(通通常常是是n/2)的子问题的解之间具有关系:)的子问题的解之间具有关系:(1)原原问问题题的的解解只只存存在在于于其其中中一一个个较较小小规规模模的的子子问问题中;题中;(2)原原问问题题的的解解与与其其中中一一个个较较小小规规模模的的解解之之间间存存在在某种对应关系。某种对应关系。
7、 由于原问题的解与较小规模的子问题的解之间由于原问题的解与较小规模的子问题的解之间存在这种关系,所以,存在这种关系,所以,只需求解其中一个较小规模只需求解其中一个较小规模的子问题就可以得到原问题的解。的子问题就可以得到原问题的解。2024/9/7例:计算例:计算an的值,的值,应用应用层治技术层治技术得到如下计算方法:得到如下计算方法:应用应用分治法分治法得到得到an的计算方法是:的计算方法是: O (log2n)O (nlog2n) = = =- -且是奇数且是奇数且是偶数且是偶数1)(1)(122)1(22naananaannn想法:想法:分别求出两个序列的中位数,记为分别求出两个序列的中
8、位数,记为a和和b;比;比较较a和和b,有下列三种情况:,有下列三种情况: a = b:则:则a即为两个序列的中位数;即为两个序列的中位数; a b:则中位数只能出现在:则中位数只能出现在b和和a之间,在序列之间,在序列A中舍弃中舍弃a之后的元素得到序列之后的元素得到序列A1,在序列,在序列B中舍弃中舍弃b之前的元素得到序列之前的元素得到序列B1;在在A1和和B1中分别求出中位数,重复上述过程,直中分别求出中位数,重复上述过程,直到两个序列中只有一个元素,则较小者即为所求。到两个序列中只有一个元素,则较小者即为所求。q基本思想:在基本思想:在有序表有序表中,中,取中间记录作为比较对象,取中间记
9、录作为比较对象,若若给定值与中间记录的关键码相等,则查找成功;若给定给定值与中间记录的关键码相等,则查找成功;若给定值小于中间记录的关键码,则在中间记录的左半区继续值小于中间记录的关键码,则在中间记录的左半区继续查找;若给定值大于中间记录的关键码,则在中间记录查找;若给定值大于中间记录的关键码,则在中间记录的右半区继续查找。不断重复上述过程,直到查找成功,的右半区继续查找。不断重复上述过程,直到查找成功,或所查找的区域无记录,查找失败。或所查找的区域无记录,查找失败。 2024/9/7Page 11判定树判定树长度为长度为n的判定树的构造方法为:的判定树的构造方法为: (1)当)当n=0时,判
10、定树为空;时,判定树为空;(2)当)当n0时,判定树的根结点是有序表中序号时,判定树的根结点是有序表中序号为为mid=(n+1)/2(取地板)的记录,根结点的左子(取地板)的记录,根结点的左子树是与有序表树是与有序表r1 rmid-1相对应的判定树,根相对应的判定树,根结点的右子树是与结点的右子树是与rmid+1 rn相对应的判定树。相对应的判定树。 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;