第1章 算法与程序

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

1.3 算法的设计与评价
1.3.1 1.3.2 1.3.3 1.3.4 评价算法的标准 算法的环路复杂度 算法的时空效率 常见的算法设计方法
算法的环路复杂度
算法的复杂性很大程度上取决于控制流程的复杂性。 单一的顺序结构最简单; 循环结构和选择结构所构成的环路越多算法就越复 杂。 基于这一种观点,针对算法的流程图表示,我们先 介绍算法的环路复杂度的概念和度量方法。
评价算法的“简洁性 ”标 准
所设计出来的算法要尽可能地简洁。 对于同一问题所设计的不同算法,越简洁明了的 越好。 越简洁的算法可读性越好,越易于理解、编码和 调试、测试,越受人们欢迎。
评价算法的标准(续)
在评价一个算法时,要对这五个方面综合考虑,不 要片面追求某一指标。 有些指标之间往往是相互制约的,如时间效率与空 间效率,简洁性与高效性等等; 要学会针对具体问题要求和软硬件实现环境进行综 合平衡,设计出满足需要的好算法。
算法与数据结构
第1章
算法与程序
第1章 算法与程序
1.1 1.2 1.3 1.4 算法的基本概念 算法的表示 算法的设计与评价 算法与程序
1.1 算法的基本概念
1.1.1 什么是算法 1.1.2 算法的基本特性
什么是算法
早在公元前300年左右出现的著名的欧几里德算法, 就描述了求解两个整数的最大公因子的解题步骤。 要求解的问题描述为:“给定两个正整数m和n,求 它们的最大公因子,即能同时整除m和n的最大整 数”。欧几里德当时给出的算法如下: ⑴ 以n除m,并令所得余数为r(必有r<n); ⑵ 若r=0,输出结果n,算法结束;否则继续步 骤⑶; ⑶ 令m=n和n=r,返回步骤⑴继续进行。
流程图表示举例
欧几里德算法的流程图描述如图1-1所示
begin 读入m,n m mod n→r r=0 no N→m, r→n yes m,n为正整数,算法求 其最大公因子
输出n end 图1-1 欧几里德算法的流程图表示
流程图表示(续)
同自然语言相比,用流程图描述算法直观,可以一目了然; 算法步骤间用流程线连接,次序关系清楚,容易理解;可以很 方便地表示顺序、选择和循环结构,不依赖于任何计算机和计 算机程序设计语言,有利于不同环境下的程序设计。但是,流 程图也还存在一些缺点,诸如:
1.1.1 什么是算法 1.1.2 算法的基本特性
算法的基本特性
输入(Input) 输出(Output) 确定性(Definiteness) 有穷性(Finiteness) 有效性(Effectiveness)
第1章 算法与程序
1.1 1.2 1.3 1.4 算法的基本概念 算法的表示 算法的设计与评价 算法与程序
第1章 算法与程序
1.1 1.2 1.3 1.4 算法的基本概念 算法的表示 算法的设计与评价 算法与程序
1.3 算法的设计与评价
1.3.1 1.3.2 1.3.3 1.3.4 评价算法的标准 算法的环路复杂度 算法的时空效率 常见的算法设计方法
评价算法的标准
评价一个算法优劣的五条标准:
正确性 可读性 健壮性 高效性 简洁性
程序语言表示(续)
和自然语言一样,计算机程序设计语言也是串行 的描述,很不直观。 对于较复杂的问题,人们很难用计算机程序设计 语言直接写出程序。 所以在算法设计阶段,一般是先采用某个专用的 辅助工具来描述算法,在算法设计好之后,再把 它转化为某一具体程序设计语言描述的程序。
程序语言表示(续)
作为例子,下面我们给出欧几里德算法的C语言描 述如下:
评价算法的“正确性”标准(续)
在将算法用程序语言表示为特定语言的程序后还 必须注意:
程序中不含有语法错误; 对于一切合法的输入数据,程序能够产生满足要求的输 出结果; 对于一切非法的输入数据,程序能够得出满足规格说明 的结果; 对于精心选择的,甚至是带有刁难性的典型测试数据, 程序都有满足要求的输出结果。
不易于表示算法的层次结构; 不易于表示数据结构和模块调用关系等重要信息; 容易使人过早地考虑算法的控制流程,而忽视算法的全局结构; 用流程线代表控制流,控制转移随意性较大。若对流程线的使 用不加限制,随着求解问题规模和复杂度的增加,流程图会变得 很复杂,使人难以阅读、理解和修改,从而使算法的可靠性难以 保证。
#include ”stdio.h” main() {int m,n,r; printf(“请输入两个正整数:”); scanf(“%d%d”,&m,&n); printf(“\n%d和%d的最大公约数是:”,m,n); r=m%n; while(r!=0) {m=n; n=r; 运行结果: r=m%n; 请输入两个正整数:56 32 } printf(“%d\n”,n); 56和32的最大公约数是:8 }
什么是算法(续)
由此,我们可以得出这样的结论,算法就是求解问题 的方法和步骤。这里的方法和步骤是一组严格定义了 运算顺序的规则;每一个规则都是有效的,且是明确 的;按此顺序将在有限次数下终止。 有关算法(Algorithm)一词的定义不少,但其内 涵基本上是一致的。最为著名的定义是计算机科学家 D.E.Kunth在其巨著《计算机程序的艺术》( Art of Computer Program)第一卷中所做的有关描述。其 非形式化的定义是: 一个算法,就是一个有穷规则的集合,其中之规则 定义了一个解决某一特定类型问题的运算序列。
Βιβλιοθήκη Baidu
N—S图表示(续)
N-S图的基本图形符号如下:
A B
顺序结构,由两个或多个矩形框组成。其中A和B可以是基本操 作,也可以是其它基本结构(如选择结构,循环结构)。
T P F 选择结构,当条件P成立时执行操作A,否则执行操作B。 A B
当P
A A 直到P
当型循环结构。当条件P成立时反复执行操作A,直到条件P不 成立时止。
自然语言存在着歧义性,容易导致算法的不确定性; 自然语言容易冗长,使得描述不够简洁; 自然语言的表示形式是顺序的,描述分支选择和转移时 不够直观; 自然语言与计算机程序设计语言的差别较大,不易转换 为程序。
1.2 算法的表示
1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 自然语言表示 流程图表示 N—S图表示 伪代码表示 程序语言表示
图1-2 欧几里德算法的N-S图表示
1.2 算法的表示
1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 自然语言表示 流程图表示 N—S图表示 伪代码表示 程序语言表示
伪代码表示
伪代码是介乎于自然语言和计算机程序语言之间的一 种表示算法的工具。 它用文字和符号描述问题的求解方法和步骤而不使 用图形符号。 如同一篇文章自上而下书写,每行写一个基本操作, 而用若干行写出一个基本结构。 因而书写方便,格式紧凑,清晰易读好理解,也更 容易转化为某一计算机程序语言表示的程序。 和图形工具相比较,便于修改,但直观性能较弱。
1.2 算法的表示
1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 自然语言表示 流程图表示 N—S图表示 伪代码表示 程序语言表示
自然语言表示
自然语言即人们日常使用的语言,如汉语、英语、 日语、法语、德语等等。使用自然语言描述算法, 人们比较容易接受和理解。如前面的欧几里德算法 就是用自然语言描述的。然而,自然语言也具有许 多缺点,在使用自然语言描述算法时一定要引起注 意:
程序语言表示
计算机程序设计语言,是计算机能够接受、理解 和执行的算法描述工具。 计算机不能直接识别自然语言、流程图、N-S图和 伪代码等工具描述的算法,而设计算法的目的就 是要用计算机来解决问题,算法最终都要用某一 具体的计算机程序设计语言来表示。 从这个意义上讲,流程图、N-S图和伪代码都仅仅 是为了求解问题而设计算法时的辅助工具。 为了更好更准确地描述算法,人们使用图形或表 格还创造了许多专用的算法设计辅助工具,如PAD 图、判定表、数据流图、Warnier-Orr图等等。
1.2 算法的表示
1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 自然语言表示 流程图表示 N—S图表示 伪代码表示 程序语言表示
N—S图表示
为了克服传统流程图的缺点,1973年美国学者纳斯 (I.Nassi)和施内德曼(B.Shneiderman)提出了一 种表示算法的较好工具——N-S图。 它独立于任何计算机和计算机语言,又能很方便地转 换为计算机语言程序; 它去掉了流程线全部用矩形方框来描述,限制了算法 流程转移控制的随意性,又节省了篇幅; 它很容易表示算法中的嵌套关系和模块中的层次关系, 功能域可以从框图中直接反映出来; 它仍是图形工具,阅读起来直观、明确、容易理解。
评价算法的“可读性”标 准
表示出来的算法要能够方便地供人们阅读、理解和 交流。 算法的可读性好是保证正确性的前提,良好的可读 性有利于人们理解算法思想,减少出错机会,便于 检查和修改。 可适当地增加注释,增强算法或程序的可读性。
评价算法的“健壮性”标 准
算法对意外情况的反映能力要强。 当输入数据非法、0作除数、负数开平方等,算法 应能做出相应的处理,给出错误信息或终止算法执 行,避免产生错误的或莫明其妙的输出结果。
流程图表示
流程图是描述算法的图形工具,它采用如下所示 的一组图形符号来表示算法:
起止框,表示算法的开始或结束;只有一个入口或一个出口。 输入输出框,表示算法中数据信息的输入和输出;有一个入口 和一个出口。 判断框,表示条件判断;有一个入口和多个出口。 处理框,表示算法中的一个(或一组)运算或处理;有一个入 口和一个出口。 流程线,表示算法中各步骤之间的次序关系。 连接点,表示算法中的连接位置,主要用于同一算法在不同页 描述时的接续等情况。 注释框,用于对算法中某些操作的注释说明。
直到型循环结构。反复执行操作A,直到条件P成立时止。
N—S图表示举例
由于N-S图象一个多层的盒子,所以也称作盒图。 用N-S图表示欧几里德算法如图1-2所示。
读入正整数m,n m mod n→r 当r≠0反复做 n→m, r→n m mod n→r 输出最大公因子n (a)当型循环结构实现 读入正整数m,n m→r n→m, r→n m mod n→r 直到r=0时止 输出最大公因子n (b)直到型循环结构实现
伪代码表示(续)
下面,我们给出欧几里德算法的一种伪代码描述如下: Begin(算法开始) Read(m,n) m mod n→r while r≠0 do {n→m r→n m mod n→r } write(n) End(算法结束)
1.2 算法的表示
1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 自然语言表示 流程图表示 N—S图表示 伪代码表示 程序语言表示
一个好的算法是满足这五条标准要求的算法。
评价算法的“正确性”标 准
所设计出来的算法要能够正确求解给定的问题。 这就要求算法中的每一个步骤的描述是准确无歧 义的,并且是可以执行的; 要求算法能够满足问题要求,并在有限步骤内获 得结果; 否则就不具备正确性要求,更谈不上解决给定的 实际问题了。 算法要能经得起一切可能的输入数据的考验。
一个算法是对于任何的输入元素x,都在有穷步骤内 终止的一个计算方法。 在算法的形式化定义中,对任何一个元素x∈I,x均 满足性质 x0=x,xk+1=F(xk),(k≥0) 该性质表示任何一个输入元素x均为一个计算序列, 即x0,x1,x2,…,xk;该序列在第k步结束计算。
1.1 算法的基本概念
评价算法的“高效性”标 准
算法的执行效率要高。 算法的效率可分为时间效率和空间效率。
时间效率是通过该算法转化的程序在计算机上运行的时 间耗费来确定,在算法设计与分析阶段用执行基本操作的 次数(是问题规模的函数)相对于问题规模的渐近阶来表 示。 空间效率主要考虑除存储数据结构之外的辅助存储空间。 一个高效算法是指执行算法耗费时间少,使用辅助存储空 间小的算法。
什么是算法(续)
算法的形式化定义如下所述: 算法是一个四元组,即(Q,I, ,F)。 其中:
Q是一个包含子集I和 的集合,它表示计算的状态; I表示计算的输入集合; 表示计算的输出集合; F表示计算的规则,它是由Q至它自身的函数,且具有自 反性,即对任何一个元素q∈ Q,有F(q)=q。
什么是算法(续)
相关文档
最新文档