算法是为解决某一问题的一系列清晰指令,也就是说,能够对符合一定规范的输入,在有限时间内获得所要求的输出。
二、算法的性质:
1)输入:有0个以上的输入
2)输出:至少有1个输出
3)确定性:指令清晰、无歧义
4)有限性:指令执行次数有限,时间有限
5)有效性:指令具有可行性
一个好的算法是反复努力和重新修正的结果,这是一条规律
三、算法问题求解:
1 理解问题
2 了解计算设备的性能
顺序算法 v.s. 并行算法 机器运行速度、存储容量
3 在精确解法和近似解法间做先择
精确算法 v.s. 近似算法 问题的固有特点、时间复杂度
4 确定适当的数据结构
有些算法的确需要基于一些精心设计的数据结构
5 算法设计技术
算法设计技术(也称为“策略”或者“范例”)是用算法解题的一般性方法,用于解决不同计算领域的多种问题。
6 详细表述算法的方法
我们一旦设计了一个算法,就需要用一定的方式对其进行详细描述。伪代码、自然语言、流程图、程序设计语言、N-S图
7 证明算法的正确性
必须证明对于每一个合法输入,该算法都会在有限的时间内输出一个满足要求的结果。 正确 v.s. 不正确 精确算法 v.s. 近似算法
8 分析算法
时间效率、空间效率、简单性、一般性。时间效率显示了算法运行得有多快;而空间效率则显示了算法需要多额外的存储空间。
9 为算法写代码
形式化验证 v.s. 测试 代码优化 什么样的算法是最优的?
四、重要问题类型
1.排序
排序算法有两个特性特别值得一提。如果一个排序算法保留了等值元素在输入中的相对顺序,它被称为是稳定的。第二个特性是算法需要的额外储空间。如果一个算法除了个别存储单元以外,不需要额外存储空间,我们把它称为是在位的。
2. 查找
查找问题涉及到从给定的集合(或者是多重集,它允许几个元素具有相同的值)中找寻一个给定的值,称为查找键 对于查找来说,也没有一种算法对于任何情况都是最适合的。
4.图问题
基本的图算法包括图的遍历算法(如何能一次访问到网络中的所有节点)、最短路线算法(两个城市之间的最佳路线是哪条?)以及有向图的拓扑排序(一系列过程的前提条件是相互一致的还是自相矛盾的?)
5.组合问题
旅行商问题和图填色问题都是组合问题的特例。
组合问题都是计算领域中最难的问题。这是出于以下原因:第一,通常,随着问题规模的增大,组合对象的数量增长极快,即使是中等大小的实例,其组合的规模也会达不可思议的数量级。第二,还没有一种已知算法能在可接受的时间内,精确地解决绝大多数这类问题。
6. 几何问题
几何算法处理类似于点、线、多面体这样的几何对象。只讨论两个经典的计算几何问题:最近对问题和凸包问题。
7. 数值问题
数值问题,另一个广阔的具体应用领域,涉及具有连续性的数学对象问题:像解方程和方程组、计算定积分以及求函数的值等等。
五、基本数据结构:
1.线性数据结构: 线性列表-栈和队列
2.图
3.树
4.集合与字典:
就是从集合中查找一个给定元素、增加新元素和删除一个元素。一个能够实现这三种操作的数据结构称为字典。