- Java常用算法手冊(第3版)
- 宋娟
- 1897字
- 2020-06-23 15:32:48
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。從這個例子可以看出,偽代碼表示很靈活,但又高度接近編程語言。程序員可以根據這段偽代碼和某種編程語言的語法特點進行修改,從而得到真正可執行的程序代碼。
在使用偽代碼時,描述應該結構清晰、代碼簡單、可讀性好,這樣才能夠更有利于算法的表示。否則,將適得其反,讓人很難懂,就失去偽代碼表示的意義了。