算法是对执行的计算过程的具体描述。简单点说,算法就是解决问题的方法步骤。
在编程中,算法通常是由类方法或者函数来实现的。比如之前提到的数据结构异同图,上面有些数据结构搜索快,插入和删除慢,有些数据结构搜索慢,但是插入和删除快,这些其实都是因为实现这些数据结构的算法不同造成的。
算法的性质
一个算法必须满足下面的条件:
(1)有穷性。一个算法必须总是在执行有穷步之后结束,且每一步都可在有穷时间内完成。
(2)确定性。算法中每一条指令必须有确切的含义读者理解时不会产生二义性。并且,在任何条件下,算法只有唯一的一条执行路径,即对于相同的输入只能得出相同的输出。
(3)可行性。一个算法是能行的,即算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现的。
(4)输入。零个或多个的输入。
(5)输出。一个或多个的输出。
算法设计的原则
通常设计一个“好”的算法应考虑达到以下目标:
(1)正确性。对于合法输入能够得到满足的结果;算法能够处理非法处理,并得到合理结果;算法对于边界数据和压力数据都能得到满足的结果。
(2)可读性。算法要方便阅读,理解和交流,只有自己能看得懂,其它人都看不懂,谈和好算法。
(3)健壮性。算法不应该产生莫名其妙的结果,一会儿正确,一会儿又是其它结果。
(4)高性价比,效率与低存储量需求。利用最少的时间和资源得到满足要求的结果,可以通过(时间复杂度和空间复杂度来判定)
前面三点 正确性,可读性和健壮性相信都好理解。对于第四点算法的执行效率和存储量,我们知道比较算法的时候,可能会说“A算法比B算法快两倍”之类的话,但实际上这种说法没有任何意义。因为当数据项个数发生变化时,A算法和B算法的效率比例也会发生变化,比如数据项增加了50%,可能A算法比B算法快,但是如果数据项减少了50%,可能A算法和B算法速度一样。所以描述算法的速度必须要和数据项的个数联系起来。也就是“大O”表示法,它是一种算法复杂度的相对表示方式,后面会根据具体的算法来描述。
算法的存储量,包括:1.程序本身所占空间;2.输入数据所占空间;3.辅助变量所占空间。一个算法的效率越高越好,而存储量是越低越好。
算法和程序的区别和联系
在很多人认为,程序就是算法或者算法就是程序。其实这都是不完全正确的说法。
程序是指完成某些事物的一种既定方式和过程,可以将程序看成是一系列动作的执行过程的描述。在百度百科中,计算机程序被定义为“一组指示计算机执行动作或做出判断的指令,通常用某种程序设计语言编写,运行于某种目标体系结构上”
如果通过文字难以理解,下面我们举例说明,比如餐厅打卡机的流程,如下图:
以上打卡机中的处理程序就是计算机程序,它需要执行下述动作和指令完成一次打卡操作:
(1) 接受输入的餐费金额
(2) 读取卡内金额
(3) 判断卡内金额是否大于餐费金额
(4) 如果卡内金额小于餐费金额,给出余额不足提示
(5) 如果卡内金额大于餐费金额,将卡内金额减去餐费金额后,回写到卡内
从打卡机的流程分析,可以知道程序是用来解决问题的,是由多个步骤或过程组成的,这些步骤和过程就是解决问题的算法。
算法是解决问题的步骤;程序是算法的代码实现算法要依靠程序来完成功能;程序需要算法作为灵魂。
程序是结果,算法是手段(为编写出好程序所使用的运算方法)。同样编写一个功能的程序,使用不同的算法可以让程序的体积、效率差很多。所以算法是编程的精华所在。
算法总结
通过上述,我们介绍了算法的概念以及它和计算机程序的关系。算法和程序都是指令的有限序列 ,但是:程序是算法,而算法不一定是程序。
应用程序=算法+数据结构。在应用程序设计中,算法是核心,算法的好坏很大程度上决定了一个程序的效率。一个好的算法可以降低程序运行的时间复杂度和空间复杂度。先选出一个好的算法,再配合以一种适宜的数据结构,这样程序的效率会大大提高。
由此看来,算法也是一门思想,它教我们“更高效的解决问题”。