第2章 算法——程序的靈魂

一個程序主要包括如下兩方面的信息:算法

(1)     對數據的描述。在程序中要指定用到哪些數據以及這些數據的類型和數據的組織形式。這就是數據結構(data structure)。編程

(2)     對操做的描述。即要求計算機進行操做的步驟,也就是算法(algorithm)。數據結構

由著名計算機科學家沃思提出的一個公式:ide

算法(algorithm)+數據結構數據結構(data structure)=程序(program)模塊化

算法、數據結構、程序設計方法和語言工具是一個程序設計人員所應具有的知識。工具

算法是靈魂,數據結構是加工對象,語言是工具,編程須要採用合適的方法。性能

程序中的操做語句,其實是算法的體現。算法是解決「作什麼」和「怎麼作」的問題。編碼

2.1 什麼是算法

爲解決一個問題而採起的方法和步驟,稱之爲「算法」。spa

計算機算法分爲兩大類:數值運算算法和非數值運算算法。設計

數值運算的目的是求數值解;非數值運算包括面十分普遍,常見於事務管理領域。

2.2 簡單的算法舉例

例:求1+2+3……+n

 1 //Method 1:使用循環累加的方法求值
 2 #include <stdio.h>
 3 int main()  4 {  5     int i = 0;            //循環初始量
 6     int N = 1000000;    //循環累加的次數
 7     int sum = 1;        //存放結果的變量
 8     for(i = 1; i <=N; i++)  9  { 10         sum = sum+i; 11  } 12     printf("%d",sum);//輸出打印的結果
13         return 0; 14 }
Method1
 1 //Method2:使用高斯公式求和公式
 2 #include <stdio.h>
 3 int main()  4 {  5     int i = 0;            //循環初始量
 6     int N = 1000000;    //循環累加的次數
 7     int sum = 1;        //存放結果的變量
 8     sum = (i+N)*N/2;    //用高斯公式求和公式的方法
 9     printf("%d",sum);//輸出打印的結果
10         return 0; 11 }
Method2

經過以上兩個運行時間的比較,咱們就能夠得知method2比method1執行的時間更短;能夠推出method2的算法優於method1的算法。固然,在性能較爲好的計算機上,可能差別並不是那麼明顯。可是若是N增長到必定的大數後,差別會顯示出來的,且N越大越容易看出差別。固然這是保證在數據在類型的範圍內。好比int爲-2^31——2^31-1,即-2147483648——2147483647之間。經過這method1和method2的比較,咱們可得知method2算法優於method1算符。

2.3 算法的特性

(1)有窮性。一個算法應包含有限的操做步驟,而不能是無限的。

(2)肯定性。算法中的每個步驟都應當是肯定的,而不該當是含糊的、模棱兩可的。換句話說,算法的含義應當是惟一的,而不該當產生「歧義性」。所謂「歧義性」,是指能夠被理解爲兩種(或多種)的可能含義。

(3)有零個或多個輸入。所謂輸入是指在執行算法時須要從外界取得必要的信息。

(4)有一個或多個輸出。算法的目的是爲了求解,「解」就是輸出。

(5)有效性。算法中的每個步驟都應當能有效地執行,並獲得肯定的結果。如b=0,則執行a/b是不能有效執行的。

2.4 怎樣表示一個算法

2.4.1 用天然語言表示算法

天然語言就是人們平常使用的語言,可使漢語、英語或其餘語言。除了簡單的問題之外,通常不用天然語言表示算法。

2.4.2 用流程圖表示算法

流程圖是用一些圖框表示各類操做。用圖形表示算法,直觀形象,易於理解。流程圖的符號(見圖)

 

菱形框的做用是對一個給定的條件進行判斷,根據給定的條件是否成立決定如何執行其後的操做。

鏈接點(小圓圈)適用於將在不一樣地方的流程線鏈接起來。

2.4.3 三種基本結構和改進的流程圖

1. 傳統流程圖的弊端

   傳統的流程圖用流程線指出各框的執行順序,對流程線的使用沒有嚴格限制。故,使用者能夠不受限制地使流程隨意地轉來轉去,使流程圖變得毫無規律,閱讀室要花很大精力去追蹤流程,詩人難以理解算法的邏輯。

   傳統的流程圖算法又稱爲BS型算法,意爲一碗麪條(a bowl of spaghetti),毫無頭緒。

2. 三種基本結構

(1)順序結構。

(2)選擇結構。選擇結構又稱選取結構或分支結構。

(3)循環結構。又稱重複結構,即反覆執行某一部分的操做。

當型(while型)循環結構。做用是:先判斷條件,再根據條件是否成立,去決定是否執行操做。

直到型(until型)循環結構。做用是:先執行操做,而後再判斷條件是否成立。

以上3中基本結構,有如下的共同特色:

(1)    只有一個入口

(2)    只有一個出口

(3)    結構內的每一部分都有機會被執行到

(4)    結構內不存在「死循環」(無終止的循環)

由以上3中基本結構順序組成的算法結構,能夠解決任何複雜的問題。由基本結構所構成的算法屬於「結構化」算法。

2.4.4 用N-S流程圖表示算法

在這種流程圖中,徹底去掉了帶箭頭的流程線。這種流程圖又稱爲N-S結構化流程圖,又稱盒圖(box diagram),經過如下N-S流程圖和傳統流程圖結構的比較:

   

 

2.4.5 用僞代碼表示算法

爲了設計算法時方便,經常使用一種稱爲僞代碼(pseudo code)的工具。

僞代碼是用介於天然語言和計算機語言之間的文字和符號來描述算法。

例:輸入3個數,打印輸出其中最大的數。可用以下的僞代碼表示:

 1 //僞代碼
 2 Begin(算法開始)  3 
 4 輸入 A,B,C  5 
 6 IF A>B 則 A→Max  7 
 8 不然 B→Max  9 
10 IF C>Max 則 C→Max 11 
12 Print Max 13 
14 End (算法結束)
pseudo code

2.4.6 用計算機語言表示算法

設計算法的目的是爲了實現算法。故,不只僅要考慮如何設計一個算法,也要考慮如何實現一個算法。若,只是設計出算法,可是該算法不易實現,則該算法無心義。

2.5 結構化程序設計方法

用3中基本結構組成的程序必然是結構化的程序。

具體說,採用如下方法保證獲得結構化的程序:

(1)     自頂向下;

(2)     逐步細化;

(3)     模塊化設計;

(4)     結構化編碼;

重要的思想是,要使用「自頂向下,逐步細化」的思想。

劃分子模塊時應該注意模塊的獨立性,即便用一個模塊完成一個功能,耦合性愈少愈好。

在設計好一個結構化的算法以後,要善於進行結構化編碼(coding)。所謂編碼就是講已設計好的算法用計算機語言表示。

相關文章
相關標籤/搜索