演算法:演算法是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令表示一個或多個步驟。
演算法定義
指令:能被人或者計算機裝置執行。
演算法是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令表達一個或者多個步驟。
演算法的核心在於有限的指令序列。
演算法的特性
1、輸入輸出
演算法具有零個或者多個輸入。
演算法至少要有一個或多個輸出。
2、有窮性
指演算法在執行有限的步驟之後,自動結束而不會出現無限迴圈,並且每一個步驟在可接受的時間內完成。
關鍵在與步驟有限。
3、確定性
演算法的每一個步驟都具有確定的含義,不會出現二義性。
4、可行性
演算法的每一步都必須是可行的,也就是說,每一步都能夠通過執行有限的次數完成。
意味著演算法可以轉化為程式上機執行,並得到正確結果。
演算法設計要求
1、正確性
演算法至少應該具有輸入、輸出和加工處理無歧義性、能正確反映問題需求、能夠得到正確答案。
正確大致分為以下四個層次:
- 演算法程式沒有語法錯誤;
- 演算法程式對於合法的輸入資料能夠產生滿足要求的輸出結果;
- 演算法程式對於非法輸入資料能夠得出滿足規格說明的結果;
- 演算法程式對於精心選擇、甚至刁難的測試資料都有滿足要求的輸出結果。
2、可讀性
演算法設計的另一目的是為了便於閱讀、理解和交流。
3、健壯性
當輸入資料不合法的時候,演算法也能做出相關處理,而不是產生異常或莫名其妙的結果。
4、時間效率高和儲存量低
時間效率指的是演算法的執行時間,執行時間越短,演算法效率越高。
設計演算法應該儘量滿足時間效率高和儲存量低的需求。
演算法效率的度量方法
1、事後統計方法
缺點:
- 先編好,再比較
- 硬體條件影響
- 測試資料設計困難
2、事前分析方法
事前分析估算方法:在計算機程式編制前,依據統計方法對演算法進行估算。
一個程式執行時間主要取決於以下幾個因素:
- 演算法採用的策略和方法;
- 編譯產生的程式碼質量;
- 問題的輸入規模;
- 機器執行指令的速度。
拋開外部原因,影響演算法執行效率主要依賴於 演算法的好壞 和 問題的輸入規模;
測定執行時間最可靠的方法是計算對執行時間有消耗的基本操作的執行次數。在分析演算法執行效率時,我們主要關注於迴圈體,將迴圈體看作一個整體,忽略頭尾迴圈判斷的開銷,演算法主要就是1次和n次的差距。演算法好壞顯而易見。
演算法執行時間:以基本操作的執行次數與輸入規模關聯起來,即基本操作的數量必須表示成輸入規模的函式。
函式漸進增長
給定兩個函式 f(n) 和 g(n) ,如果存在一個整數N,使得對於所有的 n>N,f(n) 總是比 g(n) 大,那麼,我們說 f(n) 的增長漸進快於 g(n) 。
在演算法時間和問題規模的函式中,隨著n的增大,不論+3還是+100,這些項其實不影響最終的演算法變化,所以我們可以忽略這些加法常數。
同時,與最高次項相乘的常數並不重要。
最高次項的指數越大,隨著n的增長,結果也會變得增長得特別快。
綜上,我們可以得出一個結論:
判斷演算法效率時,函式中的常數項和其他次要項常常可以忽略,而只關心最高階項得階數。
演算法時間複雜度
1、定義
在進行演算法分析時,語句總的執行次數 T(n) 是關於問題規模 n 的函式,進而分析 T(n) 隨 n 的變化情況並確定 T(n) 的數量級。演算法的時間複雜度,也就是演算法的時間量度,記作 T(n) = O( f(n) ) 。它表示隨問題規模 n 的增大,演算法執行時間的增長率和 f(n) 的增長率相同,稱作演算法的漸近時間複雜度,簡稱為時間複雜度。其中 f(n) 是問題規模 n 的某個函式。
用大寫 O( ) 來體現演算法時間複雜度的記法,叫做大O記法。
我們認為:隨著 n 的增長, T(n) 增長最慢的演算法為最優演算法。
2、大O階推導
- 1、用常數1取代執行時間中的所有加法常熟;
- 2、在修改後的執行次數函式中,只保留最高階項;
- 3、如果最高階項存在且不是1,則去除與這個項相乘的常數。得到的結果就是大O階。
3、常數階
O(1)
與問題大小n無關,執行時間恆定的演算法,稱之為O(1)時間複雜度,又叫常數階。
單純的分支結構(不包含在迴圈結構中),其時間複雜度也是O(1) 。
4、線性階
分析演算法的複雜度,關鍵在於分析迴圈結構的執行情況。
O(n)
一般是單純地、簡單地迴圈結構。如 f(n) =3n+6 。
5、對數階
O(log n)
一般是迴圈過程中,迴圈判斷條件呈指數變化。
6、平方階
O(n²)
巢狀迴圈中,內層迴圈條件初始值為外層條件當前值。
常見的時間複雜度
它們所消耗的時間從小到大依次是:
更多精彩內容,關注我的微信公眾號——Android機動車