无论是学习C语言,还是学习Java语言,都离不开算法。那么什么是算法呢?它又能做些什么呢?之前在我学习这个的时候也很疑惑算法对于语言开发的重要性,后来才发现算法对一门开发语言的学习还是很重要的。
下面我从问题的角度来分析什么是算法?
算法是解决问题的方法和步骤,在生活中,大多数都能涉及到算法。如洗衣机的操作指南,一道菜谱等。还记得春晚的一个小品么,“把大象装冰箱总共分几步”。第一步,把冰箱门打开;第二步,把大象装进去;第三步,把冰箱门盖上。这三步就是把大象装进冰箱的算法。
严格地说,算法是对特定问题求解步骤的一种描述,是指令的有限序列。一般的,一个问题的算法并不唯一,可能有很多种,一个给定的算法解决一个特定的问题。
在计算机领域中,算法应具有以下特性 :
(1)输入
一个算法应有零个或多个输入,输入是在执行算法时需要从外界取得必要的信息即算法所需的初始量等一些信息 。
(2)输出
一个算法有一个或多个输出,编写程序的目的就是要得到一个结果,输出就是算法最终所求的结果。
(3)有穷性
一个算法必须在执行有穷步之后结束且每一步都可在有穷时间内完成,不能无限的执行下去。例如要编写一个由小到大整数累加的程序,这时候要注意一定要设一个整数的最上限,也就是加到那个数为止,若没有这个最上限,那么程序将无终止的运行下去,也就是常说的死循环。
(4)确定性
算法的每一个步骤都应当是确切定义的,对于每一个过程不能有二义性,将要执行的每个动作必须严格而清楚的规定。并且,在任何条件下,对于相同的输入只能得到相同的输出。
(5)可行性
算法中的每一步都应当能有效的运行,也就是说算法应是可行的,并要求最终得到正确的结果。
针对一个问题可能会有不同的算法去解决,不同的算法思路不同,有的执行起来就会很慢,效率就很低,有的就会很快,效率自然会很高。这样,就出现了算法的“好”与“坏”之分,如何衡量一个算法的好坏,通常要从以下几个方面来分析 :
(1)正确性
算法能满足具体问题的需求,即对任何合法的输入算法都会得出正确的结果 。
(2)可读性
算法创建后由人来阅读、理解、使用以及修改。所以可读性的好坏直接影响到算法的好坏。如果一个算法涉及的想法很多,人就会糊涂,那么这个算法就不能更好的交流和推广使用,自然对修改、扩展、维护就更不方便。所以要提高算法的可读性,让其简明易懂。
(3)健壮性
一个程序完成后,运行该程序的用户对程序的理解各有不同,并不能保证每一个人都能按照要求进行输入,健壮性就是指对非法输入的抵抗能力,当输入的数据非法时,算法能识别并做出处理,而不会因为输入的错误产生错误动作或造成瘫痪 。
(4)时间复杂度与空间复杂度
时间复杂度简单的说就是算法运行所需要的时间。不同的算法具有不同的时间复杂度,当一个程序较小时感觉不到时间复杂度的重要性,当一个程序特别大时便会察觉到时间复杂度实际上是十分重要的。所以如何写出更高速的算法一直是算法不断改进的目标。空间复杂度是指算法运行所需的存储空间的多少,随着计算机硬件的发展,空间复杂度已经显得不再那么重要。
算法设计者必须将自己设计的算法清楚的、正确的按步骤记录下来,这个过程就叫描述算法。为了让算法清晰易懂,需要选择一种良好的描述方法,算法的描述方法有很多,其中常用的有自然语言,流程图,N-S流程图等。
一.自然语言
自然语言就是日常生活中的语言,一般描述一些简单问题步骤可以通俗易懂。下面通过具体实例来介绍自然语言。
例 任意输入三个数,求这三个数中的最大数。
第一步:定义四个变量分别为x、y、z以及max。
第二步:输入大小不同的三个数分别赋给x、y、z。
第三步:判断x是否大于y,如果大于,则将x的值赋给max,否则将y的值赋给max。
第四步:判断max是否大于z,如果大于,则执行步骤五,否则将z的值赋给max。
第五步:将max的值输出。
二.流程图
流程图是一种传统的算法表示法,它用一些图框来代表各种不同性质的操作,用流程线来指示算法的执行方向。
首先介绍一下流程图符号:
例 求两个整数a和b的最大公约数。流程图如下:
五.伪代码
伪代码是介于自然语言和计算机语言之间的文字和符号来描述算法。它采用某一程序设计语言的基本语法,如操作指令可以结合自然语言来设计。而且,它不用符号,书写方便,没有固定的语法和格式,具有很大的随意性,便于向程序过渡。
例 用伪代码描述n!
开始
如果n=0,输出s=1;
如果n>0,
s=1,i=1;
循环直到i>n
s=s*i;
i=i+1;
输出s;
结束
伪代码虽然不是一种实际的编程语言,但表达能力上类似编程语言,同时避免了描述技术细节带来的麻烦,所以伪代码更适合描述算法,故被称作“算法语言”或“第一语言”。
好了关于算法就总结到这里了,这是个人整理的笔记,分享给需要的小伙伴,借鉴《C开发宝典书籍》欢迎进行评论和讨论!