算法基礎一:算法設計與分析
一、什么是算法
- 算法是程序的靈魂
- 是解決一個計算問題的一系列計算步驟的 有序的 合理的排列。
本次算法的基礎學習過程將從漸增型算法
分治算法
動態規划
貪婪策略
回溯算法
來學習。
二、算法分析的基礎概念
一般來說,解決同一問題的算法,需要的資源越少,我們認為越優秀。計算算法運行時所需資源的量的過程稱為算法復雜性分析,簡稱為算法分析。理論上,算法分析既要計算算法的時間復雜性,又要計算它的空間復雜性。然而,算法的運行時間都是消耗在數據處理上面的,人們更多關注的時算法的時間復雜性分析。
時間復雜性:假設有一台抽象的計算機,它只用一個處理機,卻有無限量的隨機存儲器。它的有限個基本操作——算術運算、邏輯運算和數據的移動均在有限固定的時間內完成,我們進一步假定這些基本操作都消耗一個時間單位。稱此計算機為隨機訪問計算機,簡記為RAM。算法在RAM上運行所需要的時間,顯然就是執行基本操作的次數。
一般來說:規模越大,需要執行的基本操作也就越多,運行時間就越長。此外,即使問題輸入的規模一定,不同的輸入,也會導致運行時間的不同。有以下三種情況:
-
對於固定的輸入規模,使得運算時間最長的輸入所消耗的運行時間稱為算法的最壞情形時間。
-
對於固定的輸入規模,使得運算時間最短的輸入所消耗的時間,稱為最好情形時間。
-
假定固定的輸入規模為n,所有不同輸入構成的集合為Dn,對問題的每一個輸入為I∈Dn,若已知該輸入發生的概率為P(I),對應的運行時間T(I),運行時間的數學期望值
算法最壞情形時間可以視為算法對固定輸入規模n的運行時間的上界,用它來表示算法的時間復雜性是合理的。我們把算法的運行時間記為T,輸入的規模記為n。則根據以上說明可以知道,T是n的遞增函數,我們用T(n)來表示算法的運行時間。
三、算法的漸進運行時間
由於計算機技術發展迅猛,所以要解決的問題輸入規模也就越來越大,所以對固定的n來計算T(n)的意義並不大,我們更傾向於當
T(n)趨於無窮大的快慢來分析算法的時間復雜性。我們往往用幾個函數Y(n):
若λ =非零常數,則稱Y(n)是T(n)的漸近表達式,或稱T(n)漸近等於Y(n),記為T(n)=O(Y(n)),這個記號稱為算法運行時間的漸近O-記號。
例如,
所以:
其實,在一個算法的運行時間T(n)中省略最高次項的常數系數,就可以得到它的漸近表達式。
四、有效算法
如果兩個算法運行時間的漸近表達式相同,則將它們視為就要相同時間復雜度的算法。顯然,漸近時間為對數冪的算法優於漸近時間為冪函數的算法,優於指數函數的算法。我們把漸近時間為冪函數的算法稱為是具有多項式時間的算法,漸近時間不超過多項式的算法則稱為有效的算法。