数据结构与算法笔记之--算法绪论

来源:互联网 发布:js对象数组转json 编辑:程序博客网 时间:2024/05/18 02:07

算法定义

解决特定问题求解步骤的描述,再计算机中变现为指令的有限序列,并且每一条指令表示一个或多个操作。

算法其实就是解决问题的方法,在定义中,提到了指令,指令能被人或者计算机等计算装置执行。他可以是计算机指令,也可以是我们平时的语言文字。

算法的特性(五个特性:输入、输出、有穷性、确定性、可行性)

1.输入、输出

算法具有零个或者多个输入,算法至少有一个或者多个输出。

对于绝大多数算法输入参数都是必要的,要想某个算法处理某些数据,或者解决某些问题,当然就要把待处理的数据或者问题的关键元素传它,但对于个别情况,如打印"Hello World!"这样的代码,就不需要任何参数输入,所以算法输入,可以是零个或者多个。算法是需要输出的,如果算法不输出,那这个算法就没有存在的意义,输出的形式可以是打印输出,也可以是返回一个或者多个值。

2.有穷性

指算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成。

如果代码中有死循环,这个算法即便执行到世界毁灭,也没有意义,当然就不符合有穷性啦,另外,一个算法没有死循环,但是执行一次要个十年二十年,这样的算法虽然有穷,但是。。。睡觉,这都不算是符合有穷性。

3.确定性

指算法的每一步骤都具有确定的含义,不会出现二义性。

这个很好理解,举个栗子,中国人说“父亲”,指的就是爹,歪果仁说“Father”,既可以指他爹,也可以指。。。emmmmmm。。。教堂神父疑问,总之就是同一个

算法,对同一个问题,只有一个输出结果,这就符合确定性啦。

4.可行性

算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限的次数完成。

算法的每一条指令都能被正确执行,并且能得到正确的结果。

算法设计的要求(四个设计要求:正确性、可读性、健壮性、时间效率高和存储量低)

1.正确性

指算法至少应该具有输入、输出和加工处理无歧义性、能正确反映问题的需求、能够得到问题的答案。

这个简单理解,不正确无法执行的程序代码就不能叫算法,详细一点理解,分这么几点:没有语法错误对于合法输入要能够产生满足要求的输出结果对于非法的输入数据能够得出满足规格的输出结果(比如,有一个程序,你输入两个数字让它们相加,但是有的人就是喜欢搞事,输入了两个汉字进去,那你是对这种非法输入做监控判断,然后提示他输入有误重新输入来的好得意,还是直接程序奔溃报出异常,让别人鄙视你的代码垃圾来的好尴尬)、对于精心选择甚至刁难的测试数据都要有满足要求的输出结果。鲁迅曾经说过,泰山崩于前,我自有妙计挡之得意,我们要做到游刃有余嘛大笑

2.可读性

算法设计的另一目的是为了便于阅读、理解和交流。

一句话,让别人容易看懂,自己以后回头也容易看懂,才有利于同行之间的理解和交流。不要有“我写的代码,别人越看不懂,越证明我技术比别人屌”的想法,比如你写一篇作文,别人理解不了你写的东西,有两种情况,一是,别人读完以后,理解不了你那种深邃的意境,二是,你的字写的。。。,别人根本就没法读。前者不说,要是后者,emmmmmmm。。。尴尬

3.健壮性

当输入数据不合法时,算法也能做相关处理,而不是产生异常或莫名奇妙的结果。

4.时间效率高和存储量低

设计算法应该尽量满足时间效率高和储存量低的需求。

时间效率,指的是对于同一个问题,如果有多个算法能够解决,执行时间短的算法效率高,反之算法效率低。存储量,主要指的是程序运行时所占用的内存空间或者外部硬盘储存空间。在生活中,人们总是希望,用最少的钱,花最少的时间,办成最大的事,算法也是一样,用最短的时间,占用最少的内存空间,办成同样的事就是好算法。时间效率和空间占用率的衡量,在下一篇,数据结构与算法笔记之--时间复杂度和空间复杂度 中会详细介绍。



END********************************************************************************************************************************************************

与君共勉之!

原创粉丝点击