Java常用算法手册(第3版)
上QQ阅读APP看书,第一时间看更新

1.3 算法的表示

算法是为了解决实际问题的,问题简单,算法也简单;问题复杂,算法也相应复杂。为了便于交流和进行算法处理,往往需要将算法进行描述,即算法的表示。一般来说,算法可以采用自然语言表示、流程图表示、N-S图表示和伪代码表示。

1.3.1 自然语言表示

所谓自然语言,就是自然地随文化演化的语言,如英语、汉语等。通俗地讲,自然语言就是人们平时口头描述的语言。对于一些简单的算法,可以采用自然语言来口头描述算法的执行过程,如前面的统筹安排事件的例子。

但是,随着需求的发展,很多算法都比较复杂,很难用自然语言描述,同时自然语言的表述烦琐难懂,不利于发展和交流。因此,需要采用其他的方法来进行表示。

其实,我国古代早期的算法也可以看作自然语言表示。正是由于这种复杂、烦琐的自然语言表示,大大阻碍了中国古代算法的发展。这也正是为何我国古代算法起源早,但后来落后于西方国家的原因。

1.3.2 流程图表示

流程图是用一种图形表示算法流程的方法,其由一些图框和流程线组成,如图1-3所示。其中,图框表示各种操作的类型,图框中的说明文字和符号表示该操作的内容,流程线表示操作的先后次序。

流程图最大的优点是简单直观、便于理解,在计算机算法领域有着广泛的应用。例如,计算两个输入数据a和b的最大值,可以采用图1-4所示的流程图来表示。

图1-3 流程图的图元

图1-4 求最大值的流程图

在实际使用中,一般采用如下三种流程结构。

1)顺序结构

顺序结构是最简单的一种流程结构,简单地一个接着一个地进行处理,如图1-5所示。一般来说,顺序结构适合于简单的算法。

2)分支结构

分支结构常用于根据某个条件来决定算法的走向,如图1-6所示。这里首先判断条件P,如果P成立,则执行B;否则执行A,然后再继续下面的算法。分支结构有时也称为条件结构。

图1-5 顺序结构

图1-6 分支结构

3)循环结构

循环结构常用于需要反复执行的算法操作,按照循环的方式,可以分为当型循环结构和直到型循环结构,分别如图1-7和图1-8所示。

图1-7 当型循环结构

图1-8 直到型循环结构

当型循环结构和直到型循环结构的区别如下:

・当型循环结构先对条件进行判断,然后再执行,一般采用while语句来实现;

・直到型循环结构先执行,然后再对条件进行判断,一般采用until、do…while语句来实现。

注意:无论当型循环结构还是直到型循环结构,都需要进行合适的处理,以保证能够跳出循环;否则构成死循环是没有任何意义的。

一般来说,采用上述三种流程结构,可以完成所有的算法任务。通过合理安排流程结构,可以构成结构化的程序,这样便于算法程序的开发和交流。

1.3.3 N-S图表示

N-S图也称为盒图或者CHAPIN图,1973年由美国学者I.Nassi和B.Shneiderman提出。他们发现采用流程图可以清楚地表示算法或程序的运行过程,但其中的流程线并不是必需的,因此而创立了N-S图。在N-S图中,将整个程序写在一个大框图内,这个大框图由若干个小的基本框图构成。采用N-S图也可以方便地表示流程图的内容。

采用N-S图表示的顺序结构,如图1-9所示。采用N-S图表示的分支结构,如图1-10所示。采用N-S图表示的当型循环结构,如图1-11所示。采用N-S图表示的直到型循环结构,如图1-12所示。

图1-9 顺序结构

图1-10 分支结构

图1-11 当型循环结构

图1-12 直到型循环结构

1.3.4 伪代码表示

伪代码(Pseudocode)是另外一种算法描述的方式。伪代码并非真正的程序代码,其介于自然语言和编程语言之间。因此,伪代码并不能在计算机中运行。使用伪代码的目的是将算法描述成一种类似于编程语言的形式,如C、C++、Java、Pascal等。这样,程序员便可以很容易理解算法的结构,再根据编程语言的语法特点,稍加修改,即可实现一个真正的算法程序。

能够使用伪代码的一个重要原因是C语言的广泛应用,其他语言(例如C++、Java、C#等)大都借鉴了C语言的语法特点。这些编程语言在很大程度上都和C语言类似,例如,都采用if语言表示条件分支和判断,采用for语句、while语句表示循环等。因此,可以利用这些共性来描述算法,而忽略编程语言之间的差异。

在使用伪代码表示算法时,程序员可以使用自然语言来进行表述,也可以采用简化的编程语句来表示,相当灵活。不过,为了编程代码的交流和重利用,程序员还是应该尽可能地将其表述清楚。

下面举一个简单的伪代码表示的程序代码的例子。

程序结束

在上述代码中,演示的是求两个数据最大值的伪代码。首先将输入的数据分别赋值给变量a和变量b,然后通过if语句进行判断,将最大者赋值给变量max,最后输出变量max。从这个例子可以看出,伪代码表示很灵活,但又高度接近编程语言。程序员可以根据这段伪代码和某种编程语言的语法特点进行修改,从而得到真正可执行的程序代码。

在使用伪代码时,描述应该结构清晰、代码简单、可读性好,这样才能够更有利于算法的表示。否则,将适得其反,让人很难懂,就失去伪代码表示的意义了。