1、,课程目的:计算机算法设计与分析导引 以算法设计为主,介绍算法设计的主要方法和基本思想;并简要介绍算法分析概念 不是程序设计课,也不是数学课 主要内容: 算法复杂性分析 方法:蛮力法、递归与分治、减治法、动态规划、贪心法。,算法设计与分析,第1章 算法概述,本章主要知识点: 1.1 算法与程序 1.2 算法问题求解基础 1.3 重要问题类型 1.4 基本数据结构 1.5 算法分析的基本原则 1.6 算法复杂性分析,1.1 算法与程序,算法:是满足下述性质的指令序列。 输入:有零个或多个外部量作为算法的输入。 输出:算法产生至少一个量作为输出。 确定性:组成算法的每条指令清晰、无歧义。 有限性:
2、算法中每条指令的执行次数有限,执行每条指令的时间也有限。 程序: 程序是算法用某种程序设计语言的具体实现。 程序可以不满足算法的性质(4)即有限性。 例如操作系统,是一个在无限循环中执行的程序,因而不是一个算法。操作系统的各种任务可看成是单独的问题,每一个问题由操作系统中的一个子程序通过特定的算法来实现。该子程序得到输出结果后便终止。,1.1 算法与程序,算法的概念问题算法输入computer 输出 同一算法可以用几种不同的形式来描述 同一问题,可能存在几种不同的算法,不同算法解题速度也会有所不同。,例子:求两个不全为0的非负整数m和n的最大公约数记为gcd(m,n),欧几里德算法 /输入:两
3、个不全为0的非负整数m, n /输出: m, n的最大公约数 While n0 dorm mod n m nn r Return m 中学里学过的计算方法 找到m, n的所有质因数 从上述质因数分解式中找出所有公因数(如果p是一个因数,而且在m和n的质因数分解式中分别出现x和y次,则将p重复minx.y次 将上述找到的质因数相乘,其结果作为最大公约数,1.2 算法问题求解基础,算法数据结构程序 算法设计分析的主要步骤 理解问题 了解计算设备的性能 在精确算法和近似算法之间做出选择 确定适当的数据结构 算法的设计技术 算法的描述(伪代码) 算法的正确性证明 算法的分析(简单性、一般性),1.3
4、重要问题类型,排序 查找 字符串处理 图问题(图的遍历算法、最短路线算法、图着色问题) 组合问题 几何问题(最接近点对问题、凸包问题) 数值问题(具有连续性的数学问题:解方程、定积分、求函数值),1.4 基本数据结构,数据结构:对相关的数据项进行组织的特殊方案。 算法与数据结构的关系 不了解施加于数据上的算法就无法决定如何构造数据,可以说算法是数据结构的灵魂; 反之算法的结构和选择又常常在很大程度上依赖于数据结构,数据结构则是算法的基础。 线性数据结构(数组和链表)、图(加权图、路径和环)、树(有根数、二叉树)、集合与字典,抽象数据类型 抽象数据类型是算法的一个数据模型连同定义在该模型上并作为
5、算法构件的一组运算。 抽象数据类型带给算法设计的好处有: 算法顶层设计与底层实现分离; 算法设计与数据结构设计隔开,允许数据结构自由选择; 数据模型和该模型上的运算统一在ADT中,便于空间和时间耗费的折衷; 用抽象数据类型表述的算法具有很好的可维护性; 算法自然呈现模块化; 为自顶向下逐步求精和模块化提供有效途径和工具; 算法结构清晰,层次分明,便于算法正确性的证明和复杂性的分析。,1.4 描述算法与算法设计,问题求解(Problem Solving),1.5 算法分析的基本原则,正确性 定义:在给定有效输入后,算法经过有限时间的计算并产生正确的答案,就称算法是正确的。 正确性证明的内容: 方
6、法的正确性证明算法思路的正确性。证明一系列与算法的工作对象有关的引理、定理以及公式。 程序的正确性证明证明所给出的一系列指令确实做了所要求的工作。 程序正确性证明的方法: 大型程序的正确性证明可以将它分解为小的相互独立的互不相交的模块,分别验证。 小模块程序可以使用以下方法验证:数学归纳法、软件形式方法等。,1.5 算法分析的基本原则,工作量时间复杂性分析 计量工作量的标准: 对于给定问题,该算法所执行的基本运算的次数。 基本运算的选择:根据问题选择适当的基本运算。,1.5 算法分析的基本原则,占用空间空间复杂性分析 两种占用: 存储程序和输入数据的空间 存储中间结果或操作单元所占用空间额外空
7、间 影响空间的主要因素: 存储程序的空间一般是常数(和输入规模无关) 输入数据空间为输入规模O(n) 空间复杂性考虑的是额外空间的大小 如果额外空间相对于输入规模是常数,称为原地工作的算法。,1.5 算法分析的基本原则,简单性 含义:算法简单,程序结构简单。 好处: 容易验证正确性 便于程序调试 简单的算法效率不一定高。要在保证一定效率的前提下力求得到简单的算法。,1.5 算法分析的基本原则,最优性 含义:指求解某类问题中效率最高的算法 两种最优性 最坏情况:设A是解某个问题的算法,如果在解这个问题的算法类中没有其它算法在最坏情况下的时间复杂性比A在最坏情况下的时间复杂性低,则称A是解这个问题
8、在最坏情况下的最优算法。 平均情况:设A是解某个问题的算法,如果在解这个问题的算法类中没有其它算法在平均情况下的时间复杂性比A在平均情况下的时间复杂性低,则称A是解这个问题在平均情况下的最优算法。,寻找最优算法的途径 (以最坏情况下的最优性为例) 设计算法A,求W(n)。相当于对问题给出最坏情况下的一个上界。 寻找函数F(n),使得对任何算法都存在一个规模为n的输入并且该算法在这个输入下至少要做F(n)次基本运算。 相当于对问题给出最坏情况下所需基本运算次数的一个下界。 如果W(n)=F(n),则A是最优的。 如果W(n)F(n),A不是最优的或者F(n)的下界过低。 改进A或设计新算法A使得
9、W(n)F(n)。 重复以上两步,最终得到W(n) = F(n)为止。,1.5 算法分析的基本原则,例:在n个不同的数中找最大的数。 基本运算:比较 算法:Find Max 输入:数组L,项数 n 1 1 输出:L中的最大项MAX MAXL(1); i2; while in do if MAXL(i) then MAXL(i); ii+1; end。 行3的比较进行n1次, 故W(n) = n1。 定理:在n个数的数组中找最大的数,并以比较作为基本运算的算法类中的任何算法最坏情况下至少要做n1次比较。 结论:Find Max算法是最优算法。,1.6 算法复杂性分析,算法复杂性是算法运行所需要的
10、计算机资源的量,需要时间资源的量称为时间复杂性,需要的空间资源的量称为空间复杂性。这个量应该只依赖于算法要解的问题的规模、算法的输入和算法本身的函数。如果分别用N、I和A表示算法要解问题的规模、算法的输入和算法本身,而且用C表示复杂性,那么,应该有C=F(N,I,A)。 一般把时间复杂性和空间复杂性分开,并分别用T和S来表示,则有: T=T(N,I)和S=S(N,I) 。(通常,让A隐含在复杂性函数名当中) 算法复杂性 = 算法所需要的计算机资源 算法的时间复杂性T(n);算法的空间复杂性S(n)。 其中n是问题的规模(输入大小)。,1.6 算法复杂性分析,以上分别是最坏情况下、最好情况下和平
11、均情况下的时间复杂性。 其中DN是规模为N的合法输入的集合;I*是DN中使T(N, I*)达到TMax(N)的合法输入;I-是DN中使T(N, I-)达到TMin(N)的合法输入;而P(I)是在算法的应用中出现输入I的概率。,1.6 算法复杂性分析,函数的渐进性态与渐进表达式:一般来说,当N单调增加且趋于时,T(N)也将单调增加趋于。 对于T(N),如果存在函数T(N),使得当N 使有(T(N)-T(N)/T(N) 0,那么我们就说T(N)是T(N)当N 时的渐进性态。 在数学上,T(N)是T(N)当N 时的渐进表达式。 例如:3N2+4NlogN+7与3N2。,1.6 算法复杂性分析,算法复
12、杂性在渐近意义下的阶: 渐近意义下的记号:O、o、 设f(N)和g(N)是定义在正数集上的正函数。 O的定义:如果存在正的常数C和自然数N0,使得当NN0时有f(N)Cg(N),则称函数f(N)当N充分大时上有界,且g(N)是它的一个上界,记为f(N)=O(g(N)。即f(N)的阶不高于g(N)的阶。 根据O的定义,容易证明它有如下运算规则: O(f)+O(g)=O(max(f,g); O(f)+O(g)=O(f+g); O(f)O(g)=O(fg); 如果g(N)=O(f(N),则O(f)+O(g)=O(f); O(Cf(N)=O(f(N),其中C是一个正的常数; f=O(f)。,1.6 算
13、法复杂性分析,的定义:如果存在正的常数C和自然数N0,使得当NN0时有f(N)Cg(N),则称函数f(N)当N充分大时下有界,且g(N)是它的一个下界,记为f(N)=(g(N)。即f(N)的阶不低于g(N)的阶。 的定义:定义f(N)=(g(N)当且仅当f(N)=O(g(N)且f(N)=(g(N)。此时称f(N)与g(N)同阶。 o的定义:对于任意给定的0,都存在正整数N0,使得当NN0时有f(N)/Cg(N),则称函数f(N)当N充分大时的阶比g(N)低,记为f(N)=o(g(N)。 例如,4NlogN+7=o(3N2+4NlogN+7)。 的定义:(g(n)=f(n)|对于任何正常数c0,
14、存在正数和n0 0使得对所有nn0有:0cg(n)f(n) 等价于f(n)/g(n),as n。 f(n)(g(n) g(n)o(f(n),1.6 算法复杂性分析,渐近分析记号的若干性质 (1)传递性: f(n)=(g(n),g(n)=(h(n) f(n)=(h(n); f(n)=(g(n),g(n)=(h(n) f(n)=(h(n); f(n)=(g(n),g(n)=(h(n) f(n)=(h(n); f(n)=(g(n),g(n)=(h(n) f(n)=(h(n); f(n)=(g(n),g(n)=(h(n) f(n)=(h(n); (2)反身性: f(n)=(f(n);f(n)=(f(n
15、);f(n)=(f(n). (3)对称性: f(n)=(g(n) g(n)=(f(n) . (4)互对称性: f(n)=(g(n) g(n)=(f(n) ;f(n)=(g(n) g(n)=(f(n) ; (5)算术运算: (f(n)+(g(n) = (maxf(n),g(n) ; (f(n)+(g(n) = (f(n)+g(n) ;(f(n)*(g(n) = (f(n)*g(n) ; (cf(n) = (f(n) ;g(n) = (f(n) (f(n)+(g(n) = (f(n) 。,1.6 算法复杂性分析,规则(f(n)+(g(n) = (maxf(n),g(n) 的证明: 对于任意f1(n
16、) (f(n) ,存在正常数c1和自然数n1,使得对所有n n1,有f1(n) c1f(n) 。 类似地,对于任意g1(n) (g(n),存在正常数c2和自然数n2,使得对所有n n2,有g1(n) c2g(n) 。 令c3=maxc1, c2,n3 =maxn1, n2,h(n)= maxf(n),g(n) 。 则对所有的n n3,有 f1(n) +g1(n) c1f(n) + c2g(n) c3f(n) + c3g(n)= c3(f(n) + g(n) c32 maxf(n),g(n) 2c3h(n) (maxf(n),g(n).,1.6 算法复杂性分析,取整函数 x :不大于x的最大整数
17、; x :不小于x的最小整数。 取整函数的若干性质 x-1 0,有: n/a /b = n/ab ; n/a /b = n/ab ; a/b (a+(b-1)/b; a/b (a-(b-1)/b; 其中,f(x)= x , g(x)= x 为单调递增函数。,1.6 算法复杂性分析,算法分析中常见的复杂性函数,1.6 算法复杂性分析,小规模数据复杂性增长图,1.6 算法复杂性分析,中等规模数据复杂性增长图,考虑元素唯一性问题,验证给定数组中的元素是否全部唯一。 算法:UniqueElements(A0,n-1) /输入:数组A0, n-1 /输出:如果A中的元素全部唯一,返回true,否则返回f
18、alse For i0 to n-2 dofor j i+1 to n-1 doif Ai=Aj return falsereturn true,小结,程序与算法 渐进表达式 程序复杂性 习题: 1.4、1.7、1.8、1.10,P,NP问题,定义:如果一个算法的最差时间效率属于O(P(n),则说该算法能够在多项式时间内对问题求解,其中P(n)是问题输入规模的一个多项式函数。 能够在多项式时间内求解的问题称为易解的。 不能够在多项式时间内求解的问题称为难解的。 P类问题是一类能够用确定的算法在多项式时间内求解的判定问题,也称为多项式类型。 NP类问题:是一类可以用不确定多项式时间算法求解的判定问题,也称为不确定多项式类型。 ?P=NP?,