算法问题求解步骤:
- 理解问题:试着手工处理一些小规模的例子,考虑一些特殊的情况;严格确定需要算法处理的实例范围
- 了解设备的性能:顺序算法or并行算法
- 在精确解法和近似解法之间做出选择
- 算法的设计技术
- 确定适当的数据结构
- 算法的描述
- 算法的正确性证明:算法的正确性证明一般使用数学归纳法
- 算法的分析:时间效率和空间效率。算法应该具有的另一个特性是简单性、一般性。
- 为算法写代码
算法的几类基本问题
- 排序
- 查找
- 字符串处理
- 图问题
- 组合问题
- 几何问题
- 数值问题
排序
排序问题是非常重要的,目前已经有几十种不同类型的排序算法,具有不同的特性。注意排序算法的两个特性需要考虑:
稳定性:如果一个排序算法那保留了等值的元素在输入中的位置,就可以叫稳定的。这种特性非常重要。
原位的:如果一个排序算法不需要额外的存储空间,则叫原位的。
查找
查找问题是在给定的集合中查找给定的值。有许多查找算法,比如顺序查找、折半查找等。查找算法没有所谓的稳定性问题,但是面临一些新的问题。必须结合问题仔细选择数据结构和算法,以便达到性能的平衡。特别是对于特大型数据,如何组织数据结构是重大的挑战。
字符串处理
是指在文本中查找给定的值,即字符串匹配问题。
图问题
基本的图算法包括:
- 图的遍历算法
- 最短路径算法
- 有向图的拓扑排序
有一些图问题在计算上非常困难,包括:旅行商问题和图填色问题。
组合问题
从一个排列、组合或者子集中寻找一个组合对象,使得它满足我们需要的特性。
组合问题的难点在于:1.随着问题规模的扩大,组合对象的数量增长极快;2.还没有一种算法能在可以接受的时间内精确解决大多数组合问题。
几何问题
两个经典的计算几何问题:最近对问题和凸包问题
数值问题
涉及连续性的数学问题:解方程、计算定积分、求函数值等
由于实数在计算机内部只能近似表示,对近似数的大量操作导致的舍入误差会累积,导致结果严重歪曲。
基本的数据结构
包括数组、链表、图、树、字典。
单链表、双链表
队列:先进先出
栈:后进先出
图的表示:邻接矩阵、邻接链表
有序树:每一顶点中所有子女都是有序的。比如二叉树。
集合:集合的合并问题