對于給定的問題,一個計算機算法就是用計算機求解這個問題的方法。一般來說,算法是由有限條指令構成,每條指令規定了計算機所要行的有限次運算或者操作。對于一個問題,如果可以通過一個計算機程序,在有限的存儲空間內運行有限長的時間而得到正確的結果,則稱這個問題是算法可解的。但算法不等于程序,也不等于計算方法。當然,程序也可以作為算法的一種描述,但程序通常還需考慮很多與方法和分析無關的細節問題,這是因為在編寫程序時要受到計算機系統運行環境的限制。通常,程序的編制不可能優于算法的設計。
算法的基本特征作為一個算法,一般應具有以下幾個基本特征。
- 可行性(effectiveness) 針對實際問題設計的算法,人們總是希望能夠得到滿意的結果。但一個算法又總是在某個特定的計算工具上執行的,因此,算法在執行過程中往往要受到計算工具的 限制,使執行結果產生偏差。例如,在進行數值運算時,如果某計算工具有7位有效數字(如程序設計語言中的單精度運算),則在計算下列三個量A=1012,B=1,C= —1012的和時,如果采用不同的運算順序,就會得到不同的結果,即:A+B+C=1012+1+(—1012)=0?? A+C+B=1012+(—1012)+1=1 而在數學上,A+B+C與A+C+B是完全等價的。因此,算法與計算公式是有差別的。在設計一個算法時,必須考慮它的可行性,否則是不會得到滿意結果的。
- 確定性 (definiteness)算 法的確定性,是指算法中的每一個步驟都必須是有明確定義的,不允許有模棱兩可的解釋,也不允許有多義性。這一性質也反映了算法與數學公式的明顯差別。在解 決實際問題時,可能會出現這樣的情況:針對某種特殊問題,數學公式是正確的,但按此數學公式設計的計算過程可能會使計算機系統無所適從。這是因為根據數學 公式設計的計算過程只考慮了正常使用的情況,而當出現異常情況時,此計算過程就不能適應了。
- 有窮性 (finiteness) 算法的有窮性,是指算法必須能在有限的時間內做完,即算法必須能在執行有限個步驟之后終止。數學中的無窮級數,在實際計算時只能取有限項,即計算無窮級數值的過程只能是有窮的。因此,一個數的無窮級數表示只是一個計算公式,而根據精度要求確定的計算過程才是有窮的算法。算法的有窮性還應該包括合理的執行時間的含義。因為,如果一個算法需要執行千萬年,顯然失去了實用價值。
- 擁有足夠的情報 一個算法是否有效,還取決于為算法所提供的情報是否足夠。通常,算法中的各種運算總是要施加到各個運算對象上,而這些運算對象又可能具有某種初始狀態,這 是算法執行的起點或者是依據。因此,一個算法執行的結果總是與輸入的初始數據有關,不同的輸入將會有不同的結果輸出。當輸入不夠或輸入錯誤時,算法本身也 就無法執行或導致執行有錯。一般來說,當算法擁有足夠的情報時,此算法才是有效的,而當提供的情報不夠時,算法可能無效。
綜上所述,所謂算法,是一組嚴謹的定義運算順序的規則,并且每一個規則都是有效的,且是明確的,此順序將在有限的次數下終止。
算法的基本要素 一個算法通常有兩種基本要素組成:一是對數據對象的運算和操作,二是算法的控制結構。
1. 算法中對數據的運算和操作: 每個算法實際上是按解題要求從環境能進行的所有操作中選擇合適的操作所組成的一組指令序列。因此,計算機算法就是計算機能處理的操作所組成的指令序列。 通常,計算機可以執行的基本操作是以指令的形式描述的。一個計算機系統能執行的所有指令的集合,稱為該計算機系統的指令系統。計算機程序就是按解題要求從計算機指令系統中選擇合適的指令所組成的指令序列。在一般的計算機系統中,基本的運算和操作有以下四類:①算術運算:主要包括加、減、乘、除等運算。②邏輯運算:主要包括“與”、“或”、“非”等運算。③關系運算:主要包括“大于”、“小于”、“等于”、“不等于”等運算。④數據傳輸:主要包括賦值、輸入、輸出等操作。前面提到,計算機程序也可以作為算法的一種描述,但由于在編制計算機程序時通常要考慮很多與方 法和分析無關的細節問題(如語法規則),因此,在設計算法的一開始,通常并不直接用計算機程序來描述算法,而是用別的描述工具(如流程圖,專門的算術描述 語言,甚至用自然語言)來描述算法。但不管用哪種工具來描述算法,算法的設計一般都應從上述四種基本操作考慮,按解題要求從這些基本操作中選擇合適的操作 組成解題的操作序列。算法的主要特征著重于算法的動態執行,它區別于傳統的著重于靜態描述或按演繹方式求解問題的過程。傳統的演繹數學是以公理系統為基礎 的,問題的求解過程是通過有限次推演來完成的,每次推演都將對問題作進一步的描述,如此不斷推演,直到直接將解描述出來為止。而計算機算法則是使用一些最 基本的操作,通過對已知條件一步一步的加工和變換,從而實現解題目標。這兩種方法的解題思路是不同的。
1. 算法的控制結構 :一個算法的功能不僅取決于所選用的操作,而且還與各操作之間的執行順序有關。算法中各操作之間的執行順序稱為算法的控制結構。算法的控制結構給出了算法的基本框架,它不僅決定了算法中各操作的執行順序,而且也直接反映了算法的設計是否符合結構化原則。描述算法的工具通常有傳統的流程圖、N-S結構化流程圖、算法描述語言等。一個算法一般都可以用順序、選擇、循環三種基本控制結構組合而成。
算法復雜度主要包括時間復雜度和空間復雜度。
算法的時間復雜度 所謂算法的時間復雜度,是指執行算法所需要的計算工作量。為了能夠較客觀的反映出一個算法的效率,在度量一個算法的工作量時,不僅應該與所使用的計算機、程序設計語言以及程序編制者無關,而且還應該與算法實現過程中的許多細節無關。為此,可以用算法在執行過程中所需基本運算的執行次數來度量算法的工作量。基本運算反映了算法運算的主要特征,因此,用基本運算的次數來度量算法工作量是客觀的也是實際可行的,有利于比較同一問題的幾種算法的優劣。例如,在考慮 兩個矩陣相乘時,可以將兩個實數之間的乘法運算作為基本運算,而對于所用的加法(或減法)運算忽略不計。又如,當需要在一個表中進行查找時,可以將兩個元 素之間的比較作為基本運算。所執行的基本運算次數還與問題的規模有關。綜上所述,算法的工作量用算法所執行的基本運算次數來度量,而算法所執行的基本運算次數是問題規模的函數.
算法的空間復雜度 一個算法的空間復雜度,一般是指執行這個算法所需要的內存空間。一 個算法所占用的存儲空間包括算法程序所占的空間、輸入的初始數據所占的存儲空間以及算法執行過程中所需要的額外空間。其中額外空間包括算法程序執行過程中 的工作單元以及某種數據結構所需要的附加存儲空間(例如,在鏈式結構中 ,除了要存儲數據本身外,還需要存儲鏈接信息)。如果額外空間量相對于問題規模來說是常數,則稱該算法是原地(inplace)工作的。在許多實際問題中,為了減少算法所占的存儲空間,通常采用壓縮存儲技術,以便盡量減少不必要的額外空間。
關于[程序算法藝術與實踐](http://blog.csdn.net/column/details/tac-programalgrithm.html)更多討論與交流,敬請關注本博客和新浪微博[songzi_tea](http://weibo.com/songzitea).
- 前言
- 螺旋矩陣、螺旋隊列算法
- 程序算法藝術與實踐:稀爾排序、冒泡排序和快速排序
- Josephu 問題:數組實現和鏈表實現
- 楊輝三角形算法
- 位圖排序
- 堆排序的實現
- Juggling算法
- 【編程珠璣】排序與位向量
- 取樣問題
- 變位詞實現
- 隨機順序的隨機整數
- 插入排序
- 二分搜索
- 產生不重復的隨機數
- 約瑟夫環解法
- 快速排序
- 旋轉交換或向量旋轉
- 塊變換(字符反轉)
- 如何優化程序打印出小于100000的素數
- 基本的排序算法原理與實現
- 利用馬爾可夫鏈生成隨機文本
- 字典樹,后綴樹
- B-和B+樹
- 程序算法藝術與實踐引導
- 程序算法藝術與實踐:基礎知識之有關算法的基本概念
- 程序算法藝術與實踐:經典排序算法之桶排序
- 程序算法藝術與實踐:基礎知識之函數的漸近的界
- 程序算法藝術與實踐:遞歸策略之矩陣乘法問題
- 程序算法藝術與實踐:遞歸策略之Fibonacci數列
- 程序算法藝術與實踐:遞歸策略基本的思想
- 程序算法藝術與實踐:經典排序算法之插入排序
- 程序算法藝術與實踐:遞歸策略之遞歸,循環與迭代