对计算机算法的认识
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
对计算机算法的认识
【摘要】随着计算机的发展和普及,我们现在越来越依赖计算机帮我们完成各种工作,通常我们会设计一些程序来解决问题,一个程序通常是由算法和数据结构共同构成,算法是用来解决“做什么”和“怎么做”的问题,它是一个程序的灵魂,只有明确清晰地知道解决问题的方法,我们才能设计解决步骤,才能完整地解决问题。算法可以是纯理论的,也可以由一个计算机程序实现。
【关键字】算法、概念、性质、设计
一、引言
算法是一个既熟悉又陌生的概念,说熟悉是因为我们从小就开始接触它,例如小学就学习的四则运算法则是先乘除后加减,有括号的要先运算括号里的;竖式的笔算方法、珠算口诀等都可以称作算法;我们从A地去到B地也要走一定的路线,此路线实际上也是一种算法;我们生活中的很多事情都要按照一定的步骤去做,虽然我们有时没有察觉,但是这些步骤其实就是一种算法。说陌生是因为算法的概念是人们在长期的科学探索中不断总结和提炼出来的,算法的多样性使得算法相当的灵活,而且他也是在不断地发展中的,所以要想完全地掌握算法是很难的。
在现代,特别是计算机迅猛发展的时期,算法更是被运用到了计算机的工作中。计算机可以解决很多问题,但是这并不是它本身的作用,必须是由人类给出解决问题的算法步骤,将其变成计算机指令,通过计算机的运算来解决这些问题,所以说算法在计算机中扮演一个相当重要的角色。我们只有深刻地认识到算法的概念,了解多种不同的算法,才能更好地将其运用,使计算机更好的为我们服务。
二、算法的概念
简单来说,算法是一系列解决问题的清晰指令。
举个例子:我们要从天津去上海,我们可以选择坐飞机、火车等方式,我们希望所花时间和金钱最少,假如我们选择做火车,我们可以制定下述步骤:
第一步:查看列车时刻表;
第二步:在列车时刻表中寻找是否有直接从天津到上海的直达车,如果有,我们可以选择该车,则任务完成;
第三步:如果没有,查找所有经过天津的列车,记录下来;
第四步:查找所有经过上海的列车,记录下来;
第五步:将第三、四步查找出来的信息整合,找出重合的交叉点,这个交叉点就是中转站A,我们可以从天津到A,再从A到上海。
这样的出行方法实际也是一种算法,我们选择“做什么”的方式是坐火车,接下来的步骤是在阐述“怎么做”,所以总结一下,算法实际就是对“做什么”和“怎么做”解决方案。
算法不是我们随便想怎么写就怎么写的,算法还具有几个基本特征:①有穷性:既是一个算法包含有限的操作步骤,不能是无限的。如上例,我们不能总是停留在不停地中转当中,应该是要在一定时间内到达目的地的。②确定性:算法的结果必须是正确的。在上例中,如果我们设计的路线不能到达上海,则该算法不具有正确性.。③有效性:算法的每一步都是有用处的。④输入及输出:输入原始数据,输出结果.。像上例中,所有经过天津上海的列车都算是算法的输入数据,而我们得到的出行路线则是输出。我们在脑子里勾画出算法了,但还需要清晰地表达出来,这就涉及到一个算法表示的问题,通常来说,算法有三种表示方法,一是用汉语、英语等自然语言表示,这种方式通俗易懂,但是也具有很大的缺陷,既是文字冗长,很容易出现歧义,而且输入到计算机中似乎也是有点不切实际。由于这种方法的不足,我们进行改进,产生了流程图法和伪码法等。就我们学习而言,
我们使用流程图法较多,顾名思义,流程图就是将算法的步骤一步一步按顺序表示出来,是算法的执行过程,我们可以应用一下来表示上例中的算法:
计算机是无法识别流程图和伪代码的,因此我们还需将其转化成计算机语言程序才能真正实现解题。
三、算法的设计
我们对算法的基本知识有初步的了解后,就可以试着去写一个算法,设计算法的方法有很多种,对于不同的题目要求我们要应用不同的方法以达到快速高效地解决问题。首先了解一些常用的算法:
1、列举法
所谓列举法就是根据提出的问题,把所有可能的情况列举出来,再用题目中的条件来检查哪些是合格的列举,哪些是不合格的,列举的算法原理简单易懂也比较好用,但是当情况很多
的时候用列举法就显的费力不讨好,工作量太大,效率太低了,因此我们要尽量优化方案以减少工作量。许多实际问题是不可能用人工列举的,但是计算机可以,这得力于它的运算速度快,擅长重复操作。虽然此方法比较笨拙,但是局部使用还是很有效的。著名的百鸡问题就是运用穷举法的一个典型。
2、递推法
所谓递推法是从初始条件出发,逐次推出过程中间结果,从而得到最后结果。其实递推在我们学数学时就非常常用,我们一般会去建立一种递推关系,它是一种变量与变量之间的特殊关系。这就好比我们破案,我们一般找到一个点,然后根据这个点顺瓜摸藤,一步一步深入挖掘隐藏的信息。例如求5的阶乘。
#include
Main()
{int I,t;
T=1;
I=2;
While(i<=5)
{t=t*I;
I=i+1;
}
Printf(“%d\n”,t);} 从上面的程序可以看到,递推算法中运用到了一个循环累乘的方法,这也是通常我们在运用递推算法时多用到的循环迭代的方法。
3、递归法
所谓递归法是一种升级的递推法,程序调用自身的编程技巧。它通常把一个大的问题通过层层分解转化为小的、与原问题相似的问题来解决。这样减少了工作量,加大了工作效率。
在计算Fibonacci数列第N项,即fib(0)=0,fib(1)=1,fib(n)=fib(n-1)+fib(n-2)
递归算法分为递推和回归两个方面。首先进行递推,讲复杂的问题变成简单的类似问题求解,
如上例中要求fib(n)的值,将其变成求fib(n-1)和fib(n-2)的值,而计算fib(n-1)的值又要推成求fib(n-2)和fib(n-3)的值,如此反复,最终推成求fib(i)和fib(0 )的值,在递推阶段必须要结束,得到一个值。在回归阶段,得到解后回归到原问题上来。就如上例,将fib(0)和fib(1)的值得到fib(2)的值。。最终得到fib(n)的值。
4、分治法
所谓分治法其本质也是将复杂问题简单化,将一个大问题分解成俩个或两个以上的子问题,再将子问题分解成更小的子问题,直到最后能够很容易的解决子问题,再将这些子问题的解合并。人们发现最好在分解子问题时将子问题的规模分解的相当,这样更有利于问题的解决。另外值得注意的是合并是分治法的关键所在,有些问题合并方法明显,有些问题方法复杂,不可一概而论,我们需要根据具体情况具体分析。如利用二分法求方程的实根时,过程如下:首先取定区间中点;然后判段中点的函数值是否为零,若为零,则中点即为所求根;若不是,则将原区间减半,在减半后的区间内进行同样的判定,直到找到根为止。
5、回溯法
回溯法是一种选优的探索方法,我们按照一定条件向前探索达到目的,但是当搜索到某一步时发现原先的选择并不是最好的时候,我们又回去重新进行选择。。这个方法是没有固定什么事最优的,最优的是根据我们摸索得出的,这个方法费时较多。如八皇后问题就是一个典型的运用回溯法的题。