算法与程序设计:算法的表述方式及其发展(学习笔记)

通俗来讲,算法是定义如何完成一个任务的若干步骤的集合。算法的精髓在于时间和空间的结合,时间是指由于运算采用了该种算法,使程序运行的时间大大的减少,空间是指由于运算采用该种算法,使程序运行时所占用的内存减少。真正好的算法是即考虑时间也考虑时间的,也就是考虑两者的平衡点。

算法与程序设计

“算法”的中文最早出现在中国汉代的数学名著《周髀算经》中,而在西方,真正推动算法传播的是一个居住在巴格达的阿拉伯人Al Khwarizmi,他引进了印度更为先进的十进制数字系统,使得数学计算行为有规可循。计算机科学的核心就是对算法的研究。在一个计算机能够执行任务之前,必须给出一个算法精确地告诉计算机做什么。因此,算法的研究是计算机科学的基石。在程序设计中,程序员设计程序就是为了完成特定的任务,而程序的基础就是算法,程序设计就是将所选择的算法翻译成计算机能够使用的某种语言的过程,算法又通过程序来实现。因此,算法与程序设计是分不开的。

算法概念分析

由于科学必须建立在定义明确的术语之上,算法有自己的正式定义,即**算法是定义一个可终止过程的一组无歧义的、可执行的步骤的有序集合。**对此定义进行分析,我们可以得到算法的以下特点:
(1)有限性:从“可终止”三字可见,一个算法的执行必须能够最终结束,因而算法必须能在任何条件下通过有限步骤完成并终止。
(2)确定性:从“无歧义”三字可见,在算法的执行过程中,正在被处理的信息必须足以唯一地、完整地确定每一步所需要的动作,每个步骤必须清晰无歧义。
(3)有效性:从“可执行”三字可见,算法的每一个步骤都要可以清晰执行,原则上可以用人工代替,人能通过有限的操作运算完成。
(4)结构性:从“有序”两字可见,一个算法的各个步骤必须有一个就执行顺序而言非常明确的结构,其步骤是按照因果关系联结起来的。
除此之外,一个算法还需要输入项(具备零个或以上的输入数据)和输出项(最少需要一个输出)。

综上可知,算法有两个要素,一是数据对象的运算和操作,一个计算机的基本运算和操作有算术运算、逻辑运算、关系运算和数据传输;二是算法的控制结构,一个算法功能结构不止取决于所选用的操作,而且还与各操作之间的执行顺序有关。

算法的本质是抽象的,我们可以用不同的方法表述一个算法,但它的逻辑本身是不变的。要理解算法的来源,就要去理解问题的求解过程。我们将数学家波利亚列出的问题求解阶段移植到程序开发中来,可以得到程序员求解问题时的思路:
(1)理解问题。
(2)得到一个算法函数如何求解这个问题的思路。
(3)系统地阐述这个算法并用程序将其表达出来。
(4)从准确性及其是否具有潜力作为一个工具解决其他问题这两个方面来评估这个程序。
由此可见,算法的最终生成取决于我们对问题的理解。一个好的算法,源于对问题准确且富有开创性的理解。当今流行的递归法、贪心算法、分治法、动态规划法等等,无不是这一方面的体现。

算法的表述方法

算法的表述方法主要分为自然语言、流程图、N-S图、PAD图和伪代码这五种。

自然语言

使用我们日常的自然语言来描述算法的步骤,例如:“如果a>b,那就把a的至赋给b,否则把b的值赋给a。”

优点——方法容易掌握。
缺点——自然语言表示的算法不便翻译成计算机程序设计语言。

当算法比较复杂时表述难度增加,还很容易造成歧义。在计算机程序中要求每个步骤准确无二义性,用自然语言的方法不是很恰当。

流程图

使用特定的图形符号加上说明来表示算法的处理步骤,目前十分流行。常见的符号如下:

优点—— 直观、无歧义性、易于理解。
缺点—— 所占篇幅较大、允许灵活不受约束使用流程线易造成程序阅读和修改上的困难。

N-S图

又称“盒式图”,1973年由美国学者I.Nassi和B.Shneiderman提出的一种新的流程图形式。这种流程图去掉了流程线,算法的每一步都用一个矩形框来描述,把一个个矩形框按执行的次序连接起来就是一个完整的算法描述。在N-S图中,每个处理步骤是用一个“矩形盒子”表示的,处理步骤可以是语句或语句序列,必要时“矩形盒子”中还可以嵌套另一个“矩形盒子”,嵌套的深度一般没有限制。
常见的三种形态为:
(1)顺序:每个处理按次序执行。

(2)分支选择:按是否满足条件(结果的真假值)选择执行哪个处理。

(3)循环:分先测循环和后测循环,前者是先判断满足条件才执行处理,后者是先执行处理再判断条件是否满足。

优点——形象直观、具有良好的理解度、易学易用。由于只能从上边进入“矩形盒子”后并从“矩形盒子”下边出来,限制了控制的随意转移,保证了程序的良好结构更好地体现结构化程序设计的思想。
缺点——修改比较麻烦。

PAD图

由日本学者二村良彦等人在1974年提出的一种主要用于描述软件详细设计的图形表示工具。与N-S图一样,PAD图只能描述结构化程序允许使用的几种基本结构。


优点——它用二位树形结构图表示程序的控制流,遵循机械的走树规则就能方便地编写出程序,比较容易转换为程序代码。
缺点——不如流程图易于执行。

伪代码

一般而言,伪代码是一种在算法开发过程中非正式表达思想的符号系统,是一种接近于计算机编程语言的算法描述方法,是一种用来书写程序或描述算法时使用的非正式、透明的表述方法。它并非是一种编程语言,这种方法针对的是一台虚拟的计算机,通常采用自然语言短语、数学公式和符号来描述算法的操作步骤,同时采用计算机高级语言(如C语言)的控制结构来描述算法步骤的执行顺序。伪代码必须有一种一致且简洁的用来表示循环语义结构的表示法,常常用于算法考虑阶段,不涉及具体语言实现,用于实际编码过程之前表达程序的逻辑,是设计师和程序员的工具。

Begin
输入A房间、B房间、C房间的容纳人数
	If A>B then
		Max <- A
	Else
		Max <- B
	If C>Max then
		Max <- C
	Print Max
End

优点——非正式但更加直观,结构清晰,可读性好。
缺点——需要事先说明表示规则,否则可能难以阅读。

算法描述的发展现状

自世界上第一个算法——欧几里得算法出现以来,人们不断总结创造出新的算法,算法开始被广泛运用于各行各业。为便于与人交流,人们探索各种描述语言来对设计出的算法进行精确高效的表达。早期人们多使用自然语言,但由于其存在语境不明等的缺陷,德国工程师楚泽率先使用计算机语言来描述算法。计算机语言比自然语言严谨,但由于其自身语法上的限制而灵活性不足,这促成了伪语言的诞生,它是一种既保留计算机语言的严谨性又适当添加功能或放宽限制的类语言。

目前被广为使用的算法描述语言是流程图和伪代码。流程图直观便于理解,但在复杂算法中占用篇幅较大,不太适用于程序员间的交流。为提高阅读效率,需要伪代码作为补充。伪代码可以使被描述的算法容易被任何一种编程语言实现,使得所有的程序员都能理解。此外,现在的算法描述语言还有自己的一套语法,它主要由符号与表达式、赋值语句、控制转移语句、循环语句、其他语句构成,符号命名、数学及逻辑表达式一般与程序书写一致,赋值用箭头表示,语句可有标识,标识可以是数字或者具有实际意义的单词。

如果文章内容出错或者您有更好的解决方法,欢迎到评论区指正和讨论!

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值