第九章 算法分析与设计.ppt
《第九章 算法分析与设计.ppt》由会员分享,可在线阅读,更多相关《第九章 算法分析与设计.ppt(33页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、张乃孝 算法与数据结构C语言描述,1,第九章 算法分析与设计,9.1 算法分析技术 9.2 算法设计技术,张乃孝 算法与数据结构C语言描述,2,9.1 算法分析技术 评价一个算法的好坏,主要看执行算法时所需要占用的计算机空间的大小和计算过程需要花费的计算机CPU时间的多少。因此,算法的分析主要包含时间和空间两个方面。 9.1.1 空间代价分析 9.1.2 时间代价分析,张乃孝 算法与数据结构C语言描述,3,9.1.1 空间代价分析 根据算法执行过程中对存储空间的使用方式,我们又把对算法空间代价分析分成两种情形:静态分析和动态分析。,1. 静态分析 一个算法静态使用的存储空间,是指在算法执行前,
2、可以通过对程序静态的分析确定的使用空间,称为静态空间。,在静态空间分析中,值得注意的是数组(静态数组),它占用了大部分静态空间。,张乃孝 算法与数据结构C语言描述,4,2. 动态分析,一个算法在执行过程中以动态方式使用的存储空间是指在算法执行过程中动态分配的存储空间,它们从程序的表面形式上不能完全确定,我们把在算法执行过程中才能确定的空间称为动态空间。,动态空间的确定主要由两种情况构成:(1)函数的递归;(2)调用动态分配(malloc)和回收(free)函数。,张乃孝 算法与数据结构C语言描述,5,例9.2快速排序是一递归过程,调用该过程时,需分配的空间包括局部变量,和temp,形式参数,和
3、被排序的对象等。被排序对象用指针方式传递,调用时不必动态开辟新的空间,只须少量空间存放实参的地址等信息,所以递归调用时动态分配的空间与待排序记录的个数无关,为一常量。递归深度最大等于,这时动态空间代价为O(n),若每次都选较短的部分先处理,则递归深度不会超过log2n,这时动态空间代价即为O(log2n)(参看算法7.9)。这里实际被排序对象的空间应算静态空间,显然是O(n)。,(1)函数的递归,张乃孝 算法与数据结构C语言描述,6,()没有使用free函数 此时,动态空间代价为O(k),k为使用malloc的次数。 ()使用free函数 不能简单的用malloc使用的次数减去free的使用次
4、数作为动态空间的代价,应从malloc和free的具体执行情况来分析。 由书中(P284)算法进行动态空间代价分析,整个算法使用的动态空间代价为,(2)调用动态分配和回收函数。,张乃孝 算法与数据结构C语言描述,7,9.1.2 时间代价分析 算法的执行时间绝大部分花在循环和递归上,1. 循环 循环语句的时间代价一般用以下三条原则分析:,()对于多层嵌套循环,一般可按大表示法的乘法规则计算。但如果嵌套是有条件的,为精确计算其时间代价,要仔细累加循环中简单语句的实际执行数目,以确定其时间代价。,()对于一个循环,循环次数乘以每次执行简单语句的数目即为其时间代价。,()对于多个并列循环,可先计算每个
5、循环的时间代价,然后按大表示法的加法规则计算总代价。,张乃孝 算法与数据结构C语言描述,8,例9.6求无回溯的匹配算法的时间代价(参看算法3.6)。 解问题规模:模式串长度,目标串长度()。 算法中有一个循环,在分析时应从算法执行效果具体分析。 因为与顺序执行,循环中只增不减,循环条件为且,所以最多执行次,也最多执行次。又因为nexti,且循环过程中始终大于等于,所以i:= nexti执行次,总的时间代价为O(n)。,张乃孝 算法与数据结构C语言描述,9,2递归 对于递归算法,一般可把时间代价表示为一个递归方程。解这种递归方程最常用的方法是进行递归扩展,通过层层递归,直到递归出口,然后再进行化
6、简。,下面给出一类递归方程的求解方法。设递归方程为:,张乃孝 算法与数据结构C语言描述,10,递归扩展过程如下:,张乃孝 算法与数据结构C语言描述,11,设k,则,又设d(x)为“积性函数”即: , 则有:,张乃孝 算法与数据结构C语言描述,12,以下分三种情况讨论:,(1)d(b),则,张乃孝 算法与数据结构C语言描述,13,(2)d(b),则,张乃孝 算法与数据结构C语言描述,14,(3)d(b),则,张乃孝 算法与数据结构C语言描述,15,9.2 算法设计技术 9.2.1 分治法 9.2.2 贪心法 9.2.3 动态规划法 9.2.4 回溯法 9.2.5 分枝界限法,张乃孝 算法与数据结
7、构C语言描述,16,9.2.1 分治法(Divide and Conquer),分治法是把一个规模为的问题分成两个或多个较小的与原问题类型相同的子问题,通过对子问题的求解,并把子问题的解合并起来从而构造出整个问题的解,即对问题分而治之。如果子问题的规模仍然相当大,仍不足以很容易地求得它的解,这时可以对此子问题重复地应用分治策略。(典型的应用分治策略的例子是二分检索法),分治法处理问题的算法可以自然地写成一个递归的过程。一个用分治法编写的过程通常包括以下几部分:基值处理部分,(即把问题分到足够小后要进行的处理),分解问题的部分,递归调用部分和合并处理部分。,张乃孝 算法与数据结构C语言描述,17
8、,算法9.1 分治法的算法框架 return_type d_and_c( objArray * p , int i , int j ) int temp ; if ( simple (p,i,j) ) return solve (p,i,j) ; temp = divide (p,i,j) ; return(combine(d_and_c(p,i,temp-1),d_and_c(p,temp,j); ,算法9.1给出了一般分治法程序的框架,张乃孝 算法与数据结构C语言描述,18,分治策略应用得较广泛。快速排序算法,归并排序算法、梵塔问题等都可以用分治策略求解。,分治策略把问题分成若干个子问题,
9、分成的子问题的数目一般不大。如果每次分成的各子问题的规模相等或近乎相等的话,则分治策略的效率较高,否则效率就比较低。例如:直接插入排序可以看作是把原问题分解成两个子问题,一个是规模为的问题,另一个是规模为n-1的问题,算法的时间代价是O(n)级的。而归并排序把原问题分成了两个大小为n/2的问题,算法的时间代价是O(nlog2n)级的。,张乃孝 算法与数据结构C语言描述,19,9.2.1 贪心法(greedy),如果从某一给定的集合中选出一个子集,能够满足题目所给的要求,这个子集就是一个可行解。可行解不一定是唯一的。贪心法把构造可行解的工作分成许多阶段来完成。在各个阶段,选择那些在某些意义下是局
10、部最优的方案,期望各阶段的局部最优的选择带来整体最优。 但是,贪心法不是每次都能成功地产生出一个整体最优解。贪心法在每一阶段都保持着局部最优,而各阶段结果合起来,总的结果可能是不令人满意的,甚至有可能是坏的结果。,张乃孝 算法与数据结构C语言描述,20,张乃孝 算法与数据结构C语言描述,21,使用贪心法,首先要根据问题的特点确定一种度量好坏的标准,然后按照这个标准对处理序列中的每个对象逐个进行考察,如果被考察的元素符合给定的标准,就把该元素加入到局部的最优解中。由于度量的标准可能有不同的观点,因此如何选择适当的标准往往是能否达到整体最优解的关键。,贪心法是一个很直接的算法设计技巧。用贪心策略求
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第九章 算法分析与设计 第九 算法 分析 设计
限制150内