计算机算法:算法与算法分析

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算法与算法分析

计算机与算法有着不可分割的关系,可以说,没有算法就没有计算机,计算机无法独立于算法而存在,因此算法被誉为计算机的灵魂。但是,算法不一定依赖于计算机而存在。算法可以是抽象的,实现算法的主体可以是计算机,也可以是人。只是多数时候,很多算法对于人来说过于复杂,计算工作量太大且常常重复,人脑难以胜任,算法就通过计算机来实现。

1.算法的概念

日常生活中到处都在使用算法,例如,到商店购物,首先确定要购买的东西,然后进行挑选、比较,最后去付款,这一系列活动就是购物的“算法”。算法就是解决问题的方法和步骤。方法不同,对应的步骤自然也不一样。算法设计时,首先应该考虑采用什么方法,确定后再考虑具体的求解步骤。所以,通常把解题过程准确而完整的描述称为解该问题的算法。进一步说,程序就是用计算机语言表达的算法,流程图就是图形化了的算法。程序的目的是加工数据,而如何加工数据是算法的问题。程序是算法与数据结构的统一。

算法是对事物本质的数学抽象,看似深奥却体现着点点滴滴的朴素思想。因此,学习和研究算法能锻炼思维,使思维变得更加清晰、更有逻辑,对日后的学习和生活都会产生深远的影响。

【例1】交换两瓶墨水。有一瓶红墨水、一瓶蓝墨水,现要求把原来装红墨水的瓶子改装蓝墨水,把原来装蓝墨水的瓶子改装红墨水。

【解】这个问题的解决办法是找一个空瓶子来倒腾一下,算法(也就是解决问题的步

骤)如下:

第一步:将红墨水倒入空瓶子中;

第二步:将蓝墨水倒入原来装红墨水的瓶子中;

第三步:将已倒入空瓶子中的红墨水倒入原来装蓝墨水的瓶子中;

第四步:结束。

以上算法是用自然语言来写的,容易理解,但比较繁琐。

如果用变量a表示装有红墨水的瓶子,变量b表示装有蓝墨水的瓶子,变量t表示空瓶子,用符号“←”表示把一个变量的值放入另一个变量中(此处指把一个瓶子中的墨水倒入另一个瓶子中),那么上述算法表示如下:

t ←a

a ←b

b ←t

这就是常用的两个变量交换的算法,这样的算法简洁、明了。

【例2】求s = a + aa + aaa + aaaa + ...... 的值。其中,a是一个数字(0≤a ≤9),n是最后一项中a的个数(n ≽1),a和n的值从键盘输入。

例如,若a = 7,n = 5,则s = 7+77+777+7777+77777。

【解】 这是一个求n 个数据项累加的问题,当输入n 的值后,算法可以用确定循环次数的循环结构实现。设置一个存储累加和的变量s ,其初值为0;设置循环控制变量i 表示求和的项数(i ≤n );设置数据项为t ,其初值为0,在重复执行的循环体中逐次将t * 10 + a 的值累加到变量s 中。

算法流程图如图1所示。

图1 例2的流程图

Y

N

开始

t ←0, s ←0

i ←1

t ←t*10 + a

i ←i+1

输出s 结束

i ≤n 输入a,n s ←s +t

由以上例子可以看出,一个算法由一些操作组成,这些操作是按一定的控制结构所规定的次序执行的。

这些操作包括:①逻辑运算:与、或、非;②算术运算:加、减、乘、除;③数据比较:大于、小于、等于、不等于;④数据传送:输入、输出、赋值。

算法中的每一步都必须能分解成这些基本操作,否则算法是不可行的。算法的功能不仅取决于所选用的操作,还取决于各操作之间的执行次序,即控制结构。任何复杂的算法都可以用顺序、选择、循环三种控制结构组合而成。用流程图可以形象地表示出算法的控制结构。

2.算法的基本特性

著名计算机科学家Knuth把算法的性质归纳为以下五点。

(1)有穷性(Finiteness)

一个算法必须在执行有穷步之后结束,即任何算法必须在有限时间内完成。算法的执行步数是有限的,解必须在有限步内得到,不能出现“死循环”,任何不会终止的算法都是没有意义的。算法执行时间应该合理,这种合理性应该具体问题具体分析。如果一个算法在计算机上要运行上千年,那就失去了实用价值,尽管它是有穷的。

(2)确定性(Definiteness)

组成算法的每个步骤都是确定的、明确无误的。也就是说,算法中的每一步必须有确切的含义,理解时不能产生二义性,不能模棱两可,不能含糊不清。

例如,生活中假定照着菜谱学做菜,这道菜的做法是这样的:

第一步:锅中放入少许油,加花椒爆香;

第二步:放入切好的肉片,煎炒到适当的时候放水;

第三步:煮沸时,加入少量调味品;

第四步:淋入适量香油,出锅。

生活中可以按照这样的菜谱做菜,但让计算机执行这样的“算法”就不行,因为其中有“少许”、“适当”、“少量”、“适量”等不确定性的词汇。如果把这个菜的做法看成一个“算法”,那么这个算法是不满足确定性的。

(3)可行性(Effectiveness)

算法中的每一步操作都应是可以执行的,或者都可以分解成计算机可执行的基本操作。

典型的、不可行的操作如下:

①“公鸡下蛋”式的操作:比如以0做分母,即便在数学中也是不可行的。

②想当然的操作:例如算法中某一步要求方程f(x)=0的根。计算机只是帮助人们计算,至于如何计算这是算法设计者或程序员的事,也就是说,如果我们不知道怎么求解一个问题,计算机也无能为力。

但像两个变量交换这样的算法步骤“A⇔B”是可行的,因为它可以分解成下面三个可执行的基本操作“T⇐A,A⇐B,B⇐T”。

(4)输入(Input)

算法开始前,允许有若干个输入量,也可以没有输入量。

(5)输出(Output)

每种算法必须有确定的结果,产生一个或多个输出。否则,“只开花不结果”的算法是没有意义的。

可见,算法是一个过程,这个过程由一套明确的规则组成,这些规则制定了一个操作的顺序,以便用有限的步骤提供特定类型问题的解答。

相关文档
最新文档