算法导论
1.4 算法分析的基本原则
– – – – – – 例:在n个不同的数中找最大的数。 基本运算:比较 算法:Find Max 输入:数组A,项数 n 输出:A中的最大项 int FindMax(int* L, int n){ 1) int max = A[0]; 2) for(int k=1; k<n; ++k) 3) if(max<A[k]) max = A[k]; 4) return max; 5) } – 行3的比较进行n-1次, 故W(n) = n-1。
1.5 算法复杂性分析
• 函数的渐进性态与渐进表达式:一般来说, 当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。
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*)达到TMax(N)的合法输入;I-是DN中使T(N, I-) 达到TMin(N)的合法输入;而P(I)是在算法的应用中 出现输入I的概率。
1.3 描述算法与算法设计
• 问题求解(Problem Solving)
理解问题
精确解或近似解 选择数据结构 算法设计策略
设计算法 证明正确性 分析算法 设计程序
1.4 算法分析的基本原则
1. 正确性
– 定义:在给定有效输入后,算法经过有限时间的计算并 产生正确的答案,就称算法是正确的。 – 正确性证明的内容:
1.1 算法与程序
• 程序:
– 程序是算法用某种程序设计语言的具体实现。 – 程序可以不满足算法的性质(4)即有限性。 – 例如操作系统,是一个在无限循环中执行的程序, 因而不是一个算法。操作系统的各种任务可看成 是单独的问题,每一个问题由操作系统中的一个 子程序通过特定的算法来实现。该子程序得到输 出结果后便终止。
• 平均情况:设A是解某个问题的算法,如果在解这个 问题的算法类中没有其它算法在平均情况下的时间 复杂性比A在平均情况下的时间复杂性低,则称A是 解这个问题在平均情况下的最优算法。
1.4 算法分析的基本原则
5. 最优性 – 寻找最优算法的途径 (以最坏情况下的最优性为例) • 设计算法A,求W(n)。相当于对问题给出最坏情况下 的一个上界。 • 寻找函数F(n),使得对任何算法都存在一个规模为n 的输入并且该算法在这个输入下至少要做F(n)次基本 运算。 相当于对问题给出最坏情况下所需基本运算 次数的一个下界。 • 如果W(n)=F(n),则A是最优的。 • 如果W(n)>F(n),A不是最优的或者F(n)的下界过低。 – 改进A或设计新算法A’使得W’(n)<W(n)。 – 重新证明新下界F’(n)使得F’(n)>F(n)。 – 重复以上两步,最终得到W’(n) = F’(n)为止。
关于本课程
• 第五章 回溯法 掌握利用回溯法解决问题的基本思想,掌握回溯法的算法 的设计要点。 主要内容:回溯法的算法框架、符号,三角形问题,n个皇 后问题,最大团问题,图的m着色问题,旅行售货员问题, 圆排列问题,连续邮资问题,电路板排列问题。 • 第六章 分支限界法 理解分支限界法的基本思想,掌握典型示例中分支限界法 的应用技巧。 课程主要内容:分支限界的基本思想,单源最短路径,布 线问题,0-1背包问题,批处理作业调度问题。
• 算法设计与分析是计算机科学技术中处于核 心地位的一般专业基础课。本课程首先介绍 算法的一般概念和算法复杂性的分析方法, 学会如何评价算法的好坏;接着重点介绍常 用的算法设计技术及相应的经典算法,旨在 帮助完成从“会编程序”到“编好程序”的 角色转变,提高实际求解问题的能力。
关于本课程
• 第一章 算法概述 了解算法的计算复杂性分析方法,理解算法分析 的基本理论,掌握算法分析的基本概念。 • 第二章 递归与分治法 掌握递归的概念,学会用递归方法解决实际问题, 掌握利用分治法解决问题的基本思想。 课程主要内容:递归概念,分治法基本思想,二 分搜索技术,大整数乘法,矩阵乘法等。
– 程序正确性证明的方法:
• •
1.4 算法分析的基本原则
2. 工作量——时间复杂性分析
–
–
计量工作量的标准: 对于给定问题,该算法所执行的基 本运算的次数。 基本运算的选择:根据问题选择适当的基本运算。
问题 在表中查找x 实矩阵相乘 排序 遍历二叉树
基本运算 比较 实数乘法 比较 置指针
1.4 算法分析的基本原则
• 3)非紧上界记号o
• o(g(n)) = { f(n) | 对于任何正常数c>0,存在正数和n0 >0使得对所有n
n0有:0 f(n)<cg(n) } • 等价于 f(n) / g(n) 0 ,as n。
• (4)非紧下界记号
• (g(n)) = { f(n) | 对于任何正常数c>0,存在正数和n0 >0使得对所有n
• 算法+数据结构=程序
1.3 描述算法与算法设计
• 描述算法可以有多种方式,如自然语言方式、图形 表格方式等。在这里,我们将采用C++语言来描述 算法。 • C++语言的优点是类型丰富、语句精炼,具有面向 对象和面向过程的双重优点。 • 用C++来描述算法可使整个算法结构紧凑、可读性 强。 • 算法设计方法主要有:分治策略、动态规划、贪心 算法、回溯法、分支限界等,我们将在后面的章节 中陆续介绍。
算法复杂性 = 算法所需要的计算机资源 算法的时间复杂性T(n);算法的空间复杂性S(n)。 其中n是问题的规模(输入大小)。
1.5 算法复杂性分析
TMax ( N ) maxT ( N , I ) max ti ei ( N , I ) ti ei ( N , I *) T ( N , I *)
关于本课程
• 第三章 动态规划 理解动态规划算法的设计思想,掌握利用动态规划方法解 决问题的基本思想,掌握动态规划算法的设计要点。 课程主要内容:动态规划的基本要素,矩阵连乘,最长公 共子序列,最大子段和,凸多边形最优三角剖分,多边形 游戏,图像压缩,电路布线,0-1背包问题等。 • 第四章 贪心算法 了解贪心算法的理论基础,掌握利用贪心算法解决问题的 基本思想,掌握贪心算法的设计要点。 课程主要内容:贪心算法的基本要素,活动安排问题,最 优装载,哈夫曼编码,单源最短路径等。
关于本课程
• 课程目的: 计算机算法设计与分析导引
– 以算法设计为主,介绍算法设计的主要方法和基本思想;并简要介绍算法 分析概念 – 不是程序设计课,也不是数学课
• 考查形式: 上课考勤+作业(=30%)+期末测试(70%) 教材 计算机算法设计与分析(第3版)王晓东 编著 电子工业出版社 • 参考资料: 陈慧南编著,《算法设计与分析--C++语言描述》,电子工业出版社, 2006年5月 Thomas H.Cormen,Charles E.Leiserson,Ronald L.Rivest,Clifford Stein《算法导论》机械工业出版社 sahni 数据结构、算法与应用 — C++ 语言描述 机械工业出版社
• 计算机的有限资源促使人们关注程序的执行性能, 进而催生了计算机算法这一研究领域。自上世纪60 年代开始至今,已出现了大量解决不同问题的有效 算法。由于属于同一问题类的不同问题之间具有相 似性,其解决算法也具有一定的共性,因此产生了 一般的算法设计技术,如递归技术、分治、动态规 划、贪心、图的遍历、回溯、分支限界等。
3. 占用空间——空间复杂性分析
– 两种占用:
• • • • 存储程序和输入数据的空间 存储中间结果或操作单元所占用空间——额外空间 存储程序的空间一般是常数(和输入规模无关) 输入数据空间为输入规模O(n)
– 影响空间的主要因素:
– 空间复杂性考虑的是额外空间的大小 – 如果额外空间相对于输入规模是常数,称为原 地工作的算法。
1.4 算法分析的基本原则
4. 简单性
– 含义:算法简单,程序结构简单。 – 好处:
• • 容易验证正确性 便于程序调试
– 简单的算法效率不一定高。要在保证一定效率 的前提下力求得到简单的算法。
1.4 算法分析的基本原则
5. 最优性 – 含义:指求解某类问题中效率最高的算法 – 两种最优性 • 最坏情况:设A是解某个问题的算法,如果在解这个 问题的算法类中没有其它算法在最坏情况下的时间 复杂性比A在最坏情况下的时间复杂性低,则称A是 解这个问题在最坏情况下的最优算法。
1.5 算法复杂性分析
• 算法复杂性是算法运行所需要的计算机资源的量, 需要时间资源的量称为时间复杂性,需要的空间资 源的量称为空间复杂性。这个量应该只依赖于算法 要解的问题的规模、算法的输入和算法本身的函数。 如果分别用N、I和A表示算法要解问题的规模、算 法的输入和算法本身,而且用C表示复杂性,那么, 应该有C=F(N,I,A)。 • 一般把时间复杂性和空间复杂性分开,并分别用T 和S来表示,则有: T=T(N,I)和S=S(N,I) 。(通常, 让A隐含在复杂性函数名当中)
• • 方法的正确性证明——算法思路的正确性。证明一系列与算法 的工作对象有关的引理、定理以及公式。 程序的正确性证明——证明所给出的一系列指令确实做了所要 求的工作。 大型程序的正确性证明——可以将它分解为小的相互独立的互 不相交的模块,分别验证。 小模块程序可以使用以下方法验证:数学归纳法、软件形式方 法等。