收藏 分享(赏)

算法分析与设计 第1章.ppt

上传人:dreamzhangning 文档编号:4052281 上传时间:2018-12-06 格式:PPT 页数:40 大小:972KB
下载 相关 举报
算法分析与设计 第1章.ppt_第1页
第1页 / 共40页
算法分析与设计 第1章.ppt_第2页
第2页 / 共40页
算法分析与设计 第1章.ppt_第3页
第3页 / 共40页
算法分析与设计 第1章.ppt_第4页
第4页 / 共40页
算法分析与设计 第1章.ppt_第5页
第5页 / 共40页
点击查看更多>>
资源描述

1、算法设计方法,吴哲辉 崔焕庆 马炳先 吴振寰 编著机械工业出版社,2,章节内容,第1章 算法设计与分析概论 第2章 分治与递归算法 第3章 散列与凝聚算法 第4章 贪心算法 第5章 动态规划算法 第6章 回溯算法 第7章 分支限界算法 第8章 NP-完全问题,3,第1章 算法设计与分析概论,4,1.1 算法的定义和特征,一个算法是求解某一类特定问题的一组有穷规则的集合。 首先,一个算法是一组规则,通常称之为算法步骤,这组规则是有穷的,即能用有限的形式表示出来。 其次,一个算法是针对一类问题而设计的。 算法通常具有以下5方面的特征。 有限性 确定性 可行性 输入 输出,5,1.2 算法的描述,算

2、法主要包含两个方面的内容: 算法设计:主要研究怎样针对某一特定类型的问题设计出求解步骤。 算法分析:讨论所设计出来的算法步骤的正确性和复杂性。 对于设计出来的一类问题的求解步骤,需要一种表达方式,即算法描述。,6,1.2 算法的描述,例1.1 冒泡排序算法。 算法的基本思想:轻者(小的元素)像气泡那样从水底往上浮。在排序过程中,从后面(理解为底部)开始,每次把相邻的两个元素作比较,当前面的元素大于后面的元素时,就交换它们的位置。这样,所有相邻的元素比较一遍以后最小的元素就被交换到了最前面(浮到上面)。下一轮比较时,就只需从第二个元素开始对元素序列重复上述工作。依此类推,直到把最后两个元素排好序

3、。,7,1.2 算法的描述,算法1.1 冒泡排序 输入:待排序数组A,其中有n个元素; 输出:排好序的数组A。 bubblesort(float A, int n) int i,j;for (i=0; ii; j-)if (AjAj-1)swap(A+j, A+j-1); ,8,1.2 算法的描述,算法1.2 元素交换 输入:待交换元素的位置x和y; 输出:交换后的结果仍存于x和y中。 swap(float *x, float *y) float u = *x;*x = *y;*y = u; ,9,1.2 算法的描述,例1.2 求最大公约数的辗转相除算法。 基本思想:用小的数作除数,大的数作为

4、被除数,做除法求余,如果余数等于零,那么小的数就是两个数的最大公约数。否则用小的数做被除数,余数作为除数,再做除法求余,如此辗转相除下去,直到余数等于零。那时的除数就是要求的原本两个数的最大公约数。,10,1.2 算法的描述,算法1.3 求最大公约数的辗转相除法 输入:两整数m和n; 输出:m和n的最大公约数。 int gcd(int m, int n)int a=maxm,n;int b=minm,n;int c;while (b!=0) c=a mod b;a=b;b=c;return (a); ,11,1.2 算法的描述,算法1.4 求最大公约数的递归算法 输入:两整数m和n; 输出:m

5、和n的最大公约数。 int gcd(int m, int n)int a=maxm,n;int b=minm,n;int c;if (b = 0) return (a);else c=a mod b;return( gcd(b,c) );,12,1.2 算法的描述,例1.3 多项式求值的Horner算法。 Horner根据等式设计出一个高效算法。,13,1.2 算法的描述,算法1.5 多项式求值的Horner算法 输入:多项式的系数和初值; 输出:多项式的值。 步骤:(仅主体部分)P(x0)=a0;for (i=1; i=n; i+)P(x0) = P(x0)*x0 + ai;,14,1.2

6、算法的描述,例1.4 集合的并运算和交运算。 首先,我们给出两个更为基本的集合运算算法。一个用Member(b,A)表示,其功能是考查b是不是集合A的一个元素。另一个记为Insert(b,A),它的功能是在集合A中增加一个元素b,这个运算以b原本不是A的元素为前提。 实现Member(b,A)的实质性工作是查找。把A的元素逐个同b进行比较,若找到一个元素等于b,就输出1并停止运算;当查找完集合A的全部元素都没有找出同b相等的元素时,就输出0。,15,1.2 算法的描述,算法1.6 集合元素查找算法 输入:集合A和待查找的元素b,其中; 输出:b在集合A中则返回1,否则返回0。 int Memb

7、er(float b, float A, int m) int i;for (i=0; im; i+)if (Ai = b) return (1);return (0); ,16,1.2 算法的描述,算法1.7 向集合中插入元素算法 输入:集合A和待插入的元素b,其中; 输出:集合S,。 Insert(float b,float A,float S,int m) int i;for (i=0; im; i+)Si = Ai;Sm = b; ,17,1.2 算法的描述,算法1.8 集合的并运算算法 输入:集合A和集合B; 输出:集合S,其中并且满足。 Union(float A, int m,

8、float B, int n, float S) int i, j;S=A;for (i=0; in; i+) if (Member(Bi, A, j) = 0)Insert(Bi, S, S, j+); ,18,1.2 算法的描述,算法1.9 集合的交运算算法 输入:集合A和集合B,其中,; 输出:集合S,其中并且满足。 Intersection(float A, int m, float B, int n, float S) int i, j = 1;S=NULL ;for (i=0; in; i+)if (Member(Bi, A, m) = 1)Insert(Bi, S, S, j+)

9、; ,19,1.3 算法分析,算法分析工作可归结为两部分: 正确性证明:主要包括算法的可终止性(即对任意输入,算法的执行都可以在有限步内终止)和算法的执行结果(输出)与问题(问题类)的求解要求相符两方面的证明。 复杂性分析:指算法的执行所需要的时间量和空间量的分析,其中对时间量的分析尤为重要。,20,定义1.1 设f(n)和g(n)为定义在自然数集上的两个函数。 (1) 若存在正常数c和自然数n0,使得当 时都有则称为的上界函数,记为 。 (2) 若存在正常数c和自然数n0 ,使得当 时都有则称为的下界函数,记为 。 (3) 若存在两个正常数c1、c2和自然数n0 ,使得当 时都有则称为的精确

10、界函数,记为 。,1.3 算法分析,21,1.3 算法分析,算法复杂性的界函数加(减)或乘(除)一个常数,并不产生任何影响。即若a(a0)为一个常数,那么,22,1.3 算法分析,由于对任意自然数n和k,都有 ,当算法的时间(空间)复杂度的界函数为一个(n的)多项式函数时,可以取这个多项式的最高次幂作为界函数,即(假设 ),23,1.3 算法分析,例1.5 冒泡排序算法(算法1.1)的时间复杂性分析。 冒泡排序算法主要包含两种基本运算:比较和交换。比较和交换运算都出现在双重嵌套循环语句的循环体中,比较运算是作为交换运算的条件而出现的。从这个双重嵌套的循环语句结构容易知道,比较运算共需进行 次。

11、,24,1.3 算法分析,当待排序数组的元素之间满足关系时,一次交换运算都不需要执行。反之,如果待排序数组的元素满足关系那么每一次比较后都需要把相邻两个元素进行交换。,25,1.3 算法分析,平均情况下的时间复杂性分析需要先引入逆序的概念。在一个序列 中,若存在 ,使得ij但 ,则说Ai和Aj构成一个逆序。显然,用算法1.1对这个序列进行排序,交换运算的次数就等于这个序列中逆序的个数。由于n个数的不同排列共有n!种,而在各种排列中,逆序个数的最小值为0,最大值为n(n-1)/2。因此各种分布的平均逆序个数为后面将证明,上式值等于n(n-1)/4。可见平均交换运算次数和最坏情况下的交换运算次数都

12、是输入量n的二次函数,即 。,26,1.3 算法分析,例1.6 求最大公约数的辗转相除算法的时间复杂性分析。 分析算法1.3在最坏情况下的时间复杂性。需要引入斐波那契数列:用tmd(a,b)表示用辗转相除法求正整数a、b的最大公约数需要辗转相除的次数,易知 。 进一步还可以证明,对任意两个正整数a=b,若 ,则有 。 可见,辗转相除的次数虽然同a、b两个数的大小有关,但并不是随a、b两个数的增加而递增的函数,只有当a、b两个数为斐波那契数列的相邻两项时,才取得局部极大值。,27,1.3 算法分析,例1.7 多项式求值算法的时间复杂性分析。 从算法1.5容易看出,Horner算法的主体是一个循环

13、语句,循环的每一轮只做一次乘法和一次加法。因此,对一个n次多项式和未定元的一个取值,Horner算法只需n次乘法运算和n次加法运算,比直接的求解方法节省n-1次乘法运算。,28,1.3 算法分析,例1.8 集合的并运算和交运算算法的时间复杂性分析。 实现AB,最多需要n=|B|次Member(bi,A)和次Insert(bi,S,S)运算。从算法1.6可以看出,执行一次Member(bi,A)算法,最多需要n=|A|次元素比较运算;再由算法1.7知,执行一次Insert(bi,S,S)算法,共需要m+1次赋值运算。因此,最多需要做nm次比较运算和n(m+1)次赋值运算。 类似分析算法1.9。,

14、29,1.4 递归方程求解,所谓递归算法,就是把一个输入规模较大的问题转化为一个输入规模较小的同类问题,并反复进行这种转化,直到输入规模小到可以直接求解为止。 对递归算法的时间复杂性分析,涉及到递归方程的求解。因此,本节专门讨论递归方程的求解方法。下面先给出一个产生递归方程的例子。,30,1.4 递归方程求解,例1.9 梵塔问题。,31,1.4 递归方程求解,假设对n-1块金片怎样移动我们已经掌握,那么就可以把金片分成两部分:上面块作为一部分,最底下的一块作为另一部分。这样,就可以把上面的块金片整体移动到第三根针上,然后把最底下的一块金片移到第二根针上,最后再把第三根针上的块金片整体移到第二根

15、针上,放在最底下那块金片的上面。从而完成了把有块金片的梵塔从第一根针移动到第二根针上的工作。可以看到,实现这个移动,是通过块金片的整体移动两次和一块金片移动一次组成的。如果把有块金片的梵塔从一根针移动到另一根针需要做单块金片的移动的次数记为,那么就可以得到,32,1.4 递归方程求解递归公式的展开,如梵塔问题:,33,1.4 递归方程求解递归公式的展开,例1.10 求解递推公式令n=2k。这样就转化为从而:,34,1.4 递归方程求解特征方程方法,常系数线性齐次递归方程可表示为其中 为常数。特征方程为是一个k次代数方程,递归方程有 型的解当且仅当上述方程有解。假设的k个根为 ,那么一般解为其中

16、 为待定常数。代入伴随式的k个初始条件就可以确定 ,从而求出确定解。,35,1.4 递归方程求解特征方程方法,如果特征方程有重根,譬如 为单根;那么一般解为再用伴随的k个初始条件就可以确定常数 。,36,1.4 递归方程求解特征方程方法,例1.11 求解下列递推公式,解:它的特征方程为特征方程有重根 因此递归方程的一般解为代入初始条件和可以求出c1=0和c2=1,因此递归公式的 解为Sn=n。 即这个递归公式产生正整数序列。,37,1.4 递归方程求解特征方程方法,常系数线性非齐次递归方程常系数非齐次递归方程的求解可以分三个步骤来实现: 第1步:求齐次方程的通解; 第2步:求出非齐次方程的一个

17、特解; 第3步:用齐次方程的通解加上非齐次方程的一个特解作为非齐次方程的一般解,再代入k个初始条件确定待定常数的取值,得到的便是非齐次方程的一个确定解。,38,1.4 递归方程求解特征方程方法,例1.12 求解常系数线性非齐次递归方程,解:该常系数线性非齐次方程所对应的齐次方程为它的特征方程为 求出特征方程的根r=2,从而得到齐次方程的通解 通过观察易知,若取 则 这样就有 即 是非齐次方程的一个特解,从而 是非齐次方程(1.22)的一般解。代入初始条件得到 即求出C=-2。这样就求出常系数线性非齐次递归方程的解为,39,1.5 生成函数,如果 那么,就称G(x)为无限序列 的生成函数。 例1.13 求梵塔问题的生成函数。,解:从例1.9的分析已知,梵塔问题可归结为递归公式的求解。假设这个递归公式对应的生成函数为那么就有 从而因此,求出梵塔问题的生成函数为就得出所表示的序列为,40,1.5 生成函数,例1.15 用生成函数方法求冒泡排序算法的平均时间复杂性。 。,解:从例1.5的分析已经知道,对n个数冒泡排序算法的平均交换运算次数为其中In(k)表示n个数的排列中有k个逆序的排列数。易知令 可得到 求Gn(x)求导数,得: 从而:,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报