演算法效率的度量方法
*事後統計方法:這種方法主要是通過設計好的測試程式和資料,利用計算機計時器對不同酸防編制的程式執行時間進行比較,從而確定演算法效率的高低。
這種方法有很大的缺陷,必須依據演算法事先編制好測試程式,通常需要花費大量時間和精力,如果完了發覺測試的是糟糕的演算法,就會功虧一簣。
不同測試環境側別也不是一般大。
*事前分析估算方法:在電腦程式編寫前,依據統計方法對演算法進行評估。
經過總結,我們發現乙個高階語言編寫的程式在計算機上執行所消耗的時間取決於下列因素:
1.演算法採用的策略,方案
2.編譯產生的**質量
3.問題的輸入規模
4.機器執行的指令速度
注:我們研究演算法的複雜度,側重的是研究演算法隨著輸入規模擴大增長量的乙個抽象,而不是精確地定位需要執行多少次,因為如果這樣的話,我們又得考慮編譯器優化等問題。
我們在分析乙個演算法的執行時間時,重要的是把基本操作的數量和輸入模式關聯起來。
不計那些迴圈索引的遞增和迴圈終止條件、變數宣告、列印結果等操作。
函式的漸進增長
舉例1:
兩個演算法的輸入規模都的n,演算法a要做2n+3次操作(可以這樣理解:先執行n次迴圈,再執行乙個n次迴圈,最後還有3次運算),演算法b要做3n+1次操作。哪乙個更快些呢?
函式的漸進增長:給定的兩個函式f(n)和g(n),如果存在乙個整數n,使得對於所有的n>n,f(n)總是比g(n)大,那麼,我們說f(n)的增長漸進快於g(n)。
隨著輸入規模增大,加法的常量可以忽略。
舉例2:
演算法c是4n+8,演算法d是2n^2 + 1。
與最高次項相乘的常數並不重要,也可以忽略。
舉例3:
演算法e是2n^2+3n+3,演算法f是2n^3+3n+1。
最高項的指數越大,增長約快。
演算法時間複雜度
定義:在進行演算法分析時,語句總的執行次數t(n)是關於問題規模n的函式,進而分析t(n)隨n的變化情況並確定t(n)的數量級。演算法的時間複雜度,也就是演算法的時間量度,記作:t(n)=o(f(n))。它便是隨問題規模n的增大,演算法執行時間的增長率和f(n)的增長率相同,稱作演算法的漸進時間複雜度,簡稱時間複雜度。其中,f(n)是問題規模n的某個函式。
一般情況下,隨著輸入規模n的增大,t(n)增長最慢的演算法為最優演算法。
時間複雜度的攻略:
1.用常數1取代執行時間中的所有加法常數。
2.在修改後的執行函式中,只保留最高端項。
3.如果最高端項存在並且不是1,則去除與這個項相乘的常數。
4.得到的最後結果就是大o記。
常數階o(1).
線性階o(n).
平方階o(n^2).
對數階int i = 1,n = 100;
while(ii = i*2;
o(logn)
函式呼叫的時間複雜度分析
常用的時間複雜度所耗費的時間從小到大依次是:o(1)
演算法的空間複雜度
時間和空間的相互轉換,如判斷是不是閏年的演算法。
方法一就是寫乙個判斷語句;
方法二是列出乙個2050的陣列,進行查表。
資料結構與演算法 二 時間複雜度和空間複雜度
演算法採用的策略 方案 編譯產生的 質量 問題的輸入規模 機器執行指令的速度 由此可見,拋開計算機硬體,乙個程式的執行時間依賴於演算法的好壞和輸入規模。int i,sum 0,n 100 for i 1 i n i printf d sum int i,sum 0,n 100 sum i n n 2...
資料結構與演算法(二) 時間複雜度和空間複雜度
演算法採用的策略,方案 編譯產生的 質量 問題的輸入規模 機器執行指令的速度 由此可見,拋開這些與計算機硬體 軟體有關的因素,乙個程式的執行時間依賴於演算法的好壞和問題的輸入規模 我們研究演算法的複雜度,側重的是研究演算法隨著輸入規模擴大增長量的乙個抽象,而不是精確的定位需要執行多少次 我們不關心語...
資料結構和演算法 02時間複雜度和空間複雜度
高階語言編寫的程式在計算機上執行時所消耗的時間取決於下列因素 1.演算法採用的策略,方案 2.編譯產生的 質量 編譯器 3.問題的輸入規模 輸入量的多少 4.機器執行指令的速度。研究演算法的複雜度,側重的是研究演算法隨著輸入規模擴大增大量的乙個抽象!一 演算法時間複雜度概念 一般情況下,演算法中基本...