算法设计与分析(一)-算法基础.ppt

上传人:yyf 文档编号:5030709 上传时间:2020-01-29 格式:PPT 页数:96 大小:2.01MB
返回 下载 相关 举报
算法设计与分析(一)-算法基础.ppt_第1页
第1页 / 共96页
算法设计与分析(一)-算法基础.ppt_第2页
第2页 / 共96页
算法设计与分析(一)-算法基础.ppt_第3页
第3页 / 共96页
算法设计与分析(一)-算法基础.ppt_第4页
第4页 / 共96页
算法设计与分析(一)-算法基础.ppt_第5页
第5页 / 共96页
点击查看更多>>
资源描述

《算法设计与分析(一)-算法基础.ppt》由会员分享,可在线阅读,更多相关《算法设计与分析(一)-算法基础.ppt(96页珍藏版)》请在三一文库上搜索。

1、算法设计与分析 2011.9 (ACM创新实验班 2010级),写在讲课前,一、什么是算法 算法就是计算的方法。 数学 数:1,2,3,4, 学:偶数、质数、微积分之数的学问 算法 算:加、减、乘、除 法:何时、何处用何计算之算的方法,写在讲课前(续),举个例子:排序 问题描述:将一组数按从小到大的顺序整理有序 基本思想:小的数往前排,大的数往后排 怎么排?算法 冒泡排序 选择排序 归并排序 快速排序 堆排序 Shell排序 ,每种算法都是一组特定的规则,规定了一种处理数据的运算方法,写在讲课前(续),问题:既然每种方法都可以实现排序之目的,何必费心研究这么多排序算法? 目的一:是不是人们的遐

2、想?起码不是瞎想 目的二:算法和算法间是有区别的 性质不同:稳定、不稳定 性能不同:速度、空间 适用场合不同 没有万全的算法适合所有的应用的。 怎么选择:根据性能、结合需求、综合选择 如何了解每种算法的性能?算法的分析,人们乐衷于寻找不同的方法以在不同的应用要求下求解各种问题,写在讲课前(续),二、算法分析 了解算法的性能: 算法速度:快还是慢?如何衡量?怎么比较? 空间使用量(计算机算法*):大还是小?如何衡量?怎么比较? 其它方面的性质等。,写在讲课前(续),实例分析: 排序算法的理论分析:(略) 编程序测试 1.冒泡排序真的很慢吗? 数据集元素个数:10、20、1000、10000 2.

3、快速和归并排序都是O(nlogn)的时间复杂度, 到底谁快呢?原因是什么? 3.冒泡排序会不会比快速排序快? 来自于实测的结论:可能。,写在讲课前(续),三、为什么要学习算法 1.编程序的需要 任何程序都需要算法。 the core of computer science 程序 = 数据结构 + 算法 2.改造世界的需要 世界上还有很多很多的问题等待你解决,有无数的程序等待你去编。 3.国家综合实力的体现(大) 从软实力的角度,算法是国家科技生产力的核心。是国家综合实力的体现。,写在讲课前(续),四、算法太多了,学不过来 是的,千万的问题、万千的算法。都学过来是不可能的。甚至专一门已经很了不起

4、。 课堂学习只能关注于算法设计与分析的基本策略与方法,为设计更复杂、更有效的算法奠定基础。 更多的知识需要同学们以后不断学习,甚至创造出新的算法。,写在讲课前(续),五、算法的学习过程:痛苦并快乐着 1.枯燥的过程 繁vs烦:学习一个算法如同做一道数学题,多了呢? ACM ICPC的训练过程,谁学谁知道 2.智慧的积累 方法的掌握、技术的升华 3.理论的贡献 算法成就或在于理论的贡献,而不仅仅是技术的提高。 如何成就好算法:好思想+好技术,写在讲课前(续),六、好算法 从理论的角度说,好算法应该有较低的时间复杂度(高速)和空间复杂度(低耗),但好的算法还要依靠好的实现,需要理论与技术、技巧的结

5、合才能最终实现好的算法。 从应用的角度说,能有效地解决问题的算法都是好算法不管黑猫白猫,抓住老鼠就是好猫;不管A算法、B算法,能解决问题就是好算法(实用了点)。,概述,课程核心:介绍算法设计与分析的基本理论、方法和技术,奠定算法设计的基础。 教学目的: 在理论学习上,掌握算法分析与设计的基本理论和方法,培养设计新算法和分析算法复杂性的能力。 在实践教学上,掌握算法实现的技术、技巧,学习算法的正确性验证、效率分析、优化技术,以及算法在实际问题中的分析与应用。 培养独立研究和创新能力。,概述(续),课程内容: 基本概念:算法的定义、性质、 分析算法的基本方法等 分治策略(Divide and co

6、nquer) 贪心方法(Greedy method) 动态规划(Dynamic Programming) 图算法(Graph Algorithms) 回溯与分枝限界 专题 综合实践,概述(续),本课程需要的基础 数据结构 程序设计语言(C/C+):结构化设计 数学基础 操作系统、编译,概述(续),授课形式: 课堂教学:() 课堂讨论:专题、解题报告 上机实践:需要提交实验报告,概述(续),主要参考书 计算机算法基础, 余祥宣等编著,华中科技大学出版社 Introduction to algorithms, Thomas H. Cormen,etc., second edition, The M

7、IT Press. Algorithm Design,Michael T. Goodrich 算法设计与分析,王晓东,清华大学出版社,概述(续),其它参考书 The Art of Computer Programming, Donald E.Knuth. Volume 1-3, Second Edition. Data Structures, Algorithms, and Applications in C+(Part 3) Sartaj Sahni, China Machine Press etc.,一、算法基础,参考资料: 计算机算法基础 第二章 Introduction to algo

8、rithms Chapter 1、 Chapter 3,1.1 算法的定义及特性,1. 什么是算法? 算法如数字、计算一样,是一个基本概念。 算法是解一确定类问题的任意一种特殊的方法。 在计算机科学中,算法是使用计算机解一类问题的精确、有效方法的代名词; 算法是一组有穷的规则,它规定了解决某一特定类型问题的一系列运算。,对算法概念的理解 算法由运算组成 算术运算、逻辑运算、关系运算、赋值运算、过程调用 算法有其特殊性 解决不同问题的算法是不相同的,有没有一个万能的算法? 算法是有穷的计算过程 静态上:规则/运算/语句的数量有穷 动态上:计算过程/计算时间有限,我们已经接触过的算法: 分类(排序

9、)算法:将已知的n个元素按照关键值大小的非增/非降顺序重新排列。 如:冒泡排序、插入排序、归并排序 查找算法:从已知的元素集合中找出满足要求的一个或一组元素。 如:顺序查找、二分查找、第k小元素 如果从n个元素里找最小元素该怎么做,如 果需要多次查找,我们又该怎么做? 图算法: 在已知的图中找出满足某些性质的结点或边。 如:最短路径算法、最小成本生成树,思考:,我们学会了解决一个个具体问题的算法,那么在这些算法的设计中有没有一些共性的东西?有没有可以总结出来的规律、规则和方法?这些规律、规则和方法对于其它算法的设计有没有指导意义? 能不能找到算法设计的一般策略、方法和技术?,算法:求解问题的一

10、组规则 检索问题 分治策略 排序问题 贪心策略 路径问题 规则的设计 设计策略 动态规划 最优化问题 检索 遍历问题 回溯 分枝限界 .,发现,指导,形成算法,产生算法设计的指导思想和基本规律,较高的算法设计能力不仅在于简单使用一些具体的算法,更在于对算法设计方法的掌握上。只有深入理解算法设计的策略、技术和方法,才能在面对新问题时创造出新的算法。 算法学习要做到: 深入理解算法设计的一般规律、技术和方法 灵活运用现有的算法解决实际问题 在改造客观世界的过程中,运用学到的知识创造新的算法,解决新的问题,2. 算法的五个重要特性,确定性、能行性、输入、输出、有穷性,1)确定性:算法使用的每种运算必

11、须要有确切的定义,不能有二义性。 例:不符合确定性的运算 5/0 将6或7与x相加,2)能行性 算法中有待实现的运算都是基本的运算,原理上每种运算都能由人用纸和笔在“有限”的时间内完成。 例:整数的算术运算是“能行”的 实数的算术运算可能是“不能行”的,如何认识算法的确定性和能行性?,确定性和能行性是算法设计过程可能存在的问题。 一个实际的程序设计语言定义了该语言中可以使用的数据类型和能够参与的运算,编译器可以对程序中的非法运算检错。非确定、非能行的“臆造”运算是不能存在的,程序的正确性主要在于逻辑正确对正确的输入能给出正确的结果 但理论上的算法正确性还是要有全面考虑的。,3)输入 每个算法有

12、0个或多个输入。这些输入是在算法开始之前给出的量,取自于特定的对象集合定义域 4)输出 一个算法产生一个或多个输出,这些输出是同输入有某种特定关系的量。,算法的状态转换,算法:一个定义好的计算,把特定的输入转换 成需要的输出。,算法的状态转换(续),状态:算法/程序中一组变量的当前值称为算 法/程序的当前状态。 算法:状态转换器,把算法输入时的初始状态 转换为输出时的终止状态,5)有穷性 一个算法总是在执行了有穷步的运算之后终止。,计算过程:满足确定性、能行性、输入、输出, 但不一定满足有穷性的一组规则。 算法和计算过程的关系: 计算过程:操作系统(不终止的运行过程) 算法是“可以终止的计算过

13、程”,时效性:实际问题往往都有时间要求。 例:国际象棋(启发) 数值天气预报 只有在要求的时间内解决问题才是有意义的。,基于算法的时效性,只有把在相当有穷步内终止的算法投入到计算机上运行才是实际可行的。 何为“相当有穷”? 通过算法分析,了解算法速度,给出算法计算时间的一个精确的描述,以衡量算法的执行速度,选择合适的算法解决问题。 注:算法分析还包括空间分析。,与算法学习相关的内容,五个方面:设计、表示、证明、分析、测试,1)设计:构思算法的处理规则,创造性的活动。 2)表示:用某种方式把算法描述出来。 “类语言”(SPARKS语言)、实际语言、流程图 3)证明:证明算法的正确性。 正 确 性

14、:对合法输入能得出正确的答案。 算法证明:证明算法是正确性,与语言无关 程序证明:证明程序是正确性,不仅思路正确,而且 书写也要正确。,与算法学习相关的内容(续),4)分析:对算法的时、空特性做定性、定量分析,以了解算法的性质。 5)测试:将算法变成程序,放到计算机上运行,观察运行情况 编程中的调试:排错过程。E.Dijkstra的名言:“调试只能指出有错误,而不能指出它们不存在错误” 运行中的测试:分析过程。作时空分布图,验证分析结论,进一步优化算法设计。 本课程集中于学习算法的设计与分析。通过学习,掌握计算机算法设计和分析基本策略与方法,为设计更复杂、更有效的算法奠定基础,1.2 分析算法

15、基础,从一个例子开始讲起:插入分类 插入分类算法描述: 输入:n个元素存放在数组A中:A1An 输出:数组A中的元素A1An按照从小到大的顺序排列 设计思路: 1. 将第一个元素(A1)看作只有一个元素的有序子序列; 2. 置循环 i=2 to n,将Ai插入到由A1Ai-1元素组成的有序子序列中去。 思考问题: 上述设计思路对吗? 如何实现?,SPARKS语言算法描述: procedure INSERTIONSORT(A,n) A(0)- /A0做监视哨(什么叫监视哨?) for i2 to n do /从第二个元素开始循环 itemA(i); /将Ai放到临时变量item中 ji-1 /从

16、后往前查找当前元素的插入位置 while itemA(j) do A(j+1)A(j); /比item大的元素往后移一位 jj-1; /继续往前查找 repeat A(j+1) item; /将item插入到正确的位置上 repeat end INSERTIONSORT,算法导论算法描述: INSERTIONSORT(A,n) A0- A0做监视哨 for i2 to n 从第二个元素开始循环 do itemAi 将Ai放到临时变量item中 ji-1 从后往前查找当前元素的插入位置 while itemAj do Aj+1Aj 比item大的元素往后移一位 jj-1; 继续往前查找 A(j+

17、1) item; 将item插入到正确的位置上,针对上述算法,进一步思考: 这个算法的描述正确吗? 能行、确定、输入、输出、有穷? 正确性证明 运算得快吗? 时间复杂度分析 使用了多少内存? 空间复杂度分析 进一步我们需要回答: 它能够应用到那些领域? 对算法的进一步分析 利用不同语言实现需要那些技巧? 实现,1. 分析算法的目的,算法选择的需要:对同一个问题可以设计不同的算法,不同的算法对时间和空间需求是不同的,我们需要选择合适的算法 算法优化的需要:进一步改进算法,使其工作的更好 分析算法的目的在于: 通过对算法的分析了解算法的性能,1)可以在解决同一问题的不同算法之间比较性能的好坏,从而

18、运行好的算法,改进差的算法,避免无益的人力和物力浪费。2)可以对算法的性质作深入了解,从而可以进一步优化算法,让其更好地工作。,2. 重要的假设和约定,1)计算机模型的假设 计算机形式理论模型: 有限状态自动机、Turing机 通用的顺序计算机模型: 单CPU串行算法 有足够的“内存”,并能在固定的时间内存取 数据单元 RAMrandom-access machine 区分计算机的理论模型与实际的计算机,2)计算的约定,算法的执行时间是算法中所有运算执行时间的总和,可以表示为: 算法的执行时间= 其中, fi :是运算i的执行次数,称为该运算的频率计数 仅与算法的控制流程有关,与实际使用的 计

19、算机硬件和编制程序的语言无关。 ti :是运算i在实际的计算机上每执行一次所用的时间 与程序设计语言和计算机硬件有关。 如何确定算法使用了何种运算,每种运算的fi和ti又是多少?,运算的分类,依照运算的时间特性,将运算分为时间囿界于常数的运算和时间非囿界于常数的运算。 囿界:限于 时间囿界于常数的运算: 基本算术运算,如整数、浮点数的加、减、乘、除 字符运算、赋值运算、过程调用等 特点:执行时间是固定量,与具体的操作数无关。 例: 1+1 = 2 vs 10000+10000 = 20000 100*100 = 10000 vs 10000*10000 = 100000000 CALL INS

20、ERTIONSORT,更一般的情况,设有n种运算c1,c2,cn,它们的执行时间分别是t1,t2,tn。 令t0=max(t1,t2,tn),则每种运算执行一次的时间都可以用t0进行限界(上界)。 视t0为一个单位时间,则这些运算“理论”上都可视为仅花一个固定的单位时间t0即可完成的运算 称具有这种性质的运算为时间囿界于常数的运算。,运算的分类(续),时间非囿界于常数的运算: 字符串操作:与字符串中字符的数量成正比 例:字符串的比较运算(strcmp) 记录操作:与记录的属性数、属性类型等有关 特点:运算时间与操作数相关,每次执行的时间是一个不定的量。,怎么分析时间非囿界于常数的运算? 这类运

21、算通常是由更基本的运算组成的。而这些基本运算是时间囿界于常数的运算。 如:字符串的比较运算是由一组字符比较运算组成的。 非囿界于常数的运算的一次执行时间是其包含的所有基本运算的执行时间之和: 如:字符串比较时间tstring tstring = Length(String)* tchar 故:分析非时间囿界于常数的运算时,将其分解成若干时间囿界于常数的运算即可。,3)工作数据集的选择,算法的执行情况与输入数据有关,体现在: 算法的执行时间与输入的数据规模相关,一般 规模越大,执行时间越长。 在不同的数据配置上,同一算法有不同的执行 情况,可分为最好、最坏和平均等情况讨论。 编制不同的数据配置,

22、分析算法的最好、最坏、平均工作情况是算法分析的一项重要工作。 如插入排序的最好(O(n))、最坏(O(n2)工作情况。,注:编制测试数据对算法分析与程序调试都是关键的,但目的不同。 算法分析数据集:反映算法的典型执行情况(最好、最坏、平均) 调试程序数据集:排错。力求走到程序设计的每个分支,验证各种情况下程序执行的正确性。,3.如何进行算法分析?,对算法的全面分析将分两个阶段进行:事前分析和事后测试(理论分析和程序测试)。 事前分析:求算法时间/空间复杂度的限界函数。 限界函数通常是关于问题规模n的特征函数,被表示成、或的形式。 如归并排序的O(nlogn)。 特征函数是通过分析算法的控制逻辑

23、得来的,是对算法所用运算执行次数的统计结果。与使用的程序设计语言和计算机硬件无关。,事后测试:将算法编制成程序,放到实际的计算机上运行,收集程序的执行时间和空间占用等统计资料,然后进行分析判断。 事后测试与物理实现直接有关。 算法分析主要集中于与物理实现无关的事前分析阶段获取算法的理论时间/空间复杂度。,1)事前分析,目标:获取算法的时间(空间)复杂度函数,在理论上分析算法性能的好坏。 可以分为时间、空间两个方面: 时间分析: 了解算法中使用了那些运算(具有单位执行时间)。 分析程序的控制流程,从而确定各类运算的执行次数。一般情况下,执行次数越多,程序的执行时间越长。 将对运算执行次数的分析结

24、果表示成问题规模n的特征函数。 算法性能有最好、平均、最坏等情况,与数据配置有关。分析典型的数据配置,了解算法在各种情况下的执行情况。,空间分析: 分析算法中各类变量的定义情况 分析算法的嵌套结构中变量的使用情况 将空间占用量表示成为问题规模n的特征函数。 空间占用有最大、平均、最少等情况,与数据配置有关。分析典型的数据配置,了解算法在各种情况下的空间占用情况。,如何进行时间分析?,统计算法中各类运算的执行次数频率计数 统计对象:运算 基本运算:时间囿界于常数的运算 具有固定执行时间的复合运算:一条语句、一个过程或函数 频率计数:算法中语句或运算的执行次数,从算法的控制流程得来。 顺序结构中的

25、运算/语句:执行次数计为1 嵌套结构中的运算/语句:执行次数等于被循环执行的次数 控制流程分析的关键:确定算法中使用的嵌套结构,包括循环语句、嵌套调用等。,例:执行次数的统计 xx+y for i 1 to n do for i 1 to n do x x + y for j 1 to n do repeat x x +y repeat repeat (a) (b) (c) 分析: (a): xx+y执行了1次 (b): xx+y执行了n次 (c): xx+y执行了n2次, 频率计数通常是问题规模n的函数:n0,n,n2, 算法的执行时间是算法中各类运算执行时间之和,正比于各类运算的频率计数之

26、和。,例:插入分类 procedure INSERTIONSORT(A,n) /将A(1:n)中的元素按非降次序分类,n1/ 执行次数 单位执行时间 A(0)-/设置初始边界值 1 t1 for j2 to n do /A(1:j-1)已分类/ n-1 t2 itemA(j); n-1 t3 ij-1 n-1 t4 while itemA(i) do /0ij/ 最多i次,最少1次 t5 A(i+1)A(i); 最多i-1次,最少0次 t6 ii-1; 最多i-1次,最少0次 t4 repeat A(i+1) item; n-1次 t7 repeat end INSERTIONSORT 最坏情

27、况时间:,令 t0=max(t1,t2,t3,t4,t5,t6,t7),则,最坏情况,最好情况, 事前分析的结果与所使用的机器及其他环境因素无关 (如程序设计语言、编译器),只与算法本身的控制流 程有关。 对算法最主要的部分进行分析,抓住主要矛盾,如插入 排序中,可以仅集中于对for/while双重嵌套循环的分析, 而忽略顺序或执行次数低的部分。,函数表达式的数量级(阶) 函数表达式中的最高次项的次数, 是衡量频率计数的“大小”的一种测度。 数量级从本质上反映了算法复杂度的高低 数量级越小,算法的复杂度越低,同等规模下算法执行时间越短。反之, 数量级越大,算法的复杂度越高,同等规模下算法执行时

28、间越长。 例:假如求解同一个问题的三个算法分别具有n, n2 , n3 数量级。 若n=10,则可能的执行时间将分别是10,100,1000 个单位时间与环境因素无关。 实例:工资的级别,限界函数:用频率计数函数表达式中的最高次项表示限界函数,记为: g(n)。 g(n)通常是关于n的形式简单的函数式 如:logn,nlogn,n2等 不同算法的g(n)有不同的具体形式。 g(n)通常是对算法中最复杂的计算部分分析而来的。 g(n)忽略了函数表达式中次数较低的“次要”项,体现了算法复杂性的最本质特征。 g(n)通常取单项的形式: 空间特性分析(与时间特性的分析类似,略),2)事后测试,把算法编

29、制成程序,在实际的计算机硬件平台上运行程序,统计执行实际耗费的准确的时间与空间,与事前分析的结论进行比较,验证先前的分析结论包括正确性、执行性能等,比较、优化所设计的算法。 分析手段:作时、空性能分布图,4. 计算时间的渐近表示,算法时间/空间复杂度的限界函数常用的有三个:上界函数、下界函数、“均值”函数。定义如下: 记:算法的实际计算时间为f(n),计算时间的限界函数为g(n),其中, n是问题规模的某种测度。 f(n)是与机器及语言有关的量。 g(n)是事前分析的结果,一个形式简单的函数,与频率计数有关、而与机器及语言无关。,1)O、记号,定义1. 1(上界函数)如果存在两个正常数c和n0

30、,对于所有的nn0,有|f(n)| c|g(n)|,则记作f(n) = (g(n)。 含义: 如果算法用n值不变的同一类数据(规模相等,性质相同)在某台机器上运行,所用的时间总小于|g(n)|的一个常数倍。 函数f 至多是函数g 的c倍,除非nn0。即是说,当n 充分大时,g 是f 的一个上界函数(在相差一个非零常数倍的情况下)。 f(n)的数量级就是g(n)。,通常情况下,取函数式里的最高次项,舍掉低阶项和常数(因为低阶项和常数最终被湮灭在高次项里),且忽略系数。如: c=O(1): f(n)等于非零常数,可看作n0 4n+3=O(n): 可取c5,n03 100n+6=O(n): 可取 c

31、=101,n06 62n+n2=O(2n): 可取c =7,n0=4 10n2+4n+3=O(n2) 3log n + 2n + n2 =O(n2) nlog n +n2=O(n2),注: 1总是试图求出数量级最小的g(n)作为f(n)的上界函数,即, g(n)应该尽量接近函数f(n)。如 若:3n+2=O(n2) 则是松散的界限; 而:3n+2=O(n) 就是较好的界限。 数量级最小,限界越精确。 2不要产生错误界限。 如,n2+100n+6,当nc-100 就有 n2+100n+6cn。 同理,3n2+42n=O(n)也是错误的。,3 f(n)=O(g(n)不能写成g(n)=O(f(n)。

32、 f(n)与g(n)并不等价,这里的等号也并不是通常相等的含义。 O更精确的定义可以用集合表示: O(g(n)=f(n)|f(n)满足:存在正的常数c 和n0,使得当n n0 时,f(n) cg(n) 这里O(g(n)是一个集合,f(n)=O(g(n)读作: “f(n)是g(n)的一个大O 成员” 记作:f(n) O(g(n) 但通常写作:f(n)=O(g(n)。 (以上内容参见Intruduction to AlgorithmChapter 3, 、 相同),定理1.1 大O比率定理 对于函数f (n)和g (n),若 存在,则 f (n)=O (g (n) ),当且仅当存在确定的常数c,有

33、 c。 证明: 1)如果f (n)=O (g (n) ),则存在c 0及某个n0,使得对于所有的nn0,有f (n) /g(n)c,因此 c。 2)假定 c,它表明存在一个n0,使得对于所有的nn0,有f (n)max1, c *g (n)。证毕。,例:因为 ,所以5n+2 = O(n) 因为 ,所以7n2+5n+2 = O(n2) 因为 ,所以52n+n2 = O(2n) 考察下式: 因为 ,所以n9+3n2 = O(2n) 是否合适?显然这不是一个好的上界估计。 原因在于:极限值不是一个正常数。,用于估算复杂性阶的定理,定理1.2 对于任意正实数x 和 ,有下面的不等式: 1) 存在某个n

34、0 , 使得对于任何nn0 , 有(log n)x(log n)x+ 2) 存在某个n0 , 使得对于任何n n0 ,有(log n)x n。 3) 存在某个n0 , 使得对于任何n n0,有nxnx+ 。 4) 存在某个n0 , 使得对于任何nn0 ,有nx2n。 5) 对任意实数y , 存在某个n0,使得对于任何nn0, 有 nx (log n)y nx+,例: 根据定理1.2,很容易得出: n3 + n2 log n = O(n3 ) ; n4 + n2.5 log20 n = O(n4 ); 2n n4 log3 n2n n5 / log3 n = O(2n n5 )。,定义1.2(下

35、界函数) 如果存在两个正常数c和n0,对于所有的nn0,有|f(n)| c|g(n)|,则记作f(n) = (g(n)。 含义: 如果算法用n值不变的同一类数据在某台机器上运行,所用的时间总不小于|g(n)|的一个常数倍。 函数f 至少是函数g 的c 倍,除非n n0 。即是说,当n 充分大时,g 是f 的一个下界函数(在相差一个非零常数倍的情况下)。,注: 1. 通常情况下,下界函数也取单项的形式。 2. 总是试图求出数量级最大的g(n)作为f(n)的下界函数,g(n)应该尽量接近函数f(n)。 3. 类似于大O 符号,可以参考定理1.2 所列的不等式,来估计复杂性函数的下界。 其它具有和大

36、O类似的性质。,定理1.3 大比率定理 对于函数f (n)和g (n),若 存在,则 f (n)= (g (n) ),当且仅当存在确定的常数c,有 c。 注: 这里,当n充分大时,g(n) cf (n)意味着 , 由此不难看出上述判别规则的正确性。,定义1.3(“平均情况”) 如果存在正常数c1,c2和n0,对于所有的nn0,有 c1|g(n)| |f(n)| c2|g(n)|, 则记作 含义: 算法在最好和最坏情况下的计算时间就一个常数因子范围内而言是相同的。可看作: 既有 f(n) = (g(n),又有f(n) = (g(n) 函数f 介于函数g 的c1和c2倍之间,即当n充分大时, g

37、既是f 的下界,又是f 的上界。,定理1.4 大比率定理 对于函数f (n)和g (n),若 和 都存在,则 f (n)= (g (n) ),当且仅当存在确定的常数c1和c2,有 c1和 c2。,2)关于算法复杂度的讨论,(1) 数量级的大小对算法的有效性有决定性的影响。 以上界函数O(g(n)为例, 例:假设解决同一个问题的两个算法,它们都有n个输入, 计算时间的数量级分别是n2和nlogn。则, n=1024:分别需要1048576和10240次运算。 n=2048:分别需要4194304和22528次运算。 可以看到: 同等规模下,计算量有数十倍的差距; 而在规模加倍后,一个(n2)的算

38、法计算时间增长4倍,而一个(nlogn)算法则只增长两倍多一点。,(2)算法时间复杂度的分类,根据上界函数的特性,可以将算法分为:多项式时间算法和指数时间算法。 多项式时间算法:可用多项式(函数)对计算时间限界 的算法。常见的多项式限界函数有: (1) (logn) (n) (nlogn) (n2) (n3) 指数时间算法:计算时间用指数函数限界的算法。常见的 指数时间限界函数: (2n) (n!) (nn),复杂性越来越高,复杂性越来越高,当n取值较大时,指数时间算法和多项式时间算法在计算时间上非常悬殊。 计算时间的典型函数曲线,计算时间函数值比较,表1.1 典型函数的值,对算法复杂性的一般

39、认识,当数据集的规模很大时,要在现有的计算机系统上运行具有比(nlogn)复杂度还高的算法是比较困难的。 指数时间算法只有在n取值非常小时才实用。 要想在顺序处理机上扩大所处理问题的规模,有效的途径 是降低算法的计算复杂度,而不是(仅仅依靠)提高计算机的速度。,(3)多项式定理,定理1 若A(n) = amnm+a1n+a0是一个m次多项式,则有 A(n) = (nm) 即:变量n的固定阶数为m的任一多项式,与此多项式的最高阶nm同阶。 证明:取n0=1,当nn0时,有 |A(n)|am|nm+|a1|n+|a0| (|am|+|am-1|/n+|a0|/nm) nm (|am|+|am-1|

40、+|a0|) nm 令c= |am|+|am-1|+|a0|,即有|A(n)| cnm 。证毕。 应用:如果一个算法的复杂性函数是多项式形式,则其阶函数就可取该多项式的最高项。,3) 限界函数的性质,传递性:若 且 , 则 。( 同) 自反性: 对称性:若 ,则 。 转置对称性: 当且仅当 证明: 从定义出发。 证明过程略。,定理:设d(n)、e(n)、f(n)和g(n)是将非负整数映射到非负实数的函数,则 (1)如果d(n)是O(f(n),那么对于任何常数a0,ad(n)是O(f(n); (2)如果d(n)是O(f(n), e(n)是O(g(n),那么d(n)+e(n)是O(f(n)+g(n

41、); (3)如果d(n)是O(f(n), e(n)是O(g(n),那么d(n)e(n)是O(f(n)g(n); (4)对于任意固定的x0和a1,nx是O(an); (5)对于任意固定的x0,lognx是O(logn); (6)对于任意固定的常数x0和y0,logxn是O(ny);,例:2n3+4n2logn=O(n3) 证明:logn=O(n) 规则6 4n2logn=O(4n3) 规则3 2n3+4n2logn=O(2n3+4n3) 规则2 2n3+4n3=O(n3) 规则1、多项式定理 2n3+4n2logn=O(n3),4)o,记号,定义1.4 o记号 形式1:对任意正常数c,存在常数n

42、00,使对所有的nn0,有|f(n)| c|g(n)|,则记作:f(n) = o(g(n)。 形式2:若 则记f(n) = o(g(n)。 例:2n = o(n2),但2n2 o(n2),O和o的区别,O: o: 在o表示中,当n趋于无穷时,f(n)相对于g(n)来说已经不重要了。,定义1.5 记号 形式1:对任意正常数c,存在常数n00,使对所有的nn0,有c|g(n)|f(n)| ,则记作: f(n) = (g(n)。 形式2:若 则记f(n) = o(g(n)。 例:n2/2 = (n),但n2/2 (n2),和的区别, : : 在表示中,当n趋于无穷时,f(n)相对于g(n)来说变得任

43、意大了。,1.3 分析结论的证明,当我们有了分析的结论,怎么证明结论是正确的? 有三种常用的方法: 数学归纳法 反证法 反例法,1)数学归纳法,数学归纳法是用来证明某些与自然数有关的数学命题的一种推理方法,有广泛的应用。 已知最早的使用数学归纳法的证明出现于 Francesco Maurolico 的 Arithmeticorum libri duo (1575年)。Maurolico 证明了前 n 个奇数的总和是 n2。,数学归纳法采用递推策略进行命题证明,分为标准的二部分完成: 第一步: 基准情形(递归基础、初始情形、平凡情形) 该部分证明定理对于某个(某些)小的值是正确的,一般证明命题在

44、n=1(n0)时命题成立。这是递推的基础。 第二步:归纳假设和推论的证明 该部分首先假设定理对于直到某个有限数k(或k以内)的所有情况都成立,然后使用这个假设证明定理对于下一个值(通常就是k+1)也成立。如果证明了k+1正确,则完成整个证明。 完成了上述两步,就可下结论:对任何自然数n(或nn0)结论都正确,证毕。,以上两步密切相关,缺一不可。而且证明的关键是n=k+1时命题成立的推证,这是无限递推下去的理论依据,它将判定命题的正确性由特殊推广到一般,使命题的正确性突破了有限而达到无限。,实例:证斐波那契数Fi(5/3)i 这里:F0 = 1,F1 = 1; Fi = Fi-1 + Fi-2,

45、i2 证明: 1. 初始情形 容易验证F1 = 1 5/3、F2=2(5/3)2, 所以,初始情形成立。 2. 归纳假设 设定理对于i = 1,2,k都成立,现证明定理对于i=k+1时也成立,即Fk+1(5/3)k+1。,根据定义有, Fk+1 = Fk + Fk-1 将归纳假设用于等号右边,有 Fk+1 (5/3)k + (5/3)k-1 (3/5)(5/3)k+1 + (3/5)2(5/3)k+1 (3/5+9/25)(5/3)k+1 (24/25)(5/3)k+1 (5/3)k+1 n=k+1时结论成立。 由(1)、(2)知,定理得证。,2)反证法,反证法就是通过假设定理不成立,然后证明该假设将导致某个已知的性质不成立,从而证明假设是错误的而原始命题是正确的。 实例:证明存在无穷多个素数 反证法:假设定理不成立。则将存在最大的素数Pk。 令P1,P2,Pk是依次排列的所有素数,,令 :N= P1P2Pk+1 显然N是比Pk大的数。 思考:N是素数吗? 因为每个整数,或者是素数,或者是素数的乘积,而N均不能被P1,P2,Pk整除,因为用P1,P2,Pk中的任何一个除N总有余数1,所以N是素数。 而NPk,故,与Pk是最大的素数的假设相

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

当前位置:首页 > 研究报告 > 商业贸易


经营许可证编号:宁ICP备18001539号-1