算法与计算复杂性课程(8)算法分析
算法设计与分析 教学大纲
《算法设计与分析》教学大纲适用于四年制本科计算机应用技术、信息与计算科学专业(参考学时数:64 学时)一、课程代码7100450,7100451二、课程的性质、任务算法设计与分析是计算机科学的核心问题之一,这门课是计算机专业以及相关专业的一门重要的课程。
本课程的教学目的是:在学生学习掌握了编程的基本技术,掌握了数据结构的基本知识、理论的基础上,比较系统的学习算法理论中的基础部分内容。
在这一课程教学中,培养学生掌握算法设计的方法论,掌握常用的算法设计的方法;掌握算法分析的基本工具、方法、技巧,在解决实际问题时,对于较复杂的问题能抽象出问题的数学模型,设计出有效的算法。
在此基础上学习本课程的中级篇:结构上的算法设计(分类、图的高级部分、流),学生通过这部分的学习,了解算法优化的实现途径,很好的解决数据结构中未能解决的问题、最后是本课程的高级篇:NP完全理论、现代优化计算方法简介。
学生通过这部分的学习初步了解计算复杂性理论的基本内容、现代算法的几个主要发展分支,为今后实际应用或者搞理论研究打下一些必备的理论基础。
三、课程基本要求学生必备的先行课是:高等数学、离散数学、程序设计、数据结构。
本课程不能求快,应循序渐进,培养学生浓厚的学习热情和求知欲。
教学中注重和前期课程数据结构的衔接,使学生明白这门课不同于数据结构的是:数据结构是讨论三种基本数据结构上的基本操作的实现,它是完成“如何做”,算法设计与分析这门课强调的是:怎么巧做,做的更好。
在本课程的后期教学中,特别提倡学生广泛阅读参考书、独立思考、结合实际问题展开讨论的教学方式,并以此达到教师精讲、学生宽学的目的。
课程的基本要求是:1.掌握7种常用的算法设计方法,并能综合、灵活的使用这些基本方法,同时用所学到的知识解决一些实际问题;2.掌握算法分析的基本工具、基本技巧、基本方法;3.掌握数据结构中未能详细、深入了解的部分内容(内存分类,图的高级部分、流上的算法);4.了解计算复杂性理论中的基本内容,包括:机器模型,NP完全、NP难题,近似计算;5.了解现代的计算算法和算法理论的发展趋势走向。
算法分析和计算复杂性分析
算法分析与评估1.概述在查找引擎优化范畴里边有一个疑问常常让人感受捉摸不透,到底是什么样的排序要素结尾决定了网页的排名。
而每个查找引擎公司都将其的查找引擎算法维护的极端严密,只有很少很少的一些的公司能有时机看到这些算法的全貌。
并且就算是有时机看到这些算法的真实容貌,要想领悟到话,还得具有深沉的数学功底。
这使得对查找引擎优化整个概念的晓得变得很艰难。
同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。
一个算法得出一个解,那么这个解是最优解还是可行解?如果是可行解,与最优解的偏差有多大?对于算法的效果,存在两种评价方法——证明方法和仿真分析方法。
证明方法是指利用数学方法对于算法进行评估,证明它的解的类型。
仿真分析方法是指产生或选取大量的、具有代表性的问题实例,利用该算法对这些问题实例进行求解,并对算法产生的结果进行统计分析。
例如对于TSP问题贪心算法的模拟与分析,关于贪心算法的正确性,直观上只需检查算法的输出结果中,每个城市出现且只出现一次,该结果即是TSP问题的可行解,说明算法正确的求解了这些问题。
关于它的效果,如果实例的最优解一直(问题规模小或问题已被成功求解),利用统计方法对若干问题实例的算法结果与最优解进行对比分析,即可对其进行效果评价。
而对于较大规模的问题实例,其最优解往往是未知的,因此,算法的效果评价只能借助于与前人算法的结果的比较。
2.复杂度评价一个算法时另一个问题是,算法能够执行的了吗?有限的时间和空间上这个算法能够执行吗?这就需要对算法的复杂性进行分析。
算法的时间复杂度和空间复杂度合称为算法的复杂度。
2.1.时间复杂度(1)时间频度一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。
但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。
并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。
重庆大学《计算复杂性及算法分析》课程内容纲要(总)
计算复杂性及算法分析课程内容纲要主要参考书:1.主要参考书1 J.E.Hopcroft 等 <自动机理论,语言和计算导论>2.主要参考书2 D.E.Knuth <The Art Of Computer Programming> V13.主要参考书3 D.E.Knuth <The Art Of Computer Programming> V34.主要参考书4 G&K&P <CONCRETE MATHEMATICS>课程内容的安排:由于这门课程的内容来自两个不同的领域:计算复杂性和算法分析.所以有必要划分课时的安排.1次课4学时用于计算复杂性(第一讲)6次课20学时用于算法分析(第二讲..第七讲)2学时用于复习第一讲 (4学时)主要参考书1-第8章-8.2,8.3,8.4;第10章-10.1主要内容是介绍图灵机.以及P与NP的一些相关概念第二讲 (4学时)主要参考书1-第10章-10.1,10.2主要内容是介绍NP完全问题,Cook定理的证明第三讲 (4学时)主要参考书2-第1章-1.2.1,1.2.3,1.2.5,1.2.6,1.2.8,1.2.9算法分析所会用到许多数学知识,高老师在1.2中给出了一些介绍.为了简洁我们引用这里的内容.更好的选择是主要参考书4第四讲 (4学时)主要参考书2-第1章-1.2.10一个算法的分析,和数学有关的分析第五讲(4学时)主要参考书2-第1章-1.3.3对排列的应用,和程序有关的分析第六讲(4学时)主要参考书2-第1章-2.3.4.1,2.3.4.5树的基本数学性质:克希霍夫定律一种一般的程序执行时间估算的方法,以及以后要研究的内容中经常要出现的内容:通路长度第七讲 (4学时)主要参考书3-第5章-5.3,5.3.1最优排序(一)复习 (2学时)第一讲(4学时)主要参考书1 第8章-8.2,8.3,8.4;10.1主要内容是介绍图灵机以及P和NP的一些概念.为介绍Cook定理做准备计算复杂性和算法分析是两个内容.关于计算复杂性我们以介绍Cook定理为界;关于算法分析我们以介绍G.D.Knuth的一些实际分析例子为界.这一讲介绍图灵计算模型.以及一些与NP完全问题有关的内容.目的是引出Cook 的第一个NPC问题的证明.由此可以对图灵模型和NPC问题有一个入门的认识.0.难解问题比判定问题更为普遍,所以我们把计算复杂性的主要介绍定在难解问题上1.有穷状态自动机,(DFA 主要参考书1-31页,2.2.1,33页,图2-4, NFA 主要参考书1-37页,2.3.1,图2-9).主要涉及确定与不确定的概念2.从编译原理课程上下文无关文法的分析引出下推自动机(PDA 主要参考书1-6.1.2,6.1.4).主要涉及形式化定义,分析(也称计算)过程的瞬时描述和ID3.确定性图灵机.一种非常简单的计算模型,图灵机.相比之下,C程序的状态太复杂,不能给出可以理解的形式证明.参见主要参考书1第8章-8.2,8.2.24.图灵机的瞬时描述.ID的内容(主要参考书1第8章-8.2.3)介绍一个图灵机的识别例子,仔细的研读这个例子,形成对图灵机的感性认识.还有一个自己认为成立的图灵机的计算例子.2+3=5.具体可表示为B110111B转变成B11111B.从而完成1进制的2+3=5.在主要参考书1第八章-8.2.4给出了一个做减法的例子.其行为特征类似.构造图灵机并不是一件容易的事情,主要参考书1-8.2.4给出了一种较为容易理解的状态转移图.并不难理解,可以从状态转移表得到,类似NFA,不过添加了一些图灵机必要的内容.5.发明了不确定性图灵机,它不是一种真实的计算机,仅仅是一个计算模型,而且现阶段也不可能实现,但是并不妨碍我们用它来思考.充分多的转移分支保证了恰当方式描述的问题得以充分的遍历.有些在DTM M上没有得到多项式解的问题可以在这样的计算模型上得到多项式时间解.可以这样解决的问题被称为NP问题.也就是非确定性多项式时间解.说到底,DTM M和难题们ZHIJIAN的关系就想是用定理来解决问题还是用搜索来解决问题.6.停机概念:没有移动就是停机了.接受状态一定可以等价于停机状态,但是不接受不一定停机.这个与语言有关,也与判定问题有关,不属于我们约定的内容.停机与接受没有直接的关系,但是停机对复杂度有关.7.非确定性图灵机非确定性图灵机拥有想象中的并行处理能力. 如果对树进行搜索,NTM M只需要最长树支的时间,但是树有指数阶的节点.参见主要参考书1第八章-8.4.48.实际工作中更容易碰到的是难解问题.例如求解H回路,调度问题.主要参考书1第10章-8.2.读一下这一段话应该很有帮助.9.由于对这样的问题没有充分的解决方法,所以写不出来确定的图灵模型.一个搜索过程与非确定性图灵模型极为相似.如果我们假设我们有搜索分支那么多的处理器,于是我们就有了一个并行的问题解决能力.本来在串行搜索上需要指数时间的问题求解过程在这样想象的并行处理能力上就只要多项式时间就够了.因此串行多项式时间和并行多项式时间是不同的.10.现在有很多问题似乎都有前面例子的那种求解特征.没有充分的解决方法,只能通过搜索来求解.如可以用充分的方法寻求欧拉回路,但只能通过搜索寻求汉弥尔顿回路.这样的问题似乎还有串行多项式时间可以求解的可能,完全没有这种求解可能的有Hanoi塔问题.它就是一个串行指数复杂性的问题.11.问题的P类和NP类(即确定型TM和不确定型TM分别在多项式时间里能解答的问题).12.可在多项式时间内解答的问题:如果每当给定图灵机M长度为n的输入w 时,M无论接受与否,都在至多移动T(n)步之后停机,则说M具有时间T(n),我们主要对T(n)是n的多项式的情形感兴趣.如果存在某个多项式T(n)和某个时间复杂性T(n)的确定型TM M,使得L=L(M),则说语言L属于P类.关于P类问题的例(290页10.1.2),这个例子提出了几个与之相关的问题.如果存在某个多项式T(n)和某个时间复杂性T(n)的非确定型NTM M,使得L=L(M),则说语言L属于NP类.关于NP类问题的例(293页10.1.4).同样是多项式时间,但是由于采用了不同的计算模型导致有极大的差别.13.从P和NP来看,由于DTM M 就是没有转移选择的NTM M.于是属于P的也应该属于NP,所以NP比P大,于是就出现了NP-P.NP和P是否一样大是一个很难的问题.14.进一步需要了解的是NP-P究竟是什么?(1)可以很自然的感觉到NP-P中间的问题都一定是属于NP,这就是NP完全问题2个先决条件的第1个.这不是一个好回答的问题,下面还会做进一步的解释.(2)假定有一个问题L满足(1),并且如果所有的NP完全问题都能够在多项式时间内完成对问题L的规约(或者简化成问题的转换),那么问题L就是一个NP完全的问题.15.NP完全的问题有一个特征,只要一个NP完全的问题得到DTM M的多项式时间解,那么所有的NP完全问题都能够有DTM M下的多项式解.这样的研究使得事半功倍.但是在NP?=P解决之前,这个研究是没有实际的效果的.目前解决NP完全问题最多的手段是近似算法,拥有多项式时间复杂性的DTM M算法.虽然不能作到100%的解决NP完全问题,但是在一定的范围内,其解的精度足以应付应用的需要了.16.确定一个问题是否是NP的不是一件轻松的事情.欧拉回路就很好判断,但是H 回路就很难判断.这里我们还没有计较计算复杂性.一般来讲有了充分性的描述就容易得到确定性的解决方案,也就是可以采用DTM M;但是只有必要条件或者连必要条件也没有,那只能利用NTM M作为计算模型了.在我们确认NP完全问题中一定要确认该问题是属于NP的.这在很多介绍中用的是判定实例.17.对基于比较排序算法的下限问题是通过比较树来完成的.对于这样的问题用了这样一个问题的求解结构使得我们有可能形成对比较树的分支长度有一个度量的机会.于是我们得到了该解决该问题算法的复杂性下限.尽管现在还没有介绍该内容,但是可以肯定这样的工作是已经完成了的.在这里我们并不是要介绍这个内容,但是给我们的一个启发是NTM M计算模型相当于是比较这样的二元运算,基于这样的二元运算得到了比较树.于是我们解决了这个问题.是否也可以为NPC问题中的一个(如SAT问题)确定一种恰当的运算,也基于这样的运算构建一个相关的问题结构,如果能够找到该结构上的算法下限,就可以确定P?=NP了.不过这只是一种想法,没有真正的思考过.第二讲(4学时)主要参考书1第10章-10.1,10.2,S.A.Cook的文章<The Complexity of Theorem-Proving Procedures>以及<计算复杂性>7.5P和NP,有必要加深对NP问题的理解,NP完全问题,Cook定理的证明课程纲要上的主要参考书1相对粗糙,主要是介绍了这个证明过程中间的主要线索,尽管如此还是显得含糊不清.所以这里结合了另外一本教材中的介绍,以及Cook的原文章.但是需要相当高的水平才能完全看懂,所以就是这样也还是一个纲要性的介绍.1.设语言L属于NP,并且NP中的每个语言都可以在多项式时间里规约到L(用多项式复杂性的算法把属于NP的一个问题的描述转换成对另一个属于NP问题的描述),则L是NP完全的.如果从问题的角度了讲,语言L所描述的问题就是NP完全的问题. 附注:需要解释如何确认一个问题是属于NP的.见<计算复杂性106页例7-6>2.一个简单的推论:把所有属于NP的语言在多项式时间里规约到语言L是一件麻烦的事情.既然在确认第一个NP完全问题的时候已经作过这样的规约,那么以后只要把已经存在的NP完全问题在多项式时间里规约到指定的问题就足以保证该问题是NP完全的了.3.Cook做的事情是依据NP完全问题的定义确定第一个NP完全问题.由此可以得到两个好处.第一是新的NP完全问题的确定就没有那么困难了;第二是只要有一个NP完全问题得到确定性图灵机上的多项式解,则所有的NP完全问题都得到这样的解.这一点可以从第一个好处中得到说明.4.介绍可满足性问题(也叫SAT问题):给定布尔表达式,这个表达式是可满足的吗?举个例子以说明此问题.图灵机用识别语言的方式来处理问题,所以必须要为SAT 问题确定一个编码方案,看看这样的一个表达:x1&!(x10|x11),这样的表达方式可以用确定性的PDA来识别.于是可以肯定用这样的方式描述的表达式可以在DTM M上用多项式时间解析.Cook定理:命题逻辑的可满足性是NP完全的.证明概要:假定非确定性图灵机M在多项式时间内接受一个串的集合S,每个串s都是属于NP问题的一个描述.给该图灵机一个输入w,接受的过程会给出一个NTM M的计算路.依据该计算路可以构造出合取形式的谓词A(w),使得A(w)可满足当且仅当M接受w.这里的图灵机是单带的右端无限长,有左端头方格.用1,2,...n 从左向右来命名这些方格.w属于S,其长度为n,M在多项式时间内接受w,假设有x1,x2,...,xm个带符号,q1,q2,...,qs个状态,其中q1是开始状态(这里要注意,和一般以q0为开始状态有区别,不过作为一般的理解,这个区别不算什么),qs 是停机状态.注意,该计算路最多P(n)步,所以不会涉及该范围之外的方格.另外,由于问题的不同使得接受的计算路有长有短,就像多项式的阶有高有低一样,给思考带来麻烦.由于属于NP的问题一定会被NTM M接受,所以为了使讨论简单,可不失一般性的假设:不管M是否已经进入接受格局,都让M继续"计算"下去,但对于已进入接受格局时,其下面的"计算"将不移动扫描头也不改变已进入的接受状态,直到第p(n)个格局为止.只要不会生成指数复杂性的问题一律都简化.这一点也可以并且也应该用于该证明的其他地方.由此可以认为第p(n)个格局一定是停机格局.这个假设会用在下面第7个命题变元上.这里需要定义几个谓词:(1) C<i,j,t> 取值1当且仅当M在时刻t(即第t步)时第i个方格里有符号xi(2) S<k,t> 取值1当且仅当M在时刻t处于状态qk(3) H<i,t> 取值1当且仅当M在时刻t时读写头扫描着第i个方格附注:上一讲把状态嵌入到要接受语言的中间.像...XiqXi+1....尽管在Xi,Xi+1之间加入了状态q,但是仍旧保持了下标之间的连续性.可以理解为当前关注的带方格中有状态.这个想法在主要参考书1-8.3.1中有明确的描述.表明状态的概念是用元组来承载的,于是当前需要的信息都存在这里.所以才能保证扫描头能够同时关注当前状态和带符号.另外计算路是用步来计量的,从一个格局转换到下一个格局就算是一步,一个时刻前进一步,那么用时刻t到时刻t+1也就相当于从格局t到格局t+1.这样的描述方便理解.另外为了书写方便再定义一个谓词U(x1, x2, ...,xr).当x1, x2, ... xr 中恰有1个为1它取值为1U(x1, x2, ...,xr) = (x1 | x2 | ... | Xr)&(& i!=j (!xi | !xj))附注:(1)这样的谓词用来确定扫描头的工作是正常的,是符合对图灵机的定义的.这样的子表达式是究竟真还是假需要用当前的状态来认定.如r=2为例可以很清晰的描述出应该得到的效果.(2)这些谓词的定义来自于Cook的文章.但是Cook的文章并没有提到如何具体实现这4个谓词.如果是定长的谓词应该没有问题,前面就有对SAT公式的描述,但是没有如何实现用p(n)作为界限的公式描述方式.一点个人的想法是从逻辑上能够形成对这个问题的理解,但是不容易给出具体的实现.不过对于任何一个实例来讲接受步长p(n)总是确定的整数,所以还是能够接受能理解不容易实现的说法.就好象能够理解NTM,但是无法实现NTM那样.从Cook的文章中有证明的过程,但是实在是难以理解.这里介绍的内容就作为一个入门,进一步的深入理解还需要完整的阅读Cook的原文才是.下面可以用7个命题变元A, B, C, D, E, F, G 来构成A(w).它判断了Q0,Q1, ... Qp(n)是一条接受w的计算路.在Cook的原文中这里是8个谓词.在众多对该原文的解释中对这里使用的谓词的个数和意义有不同的版本.原文中基本上是基于谓词实施证明的.判断Q0, Q1,...Qp(n)是一条接受w的计算路等同于判断如下7个事实:1.在每个格局中,扫描头只扫描1个带方格.检查它的目的是保证这样的证明与介绍的NTM M一致.2.每个格局中的每个带方格里只有1个带符号.检查它的目的是保证这样的证明与介绍的NTM M一致.3.每个格局中只有1个状态.检查它的目的是保证这样的证明与介绍的NTM M 一致.4.在该计算路中,从1个格局到下一个格局,最多只能修改上一格局中被扫描方格中的符号.检查它的目的是保证这样的证明与介绍的NTM M一致.5.正确的转移.因为NTM M就是以转移作为"计算"的.所以转移是这个仿制过程的关键.6.Q0是M在输入w后还没有开始"计算"前的初始格局7.该计算路的最后一个格局是停机状态现在来构成与判断1-7相对应的命题变元A-G(1)令At=U(H<1,t>, H<2,t>, ...H<p(n),t>).At表示在时刻t, M的扫描头恰好扫描着某一带方格.置A = A0 & A1 & ... Ap(n)表述了判断(1).U谓词需要O(p^2(n)),则A需要O(p^3(n)).(2)令Bit=U(C<i,1,t>, C<i,2,t>, ...C<i,m,t>).Bit表示在时刻t, 第i个带方格内只有1个带符号. B = & 0<=i,t<=p(n) Bit 表述了判断(2).这里由于i和t分别是从0到p(n),所以二维的长度是O(p^2(n)).(3)令C=& 0<=t<=p(n) U(S<1,t>, S<2,t>, ... S<s,t>). C表述了判断(3).因为DTM M的状态是常数,所以C的长度为O(p(n)).(4)令D=& i,j,t [(C<i,j,t>=C<i,j,t+1>) | H<i,t>].由于是两部分的析取,分别表示在时刻t和t+1,方格i中的带符号xj没有改变;以及当前扫描头扫描第i 个带方格.根据这样2个子断言的析取,不容易形成对判断(4)的理解.具体举个例来说如果i=5,j=6,t=7,如果C<i,j,t>=C<i,j,t+1>,表示第i方格的符号没有改变,因为析取,所以结果是真;如果C<i,j,t>!=C<i,j,t+1>,表示第i方格的符号改变,尽管这个子表达式为假,也因为析取,所以结果还是真.又因为NTM M中只有当前的i,j,t的值,所以依据这样的表达式的组织,其余的只能为假,因为i,j,t的值不对.这样就保证了事实4的成立.附注:在Cook的原文中没有这样的断言,由于该构造并不容易理解,所以当无法理解Cook的原意时,就会有许多的发明.这里就是一种发明.(5)令Ei,j,k,t=!(C<i,j,t>&H<i,t>&S<k,t>)||l[C<i,jl,t+1>&H<il,t+1>&S<kl,t+1 >].关于正确的移动要表明只有在时刻t状态k位置i关注着带符号xj,那么才有后面的不确定转移产生的多项转移中的一项为1.如果时刻t不是前面那么严格的判定,那么后面也不会作这样的转移.附注:这里没有做真正的转移,只是形成了正确移动的为真(1)判断.这里不像NTM M会作转移,仅仅是判断这一步的转移是否正确.同样可以像对事实4的解释那样形成具体的实例.(6)令F=S<1,0>&H<1,0>&(& 1<=i<=n C<i,ji,0>)&(& n<i<=p(n) C<i,1,0>).它表示时刻0时的M情景.时刻0表示刚好完成M的初始工作,一次都还没有计算.注意时刻和状态是两个不同的概念,尽管它们之间有关系.(7)令G=S<s,p(n)>.在前面已经做了的假设之下,是能够正确的判定停机.令A(w)=A&B&C&D&E&F&G附注:该表达式来自于<计算复杂性>,Cook文章中是8个子式的合取.可以感觉到意会的含义.给定一个属于NP问题的语言w,就可以在多项式时间内依据NTM M的"计算"规则下构造出A(w),当w在NTM M下形成一个可接受的计算路Q0,Q1,...Qp(n).则这个计算路就可以使在A(w)中的各个命题变元中相应式子的指派为真从而使得A(w)满足,反之若有一个使得A(w)满足的指派,则可以由此找到可接受的计算路.上述结论就是Cook定理的基本内容,细节请参看Cook本人的文章<The Complexity of Theorem-Proving Procedures>最后提一个问题,为什么总要强调多项式时间内的转换呢?第三讲(4学时)主要参考书2-第1章-1.2.1,1.2.3,1.2.6,1.2.8,1.2.9算法分析所会用到许多数学知识,高老师在1.2中给出了一些介绍.为了简洁我们引用这里的内容.更好的选择是主要参考书4这里涉及到许多内容,不过总归起来只有一点,那就是了解各种变换的手法.熟能生巧,多能生熟.另外我们把这里所讨论的内容都局限在正整数的范围内,这样可以减少边界对学习的影响.高老师探讨了正整数之外的边界,所以如果你有这样的需要,就请做进一步的学习.一.递归方程(1学时)(主要参考书4-第一章-1.1,网络上有该书中文版的扫描版下载)1.递归方程是算法分析过程中的重要形式.通过这种形式可以把算法逐步得到的行为一方程的形式表达出来,从而可以得到对算法计算强度的一个度量.这样的度量会给出精确的结果.算法分析的很重要的一个部分就是求解递归方程的解.主要涉及到如下的3个方面.(1)看看小的情况,这使得我们深入了解问题(2)求出和证明关心的量的一个数学表达式,用归纳法证明.(3)求出和证明该数学表达式的一个闭形式2.该章的内容容易看,建议继续看下去.二.求和(1学时)主要参考书2-1.2.31.求和的作用和表示(1)对于和数之积的分配律(2)改变变量:第1种:改变下标变量的名称.第2种:在范围不便的前提下改变排列.(3)交换求和的顺序(4)处理作用域2.四个简单的代数运算3.基本技术的运用附注:高老师说的好清楚,我实在没有什么需要写的了.照着说就行三.二项式系数(1学时)1.二项式系数的定义以及形式2.对二项式系数进行运算的基本技术(A)用阶乘来表示: 公式(5)直接来自于定义(B)对称条件: 公式(6)(C)移进和移出括弧: 公式(7)(D)加法公式: 公式(9)(E)求和公式: 公式(10),公式(11)(F)二项式定理:主要是了解二项式的形式(G)把上标取负: 公式(17)(H)简化乘积公式(20)(I)乘积的和: 公式(21)3.例问题1:附注:斯特林公式会在第四讲中用到的时候再介绍四.生成函数(1学时) 参见主要参考书2-第1章1.2.91.生成函数的定义有序列a0, a1, a2,... 则可以形成如下的无穷和G(z) = a0 + a1z^1 + a2z^2 + ...2.生成函数的定义以及意义在分析的过程中会经常遇到递归方程.由此产生了一系列的数值,这些数值在某种规则的作用下形成了一个序列.尽管是针对同一个递归方程产生的数值,但是因为不同的层次导致相互之间好象没有关系.这对我们利用递归方程是很不利的.生成函数很好的解决了这一个问题.(1)用生成函数来表示一个序列的完整信息.这样拥有许多值的一个序列就变成了一个单一的变量.另外在需要的时候还可以回收获得的序列.我们可以这样来理解.算法分析->递归方程->递归方程的解序列(可以用递归方程以及初始条件来描述)->形成对应的生成函数->施加需要的分析导致的运算->形成新的生成函数->回收获得的新序列(在该新序列中包含我们需要的特征).(2)不必关心收敛的问题.就像是2个多项式的运算并不需要知道多项式的值一样.2.使用生成函数的主要技术(1)加法(2)移位:Fn表示该序列是a0 a1 a2 ... an,Fn-1表示该序列是0 a0 a1 ... an-1例:斐波那契序列还可参见主要参考书2-第1章-1.2.8(3)乘法(4)微分与积分例:求解序列1,2,3,...的前n项和(5)回收:一般采用查表的方法.当然也可以自己推导.(这是我说的)第四讲(4学时)主要参考书2-第1章-1.2.10一个算法的分析,看看我们要做的事情是什么1.面临的问题.算法M(求极大值):并且对该算法做解释n是端点, j是记录最大值下标的变量, k是循环变量, m保存到目前为止的最大值.2.把克希霍夫定律用于算法M的流程图由此得到各个步骤相应的运算次数.其中有一个量是不清楚的.这就是分析的对象3.需要分析的目标,也就是我们要分析出被分析对象的什么特性?一般而言有以下几种(1)极小值(2)极大值(3)平均值附注:在概率和统计学中,一个随机变量的期望值(或期待值)是变量的输出值乘以其机率的总和,换句话说,期望值是该变量输出值的平均数。
算法分析的基本概念和方法
i 1
i 1
i 1
❖ 在最好情况下,ti=1, for 1 i <n;
Tmin(n) c1n c2 (n 1) c3(n 1) c4 (n 1) c7 (n 1)
(c1 c2 c3 c4 c7 )n (c2 c3 c4 c7 ) O(n)
❖ 在最坏情况下,ti i+1, for 1 i <n;
1.1.算法及其特性
❖ 一、 算法(algorithm)
算法就是一组有穷的规则,它们规定了解决某 一特定类型问题的一系列运算。
❖ 二、算法的五个特性
① 确定性 ② 能行性 ③ 有穷性 ④ 输入 ⑤ 输出
1.1.算法及其特性
三、衡量算法性能的标准
衡量算法性能一般有下面几个标准: 确定性 易读性 健壮性 算法的时间和空间性能:高效率和低存储空间
n i1
Байду номын сангаас
2
1.4. 复杂度的有关概念
二、举例
[例2] 直接插入排序算法1.5。
以元素的比较作为基本操作。 最好情况下的时间复杂度: (n) 最坏情况下的时间复杂度: (n2) 在等概率前提下,平均情况下的时间复杂度:(n2 )
算法分析的基本法则
❖ 非递归算法:
(1)for / while 循环 循环体内计算时间*循环次数; (2)嵌套循环 循环体内计算时间*所有循环次数; (3)顺序语句 各语句计算时间相加; (4)if-else语句 if语句计算时间和else语句计算时间的较大者。
1.3. 分析复杂度的基本步骤
二、表示出在算法运行期间基本运算执行的总频数
同一个问题对不同的输入,基本运算的次数亦可能不同。 因此,我们引进问题大小(即规模,size)的概念。例如, 在一个姓名表中寻找给定的Z的问题,问题的大小可用表中 姓名的数目表示。对于两个实数矩阵相乘的问题,其大小可 用矩阵的阶来表示。而对于遍历一棵二叉树的问题,其大小 是用树中结点数来表示等等。这样,一个算法的基本运算的 次数就可用问题的大小n的函数f(n)来表示。
可计算性与计算复杂性
可计算性与计算复杂性1.可计算性:可计算性研究的是什么样的问题可以通过其中一种计算模型解决。
早期的计算模型是图灵机(Turing machine),后来发展出其他等效的计算模型,例如递归函数、Lambda演算等。
根据这些计算模型,可以定义一类问题为可计算问题,也就是可以通过计算模型求解的问题。
1.1停机问题:停机问题是可计算性的典型例子,它是指根据给定的程序和输入,判断这个程序是否会在有限的时间内停止运行。
根据图灵在20世纪30年代证明的停机问题的不可判定性,他证明了不存在一个通用的算法能够判断任意程序是否停机,这个结论被称为图灵不可判定性定理。
1.2基本计算问题:除了停机问题,可计算性还研究了一些其他的基本计算问题。
例如,可计算性研究了自动机是否可以接受一些字符串,或者函数是否可以被一个特定的计算模型计算等。
1.3计算模型的等效性:在可计算性理论中,研究了不同计算模型之间的等效性。
图灵机、递归函数和Lambda演算等计算模型之间可以相互转化,这意味着它们的计算能力是等价的。
这个等价性的概念对理解可计算性是至关重要的。
2.计算复杂性:计算复杂性研究的是什么样的问题可以在多项式时间内解决,以及在不同条件下求解问题所需要的计算资源(例如时间、空间等)。
计算复杂性理论的核心是研究问题的复杂度类别和难度。
2.1多项式时间可解问题:计算复杂性理论将问题分为多项式时间可解问题和非多项式时间可解问题。
多项式时间可解问题是指那些可以在多项式时间内求解的问题。
这些问题的解决方法被认为是高效的,因为随着输入规模的增加,所需计算资源的增长是可接受的。
2.2难解问题:非多项式时间可解问题是那些不可以在多项式时间内求解的问题。
例如,图的旅行商问题(TSP)和布尔可满足性问题(SAT)等问题被认为是难解问题。
难解问题的求解需要指数级的时间或空间复杂度,因此在实际中很难找到有效的算法。
2.3复杂度类别:计算复杂性理论还研究了不同问题的复杂度类别。
算法设计与分析ppt课件
ACM国际大学生程序设计竞赛
ACM国际大学生程序设计竞赛(英文 全称:ACM International Collegiate Programming Contest(ACM-ICPC或 ICPC)是由美国计算机协会(ACM)主办 的,一项旨在展示大学生创新能力、团队 精神和在压力下编写程序、分析和解决问 题能力的年度竞赛。经过30多年的发展, ACM国际大学生程序设计竞赛已经发展成 为最具影响力的大学生计算机竞赛。赛事 目前由IBM公司赞助。
第3章 动态规划 3.1 矩阵连乘问题 3.2 动态规划算法的基本要素 3.3 最长公共子序列 3.4 最大子段和 3.5 凸多边形最优三角剖分 3.6 多边形游戏 3.7 图像压缩 3.8 电路布线 3.9 流水作业调度 3.10 0-1背包问题 3.11 最优二叉搜索树 3.12 动态规划加速原理
7
1.1 算法与程序
算法:是满足下述性质的指令序列。
输 入:有零个或多个外部量作为算法的输入。 输 出:算法产生至少一个量作为输出。 确定性:组成算法的每条指令清晰、无歧义。 有限性:算法中每条指令的执行次数有限,执行
每条指令的时间也有限。
程序:是算法用某种程序设计语言的具体实现。
4
教材与参考书
教 材:
◦ 算法设计与分析(第三版) 王晓东,2007年 5月,电子工业出版社。
参考书:
◦ 徐士良编,C常用算法程序集,华大学出版 社,1998年
◦ 霍红卫编,算法设计与分析 西安电子科技 大学出版社,2005年
◦ 卢开澄编,计算机算法导引,清华大学出 版社,2003年
5
部分目录
算法分析是计算机领域的“古老”而“前沿” 的课题。
10
算法分析与复杂性理论
算法分析与复杂性理论算法是计算机科学中的重要概念,它是解决问题的一系列步骤或指令。
但是,并不是所有的算法都一样效率高,因此我们需要进行算法分析来评估算法的性能。
同时,复杂性理论则是用来研究算法在不同规模下的复杂性和可解性。
本文将深入探讨算法分析与复杂性理论的相关概念和方法。
一、算法分析算法分析是评估算法性能的过程,我们通常关注算法的时间复杂度和空间复杂度。
1. 时间复杂度时间复杂度表示算法解决问题所需的时间资源。
在进行时间复杂度分析时,一般会考虑最坏情况下的所需时间。
常见的时间复杂度有常数时间O(1),线性时间O(n),对数时间O(log n),平方时间O(n^2)等。
2. 空间复杂度空间复杂度表示算法解决问题所需的空间资源。
与时间复杂度类似,我们通常考虑最坏情况下的所需空间。
常见的空间复杂度有常数空间O(1),线性空间O(n),对数空间O(log n),平方空间O(n^2)等。
二、复杂性理论复杂性理论是研究算法在不同规模下的复杂性和可解性的学科领域。
1. NP问题NP(Nondeterministic Polynomial)问题是指可以在多项式时间内验证解答是否正确的问题。
这意味着如果我们能够在多项式时间内找到一个解答,那么我们也可以在多项式时间内验证该解答是否正确。
然而,尚未找到高效的算法来解决NP问题。
2. P问题P(Polynomial)问题是指可以在多项式时间内解决的问题。
也就是说,存在一个算法可以在多项式时间内找到问题的解答。
3. NP完全问题NP完全问题是指既属于NP问题,又属于最难的NP问题。
如果我们能够在多项式时间内找到一个解答,那么我们可以在多项式时间内解决所有的NP问题。
目前,还没有找到高效的算法来解决NP完全问题。
三、算法优化为了提高算法的效率,我们可以进行算法优化。
常用的算法优化方法包括贪心算法、动态规划、分治法等。
1. 贪心算法贪心算法是一种每次都选择当前最优解的策略。
《计算的复杂性》课件
时间复杂性分析
1
概念与定义
时间复杂性是衡量算法执行所需时间的度量。它通常用大O表示法表示执行时间 与问题规模的关系。
2
时间复杂性的计算方法
可以通过估算算法中每一步操作的时间复杂度,并结合问题规模确定整体的时间 复杂度。
3
时间复杂度的分类
时间复杂度可分为常量时间、对数时间、线性时间、指数时间等不同的复杂度级 别。
《计算的复杂性》PPT课 件
欢迎来到《计算的复杂性》课程的PPT课件!在本次课程中,我们将深入探 讨计算的复杂性以及相关的时间和空间复杂度分析方法,还将研究NP问题及 其应用。让我们开始吧!
什么是计算的复杂性
计算的复杂性是指在计算机科学中研究问题求解过程中的计算资源需求。它涉及到时间复杂性和空间复 杂性的分析,有助于评估和设计高效的算法。
空间复杂性分析
1
概念与定义
空间复杂性是衡量算法执行所需内存空间的度量。它通常用大O表示法表示算法 占用的最大内存空间与问题规模的关系。
2
空间复杂性的计算方法
可以通过估算算法中所使用的数据结构和变量的空间占用,结合问题规模确定整 体的空间复杂度。
3空间复杂度的分类源自空间复杂度可分为常量空间、线性空间、二维空间等不同的复杂度级别。
浅谈计算复杂性理论
浅谈计算复杂性理论
计算复杂性理论是计算机科学中一个重要的领域,它有助于我们理解
计算机如何工作,帮助我们知晓如何使用计算机以有效的方式来解决各种
问题。
而在过去的几十年里,人们研究了计算机的性能,从而开发出有用
的表示,以及有效地分类计算机上的问题,这就是计算复杂性理论。
计算复杂性理论被用来表示计算机程序的复杂性以及它们的处理效率。
它不仅可以度量一个问题的复杂度,还可以度量一系列问题的复杂度,以
及不同的处理器在处理不同问题时所花费的时间。
它还可以用来分析算法
的有效性,以及在最佳的情况下使用不同算法的优劣。
计算复杂性理论目前分为不同的分支,如理论计算机科学、算法分析、最优性和可实现性。
理论计算机科学主要研究计算机能够处理任何问题的
理论基础,包括计算机中可用的空间和时间复杂度等。
算法分析是指利用
不同的技术指标,比如时间和空间复杂度,来评估算法性能的过程。
最优
性跟理论计算机科学相关,它研究给定问题的最优解,并将其复杂度限制
在最低要求。
而可实现性则专注于研究计算机中实现这些最佳解的方法和
算法。
计算复杂性理论的研究是一个新兴的研究领域。
《算法和复杂度》课件
复杂度分析
定义
复杂度分析是评估算法在不同输入下的性能。
空间复杂度
算法在执行过程中所需的额外空间。
时间复杂度
最优、平均和最坏情况下,算法所需的时间。 常见时间复杂度:O(1)、O(log n)、O(n)、O(n^2) 等。
实例分析
通过实例案例,深入了解复杂度分析的应用。
常见算法
搜索算法
线性搜索、二分搜索等。
排序算法
冒泡排序、快速排序、归并 排序等。
图算法
深度优先搜索、广度优先搜 索、最短路径算法等。
应用场景
网络爬虫
使用算法来抓取和分析网页内容。
数据结构算法
数据结构和算法相互依存,用于优化数据操作 和存储。
机器学习
算法是机器学习的核心,用于训练和预测模型。
游戏AI
算法实现性
掌握算法和复杂度分析对于优化问题解决至关 重要。
继续学习的建议
深入学习更多算法和复杂度分析的概念以扩展 技能。
《算法和复杂度》PPT课 件
本课程将介绍算法和复杂度的基本概念。算法是解决问题的步骤集合,而复 杂度分析帮助我们评估算法的效率。通过本课程,您将学习到各种常见的算 法和它们的应用场景。
什么是算法
定义
算法是解决特定问题的有序步骤集合。
特征
算法具有明确的输入、输出,以及确定性和有限性。
排序算法示例
冒泡排序、选择排序、快速排序等。
如何进行算法分析和复杂性分析
如何进行算法分析和复杂性分析算法分析和复杂性分析是计算机科学中非常重要的一部分,它们帮助我们评估和理解算法的效率和性能。
本文将介绍算法分析和复杂性分析的概念、方法和常见的计算复杂性类别。
一、算法分析算法分析是对算法性能的评估和比较。
它提供了对算法资源使用情况的度量,例如时间复杂性和空间复杂性。
1.时间复杂性:时间复杂性是算法运行时间相对于输入规模的度量。
我们通常关注最坏情况下的运行时间,即最长时间。
常用的表示方式有大O表示法。
例如,如果一个算法的时间复杂度是O(n),表示算法的运行时间与输入规模n成正比。
当n变大时,运行时间也会相应增长,但增长的速度是线性的。
2.空间复杂性:空间复杂性是算法运行时所需的额外内存的度量。
同样,通常关注最坏情况下的额外内存使用。
也可以使用大O表示法表示空间复杂性。
算法分析的目标是找到高效的算法来解决问题。
通过对不同算法的复杂性进行度量和比较,我们可以选择最适合特定问题的算法,或者优化现有算法以获得更好的性能。
二、复杂性分析复杂性分析是一种对问题复杂性进行分类和比较的方法。
它研究了问题的难度和所需的计算资源。
根据问题的性质和计算资源的限制,我们可以将问题分为不同的复杂性类别。
1. P类问题(多项式类问题):这些问题可以在多项式时间内解决,即随着输入规模的增加,算法的运行时间以多项式速度增长。
最常见的例子是排序和搜索问题。
2. NP类问题(非确定性多项式类问题):这些问题可以在多项式时间内验证解的正确性。
虽然我们目前无法在多项式时间内找到解,但一旦解被提供进来,我们可以在多项式时间内验证它们的正确性。
最著名的例子是旅行商问题和背包问题。
3. NP-完全问题(非确定性多项式完全问题):这是一类特殊的NP问题,它被认为是NP问题中最困难的一类。
这些问题在NP类中是最难解决的,目前还没有发现多项式时间内的解决方法。
代表性的例子有布尔可满足性问题和子集和问题。
通过对问题的复杂性进行分析,我们可以确定是否存在有效的算法来解决问题,或者将问题归类为NP完全问题。
算法复杂性理论教案
算法复杂性理论教案一、引言算法复杂性理论是计算机科学中的重要分支,它研究的是计算问题的难度和可解性。
在计算机科学的发展过程中,算法复杂性理论对于评估算法的效率和解决难题的方法至关重要。
本教案将介绍算法复杂性理论的基本概念、常见的算法复杂性类别以及相关的数学工具和技巧。
二、基本概念1. 算法算法是解决计算问题的一系列有限步骤的描述,它接受一个或多个输入并生成输出。
一个好的算法应该满足正确性、可读性、健壮性和高效性等要求。
2. 复杂性算法复杂性是用来度量算法所需资源的数量,主要包括时间复杂性和空间复杂性。
时间复杂性是用来衡量算法在处理问题时所需的时间开销,空间复杂性则是用来衡量算法在处理问题时所需的空间开销。
三、时间复杂性时间复杂性是衡量算法效率的重要指标,它描述的是算法所需的执行时间与输入规模之间的关系。
常见的时间复杂性类别包括:1. 常数时间复杂性(O(1))如果算法的执行时间是一个常数,与输入规模无关,那么它的时间复杂性就是常数时间复杂性。
例如,对一个已排序的数组进行访问,无论数组的大小是多少,所需的时间都是固定的。
2. 线性时间复杂性(O(n))如果算法的执行时间与输入规模成正比,那么它的时间复杂性就是线性时间复杂性。
例如,在一个未排序的数组中查找某个元素,最坏情况下需要遍历整个数组。
3. 对数时间复杂性(O(log n))如果算法的执行时间与输入规模的对数成正比,那么它的时间复杂性就是对数时间复杂性。
例如,在二分查找算法中,每次查找都将输入规模减半,因此其时间复杂性是对数级别的。
4. 平方时间复杂性(O(n^2))如果算法的执行时间与输入规模的平方成正比,那么它的时间复杂性就是平方时间复杂性。
例如,冒泡排序算法的最坏情况时间复杂性就是O(n^2)。
5. 指数时间复杂性(O(2^n))如果算法的执行时间与输入规模的指数成正比,那么它的时间复杂性就是指数时间复杂性。
例如,解决旅行商问题的穷举算法的时间复杂性就是指数级别的。
算法设计与复杂度分析
(n/5+1)*(n/3+1)=n^2/15+n/5+n/3+1
O(f)+O(g)=O(max(f,g)); O(n^2/15+n/5+n/3+1)=O(N^2)
20
穷举法实例—货郎担问题
例1.2 货郎担问题:某售货员要到若干个城 市销售货物,已知各城市之间的距离,要 求售货员选择出发的城市及旅行线路使每 个城市仅经过一次,最后回到原出发城市, 而总路程最短。
I DN
I DN i 1
i 1
k
k
~ T (N, I )
•平均情况下的时间复杂性:
Tavg(N)
I DN
P(I )T ( N , I ) P( I ) t e ( N , I )
I DN i 1 i i
k
其中DN是规模为N的合法输入的集合;I*是DN中使T(N, I*)
•4
算法复杂性分析
Ω的定义:如果存在正的常数C和自然数N0,使得当N N0时, 有f(N) C g(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,使得 当N N0时有f(N)/Cg(N)ε,则称函数f(N)当N充分大时的阶比 g(N)低,记为f(N)=o(g(N))。
•12
穷举法实例
问题的陈述
第二章算法的复杂性分析
第二章算法的复杂性分析复杂性分析是计算机科学中非常重要的一个概念,它用来评估一个算法的性能。
在第二章中,我们将学习如何分析算法的时间复杂性和空间复杂性。
时间复杂性是指计算机程序在执行过程中所需要消耗的时间。
算法的时间复杂性分析有助于我们了解一个算法在输入规模增加时,所需要消耗的时间的增长速度。
为了分析算法的时间复杂性,我们通常使用大O表示法来表示算法的时间复杂性。
例如,如果一个算法的时间复杂性为O(n),那么这个算法的运行时间会随着输入规模n的增大而线性增长。
常见的时间复杂性表达式及其对应的增长速度如下:-O(1):常数时间复杂性,算法的运行时间不受输入规模的影响,例如常数级的加法运算。
- O(log n):对数时间复杂性,算法的运行时间随着输入规模的增加而以对数速度增长,例如二分算法。
-O(n):线性时间复杂性,算法的运行时间随着输入规模的增加而线性增长,例如简单查找算法。
-O(n^2):平方时间复杂性,算法的运行时间随着输入规模的增加而平方增长,例如冒泡排序算法。
-O(2^n):指数时间复杂性,算法的运行时间随着输入规模的增加而指数级增长,例如穷举算法。
要进行时间复杂性分析,我们通常需要考虑以下几个方面:1.循环的次数:计算算法中的循环次数,从而确定算法的时间复杂性。
2.递归的深度:计算算法中递归函数的调用次数,从而确定算法的时间复杂性。
3.嵌套循环:计算算法中嵌套循环的次数,从而确定算法的时间复杂性。
空间复杂性是指计算机程序在执行过程中所需要的内存空间。
算法的空间复杂性分析有助于我们了解一个算法在运行过程中所需要占用的内存空间。
与时间复杂性类似,空间复杂性也使用大O表示法来表示。
例如,如果一个算法的空间复杂性为O(n),那么这个算法需要占用与输入规模n相关的内存空间。
常见的空间复杂性表达式及其对应的增长速度如下:-O(1):常数空间复杂性,算法的空间占用不随输入规模的增加而变化,例如只需要占用几个变量的内存空间。
计算复杂性的现代方法
:
算法分析
1.概念
算法分析是在数学上定义和推断算法效率的过程。
它实质上试图衡量算法的复杂性,检测可能的性能瓶颈,并确定程序运行时间与空间之间的权衡。
主要方法是估计算法的执行时间,并改进其复杂度或执行时间。
2.时间复杂度
时间复杂度评估一个算法的执行时间和性能的有效性。
它是衡量算法的一项标准,用来评估算法的最大执行时间。
它可以用大O符号来表示,如O(n),O(nlogn)等等。
3.空间复杂度
空间复杂度评估的是算法需要的内存空间。
它可以用来表示算法所需的存储空间大小。
例如,可以用O(n)来表示,表示使用了n个内存单元。
4.算法优化
算法优化是指一系列策略来改善算法效率或消除不必要的计算。
它通过分析不断调整算法来提高算法的效率,减少执行时间。
算法优化的方法有:按需动态调度、分析时间和空间复杂度、减少算法中的冗余等。
5.模拟分析
模拟分析是将算法应用于计算机程序中,它通过模拟解决程序中的情况来估计算法的执行时间和复杂度。
它结合了计算机科学和数学来估计程序运行时间和空间复杂性分析,可以用来找到程序中的性能瓶颈并改进程序。
6.分析和优化工具
现代分析和优化工具提供了一个便捷的方式来衡量和优化复杂的算法。
它们可以帮助程序员更好地理解算法的本质,监测程序的执行时间和空间复杂性,帮助他们辨别算法的性能瓶颈并指出可以改进的地方。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
行3的比较进行n-1次, 故 W(n) = n-1.
8
问题类复杂度
定理
在 n 个数的数组中找最大的数, 并以比较 作为基本运算的算法类中的任何算法最坏情 况下至少要做 n-1 次比较.
证 因为MAX是唯一的, 其它的n-1个数必 须在比较后被淘汰. 一次比较至多淘汰一个数, 所以至少需要 n-1 次比较.
问题 在表中查找 x
基本运算 比较
实矩阵相乘
实数乘法
排序
比较
遍历二叉树
置指针
两种时间复杂性: 最坏情况下的复杂性W(n) 平均情况下的复杂性A(n)
3
占用空间--空间复杂性分析
两种占用: 存储程序和输入数据的空间 存储中间结果或操作单元所占用空间--额外空间
影响空间的主要因素: 存储程序的空间一般是常数(和输入规模无关) 输入数据空间为输入规模 O(n) 空间复杂性考虑的是额外空间的大小 如果额外空间相对于输入规模是常数, 称为原地 工作的算法.
实时例间为f(IT)A的(n时)=间t1(,n)t+2为p(n把)+Pt2(的n)解:st1转为换把成Q的Q的实解例的I 转时换间到P的 • 若t1(n), t2(n)=O(p(n)),|f(I)|=O(n),则TA(n)=Θ(p(n))
p(n)=Θ(TA(n))=Ω(F(n))
结论
P至少与Q一样难
12
算法分析的实例
搜索有序表
顺序搜索、改进顺序搜索、二分搜索 最优性的分析
排序
起泡排序、快速排序与归并排序、堆排序 最优性的分析
选择
选择最大、选最大和最小、选第二大、选中位数 最优性分析
13
搜索有序表
问题: 按递增顺序排列的数组 L, 项数 n ≥1. 数 x 如果 x 在 L 中, 输出 x 的下标; 否则输出0
程序正确性证明的方法: 大型程序的正确性证明——可以将它分解为小的 相互独立的互不相交的模块, 分别验证. 小模块程序可以使用以下方法验证: 数学归纳法、软件形式方法等
2
工作量--时间复杂性分析
计量工作量的标准: 对于给定问题,该算法所执行
的基本运算的次数.
基本运算的选择:根据问题选择适当的基本运算
Hale Waihona Puke 顺序算法分析的基本方法算法分析的原则 正确性、工作量、占用空间 简单性、最优性(问题复杂度)
算法分析的实例 搜索有序表 排序 选择
1
算法分析的原则
正确性
概念 在给定有效输入后, 算法经过有限时间的计 算并产生正确的答案, 就称算法是正确的.
正确性证明的内容: 方法的正确性证明——算法思路的正确性. 证明一系列与算法的工作对象有关的引理、定 理以及公式. 程序的正确性证明——证明所给出的一系列指令 确实做了所要求的工作.
在解这个问题的算法类中没有其它算法在最坏情况下的 时间复杂性比 A 在最坏情况下的时间复杂性低, 则称 A 是解这个问题在最坏情况下的最优算法.
平均情况下最优:设 A 是解某个问题的算法, 如果 在解这个问题的算法类中没有其它算法在平均情况下的 时间复杂性比 A 在平均情况下的时间复杂性低, 则称 A 是解这个问题在平均情况下的最优算法.
操作序列 τ 包含尽量多的非决定性操作. • 给出冗余操作+必要的操作的计数公式
11
下界证明法三:归约
条件
• 已知问题 Q最坏情况下时间复杂度下界为F(n),即求解Q的 任何算法 A 最坏情况的时间≥F(n)
• 需要确定问题 P 的算法类最坏情况下的时间复杂度下界
方法
• 设计一个求解 Q 的算法 A,A调用任意解P的算法B.
6
寻找最优算法的途径
设计算法A, 求W(n). 相当于给出最坏情况下的一个上界. 寻找函数F(n), 使得对任何算法都存在一个规模为n的输入 并且该算法在这个输入下至少要做F(n)次基本运算. 相当 于对问题给出最坏情况下所需基本运算次数的一个下界. 如果W(n)=F(n), 则A是最优的. 如果W(n)>F(n), A不是最优的或者F(n)的下界过低.
• 算法类的平均情况下时间复杂度下界:所有的树中平均深 度最浅的树的树深.
10
下界证明法二:构造最坏输入
任意给定一个算法 A,A对于任意输入 x 都存在 一个确定的操作序列 τ
• τ中的操作分成两类:
– 决定性的:能够对确定输出结果提供有效信息 – 非决定性的:对确定结果没有帮助的冗余操作
• 根据算法A构造某个输入实例 x,使得A对x 的
结论: findmax 算法是最优算法.
9
下界证明法一:判定树
• 判定树:作为某个算法类的模型,根据算法类的性质给出 判定树的构造规则
– 一棵判定树对应一个算法 – 一片树叶代表一个输入 – 从根到某片树叶的路径代表算法对这个输入的工作量 – 树深代表最坏情况的工作量,平均路径长度代表平均工作量
• 算法类的最坏情况下时间复杂度下界:所有的树中深度最 浅的树的树深.
改进A或设计新算法A’使得W ’(n)<W(n). 重新证明新下界F ’(n)使得F ’(n)>F(n). 重复以上两步,最终得到W ’(n) = F ’(n)为止.
7
例1 在n个不同的数中找最大的数
基本运算: 比较
算法 findmax 输入 数组L, 项数 n≥1 输出 L中的最大项MAX 1. MAX←L(1); i←2; 2. while i≤n do 3. if MAX<L(i) then MAX←L(i); 4. i←i+1;
14
改进的顺序搜索
算法2 改进的顺序搜索 1. j←1 2. while j≤n and x>L(j) do j←j+1 3. if x<L(j) or j>n then j←0
算法1 顺序搜索 输入: L, x 输出: j 1. j←1 2. while j≤n and L(j)≠x do j←j+1 3. if j>n then j←0
分析:设 x 在L中每个位置和空隙的概率都是1/(2n+1)
W(n)=n
A(n)=[(1+2+...+n)+n(n+1)]/(2n+1)≈3n/4.
两种空间复杂性: 最坏情况下的复杂性和平均情况下的复杂性.
4
简单性
含义:算法简单,程序结构简单. 好处:容易验证正确性
便于程序调试 简单的算法效率不一定高. 要在保证 一定效率的前提下力求得到简单的算法.
5
最优性
含义 指求解某类问题中效率最高的算法
两种最优性 最坏情况下最优:设 A 是解某个问题的算法, 如果