算法是什么,即是按照一定的步骤,一步步去解决某个问题,解决问题的方法步骤就称为算法。
基本设计要求:
一、正确性
算法的正确性是指算法至少具有输入,输出和加工处理无歧义,并且可以正确反映问题的需求,以及正确得到问题的答案。
关于“正确”的理解一共有四个层次:
- 算法程序没有语法错误。
- 算法程序能够根据正确的输入的值得到满足要求的输出结果。
- 算法程序能够根据错误的输入的值得到满足规格说明的输出结果。
- 算法程序对于精心设计的,极其刁难的测试数据都能满足要求的输出结果。
第四点比较难,因为我们几乎不可能对所有的情况都逐一进行验证,所以,一般来说,能够满足前3条就是一个正确性比较好的算法了。
二、可读性
算法设计的另一个目的是为了便于阅读,理解和沟通,如果写的代码只有你和上帝能看懂,那这个算法只能说明很失败,因为算法越难理解,就越难找到他的bug,对于调试和修改就更难了
三、健壮性
当输入的数据不合法的时候,算法也能给出相关的处理,而不是产生异常或者莫名起码的错误。
四、时间效率高和空间存储量低
在满足以上几点以后,我们还可以考虑对算法程序进一步优化,尽量满足时间效率高和空间存储量低的需求。
基本设计思想:
一、分治
分治,分而治之。将一个难以直接解决的大问题,划分成一些规模较小的子问题,以便各个击破。
需要注意子问题的两个规则:
1、平衡子问题:就是是各个子问题的规模大致相同
2、独立子问题:各子问题之间相互独立,如果不独立,还需要分解子问题。
二、贪心
把一个复杂问题分解成一系列较为简单的局部最优选择,每一步选择都是对当前解的一个拓展,直到获得问题的完整解,典型应用是求解最优化问题,而且对许多问题都能得到整天最优解。贪心法并不是从整体最优考虑,它所作出的选择只是在某种意义上的局部最优。典型应用:最小生成树问题,Prime算法(最近定点策略),Kruskal算法(最短边策略),背包问题(按单位重量价值最大策略贪心),霍夫曼编码等。
三、动态规划
动态规划法和分治法类似,它也是将大问题分解成子问题求解,不同的是,如果分解的子问题有很多是相同的,采用分治法相同的子问题会求解多次,是不是很影响效率;动态规划法呢,它会保存已解决的子问题的答案,再有相同的子问题直接用保存的答案就行了,节省了很多计算时间。