算法=程序+数据结构
同样的问题往往可以用多种算法来解决。(中学时代作文指导老师经常说:“答案是丰富多彩的”。很多生活中的事情都是这样的)
例如:求两个数的最大公约数:
(1)欧几里得算法:gcd(m,n)=gcd(n,m%n)当m%n==0时,”n“的值即是所求。
(2)连续整数检测算法:当一个输入为0时候,就会出错
- 将min{m,n}赋值给t
- m/t,如果余数为0,进入第三步,否则进入第四步
- n/t,如果余数为0,则t就是所求,否则进入第四步
- 将t-1,返回第二步
(3)中学时代的公共质因数算法
- 找到m的所有质因数
- 找到n的所有质因数
- 找出m和n的所有公因式
- 将公因式相乘即得所求。
如何求解质因数:
利用“埃拉托色筛选法”:
- 初始化2~n的连续数列
- 第i个循环中消去i的倍数
- 直到序列中没有可消的元素为止,挣下的整数便是质数序列。
现在已经有许多改进版本的“埃拉托色筛选法”。这里便不再一一赘述了。
算法求解问题基础:
- 对于给定的问题有完全的理解(考虑特殊情况;了解已有的算法的优缺点等)
- 了解计算设备的性能(输入为海量数据;对于时间敏感的应用;...)
- 在精确解法和近似解法中做出选择(有时近似算法可以作为精确算法的一部分)
- 算法的设计技术(分治法;蛮力法;变治法;减治法;...)
- 确定适当的数据结构
- 对算法进行描述(文字,伪代码,流程图...)
- 算法正确性的证明(数学归纳法;反向迭代法;近似算法的误差不超出预定义的范围即可)
- 算法分析(时间复杂度;空间复杂度;简单性;一般性)
- 为算法写代码(一个好的算法是不断修正的结果)
重要的问题类型
- 排序(对键排序:稳定(各自先后顺序不变);在位(不占用额外的存储空间))
- 查找(寻找查找键)
- 字符串处理(字符串匹配等问题)
- 图问题(遍历;最短路线;有向图的拓扑排序;旅行商;图填色问题等)
- 组合问题
- 几何问题(最近对问题;凸包文图等)
- 数值问题(实数在计算机中只能近似表示,则近似数的大量计算可能使舍入的误差叠加,结果歪曲)
基本的数据结构
- 线性数据结构:数组、链表、栈和队列...
- 图(邻接矩阵;邻接链表)
- 树
- 集合与字典