算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
现实世界中问题千奇百怪,算法千变万化,没有通用算法可以解决所有问题。
为了解决某个或某一类问题,需要把指令表示成一定的操作序列,操作序列包含一组操作,每个操作完成特定的功能。
算法的特性输入、输出、有穷性、确定性、可行性。
输入输出:
输入可以是零个或多个,虽然对绝大多数算法,输入参数是必要的,但是个别情况不需要参数,比如打印“hello world”这样的代码不需要任何参数
输出必须是一个或者多个,要不然这个算法没意义了,肯定是要输出的。(输出的形式可以是打印输出,也可以是返回一个值或者多个值)
**有穷性:
**指算法在执行有限步骤后自动结束而不是无限循环,并且要在一个可接受的时间范围内。(要在实际应用中合理有边界)
确定性:
算法的每一步都有确定的含义,不会出现二义性。在一定条件下只有一条执行路径,相同的输入只能有唯一结果(类似函数,一对多,不同的输入可以输出的一样,但是同一个输入输出是固定的)
可行性:
每一步都要可行,每一步都能通过执行有限次数完成。意味着可以上机运行,并得到正确结果。
算法设计的要求
算法并不唯一,解决问题的办法有很多很多种。
正确性: 算法的正确性是指算法至少应当具有输入、输出以及加工处理无歧义性,能正确反映问题的需求、能够得到问题的正确答案。
正确包含四个层次:
1、算法程序没有语法错误。(最基本的要求)
2、算法程序对于合法的输入数据能够产生满足要求的输出结果。
3、算法程序对于非法的输入数据能够得出满足规格说明的结果。
4、算法程序对于精心选择的,甚至刁难的测试数据都有满足要求的输出结果。(最困难,经得起测试的算法)
算法的正确性大部分情况下都不可能用程序来证明,都是用数学方法证明。证明一个算法第四条代价太大,所以我们把层次三作为算法是否正确的标准。
好算法还有一点,可读性。
可读性
算法方便阅读、理解、交流。
晦涩难懂的算法往往隐含错误,不易被发现,并且难于调试和修改。
写代码不仅给计算机看,更是给人看的,所以一定要可读。
健壮性
输入数据不合法也可以处理,而不是产生异常