date: 2021-12-28
期末复习系列
《The Design and Analysis of Algorithms》Anany Levitin 著 潘彦 译
第一章 绪论
1.1 算法
算法:一系列解决问题的明确指令 【对于符合一定规范的输入,能够在有限时间内获得要求的输出】
要点:
- 算法的每一步都不能有 歧义
- 必须认真确定算法所处理的 输入的值域
- 同一算法可以用几种不同的形式来描述
- 同一问题可能存在几种不同的算法
- 同一问题的不同解法,解题速度可能也显著不同
举例:
最大公约数算法:
- 欧几里得算法
gcd(m,n)=gcd(n,m mod n)
,因为gcd(m,0)=m
所以m最后的取值即是 m和n初值的最大公约数。 - 连续整数检测算法
[不能处理其中一个input是0的情况] - 中学算法
[注意:该方法用 埃式筛法来处理质数序列的话,是无法处理一个及以上input是1的情况的(1不是质数) ]
参照之前整理的 质数相关Blog
1.2 算法问题求解基础
算法是问题的程序化 解决方案(获得答案的精确指令)
理解问题
算法的输入 确定了该算法所解问题的一个实例(instance)
严格确定算法需要处理的实例范围是非常重要的 [例如上面的三种最大公约数算法,它们能够处理的实例范围是不同的]
正确的算法要能够正确处理 所有合法的输入 [特例、边界值]
了解计算设备的性能
计算机主流:冯诺依曼体系结构 (其根本:随机存取机RAM)
它的主要假设是:指令逐条运行,每次执行一步操作。 =>
设计在这种机器上运行的算法称为 顺序算法
=> 一些更新式计算机打破了RAM模型的假设,能够在同一时间执行多条操作 并行计算
,能够利用这种计算能力的算法称为 并行算法
对于某些 需要处理海量数据的 非常复杂的问题 /处理 对时间很敏感 的应用,需要考虑计算机系统的速度和存储限制。[一般作为科学实验 可以不用]
精确解法和近似解法之间的权衡
精确算法:
近似算法:某些重要问题无法求得精确解(eg.求平方根/解非线性方程/求定积分);问题所具有的固有复杂性,导致计算很慢(eg.某问题涉及数量庞大的选择)。
一个近似算法可以作为更复杂精确算法的一部分
算法的正确性证明
算法的描述:文字 / 伪代码
算法的正确性证明:必须证明对于每一合法输入,该算法都会在有限的时间内输出一个需要的结果。
证明正确性的一般方法是使用 数学归纳法 ,因为算法的迭代过程本就符合这种证明所需要的一系列步骤。
对于近似算法的正确性证明,我们通常试图证明该算法所产生的 误差不超出预定义的范围 。
算法的分析
算法需要具备的几个重要特性:正确性、效率(时间效率、空间效率)、简单性、一般性。
时间效率:算法运行有多快 空间效率:算法需要多少 额外(除了存储算法本身,另外需要的空间) 的存储空间
一般性:1.算法所解决问题的一般性 2. 算法所接受的输入的一般性
1.3 重要问题类型
排序算法
两个特性:
- 稳定性
如果一个排序算法保留了等值元素在输入中的 相对顺序 ,就是 稳定的。 - 在位性
如果一个算法 不需要 额外的存储空间(除了个别存储单元外),就是在位的。
查找
对于查找而言,也没有一种算法在任何情况下都是最优的。有些算法速度快,但是需要更多的存储空间;有些算法速度非常快,但仅适用于有序数组。
图问题
基本的图算法包括:图的遍历算法、最短路算法、有向图的拓扑排序。
两个经典问题:旅行商问题(找出访问n个城市的最短路径,并保证每个城市只访问一次)、图着色问题(用最少种类的颜色为图中的顶点填色,并保证邻接顶点的颜色不同)
几何问题
两个经典问题:最近点对问题(求给定平面上的n个点中 距离最近 的两个点)、凸包问题(找一个能把给定集合中所有点都包含在里面的最小凸多边形)。
数值问题
对于大多数 例如解方程组、求定积分、求函数值等 涉及连续性的数学问题,我们都只能求近似解。
困难:这类问题一般都要操作实数,而实数在计算机内部只能近似表示。且对近似数的大量算数操作可能会将大量 舍入误差 叠加起来,导致非常糟糕的结果。
1.4 基本数据结构