時間複雜度反應了乙個程式的執行時間關於例項個數變化而變化規律。在乙個排序程式中,可能比較了 2n 次,但是執行步數可能達到了 2n^3 ,就不能直接判定程式執行時間是 n 的線性函式。兩個程式比較次數乙個是3n,乙個是2n 那麼不能說前者的花費的時間就要更慢些,因為在總的執行步數上未必會比後者多。
當例項個數足夠多的時候,計量時間的方法叫做漸進記法,最常用的是 o(g(x)) 表示。其他常用還有 o , ω , θ 記法。
一 、 大 o 記法
當例項個數n足夠多時 ,程式執行總步數 f(n) = o(g(n)) 時滿足 :
例如 當 程式執行步數為 f(n)= n^2+ 4log2 n 那麼 f(n) = o(n^2) 成立, f(n) = o(n^3) 也成立。
二、ω 記法。
當例項個數n足夠多時 ,程式執行總步數 f(n) = ω(g(n)) 時滿足 :
例如 當 程式執行步數為 f(n)= n^2+ 4log2 n 那麼 f(n) = ω(n^2) 成立, f(n) = ω(n) 也成立。 f(n) = ω(n^3) 不成立
三、 θ記法
當例項個數n足夠多時 ,程式執行總步數 f(n) = θ(g(n)) 時滿足 :
例如 當 程式執行步數為 f(n)= n^2+ 4log2 n 那麼 f(n) = θ(n^2) 成立, f(n) = θ(n) 不成立。 f(n) = θ(n^3) 不成立
四、小o記法
當例項個數n足夠多時 ,程式執行總步數 f(n) = o(g(n)) 時滿足 :
當且僅當 f(n) =o(g(n)) 且 f(n) 不等於 ω (g(n)) 時 即
例如 當 程式執行步數為 f(n)= n^2+ 4log2 n 那麼 f(n) = o(n^2) 不成立, f(n) = o(n) 成立。 f(n) = o(n^3) 不成立
五、命中快取對時間效率的影響。
在簡單的計算機模型中,它的儲存由1級快取,二級快取和主存構成。算術和邏輯操作由算術和邏輯單元 (alu) 對儲存在暫存器r中的資料進行處理來完成。通常主存的大小時幾百mb,二級快取大小不足1mb,1級快取的大小是幾十kb,暫存器的數量在8到32之間。容量越小的,讀取效率越高。
程式在執行時,所有資料都在主存,當要讀取資料時,程式會率先在1級快取中去找,如果沒有再去二級快取去找,之後再去主存中去找,在快取中讀取的需要資料比起在主存中讀取需要的資料效率來得高。如果在主存中找到需要的資料,會把它複製到在二級快取,一級快取和暫存器中,再進行操作。
因為快取的存在,時程式相同執行步數的情況下,耗時也可能會大有不同。
例如有二維陣列即矩陣的乘法運算
//程式1 i j k 的遍歷方式
void multiplymartix(int **a , int ** b ,int **c,int n)
//效率的更高的程式二 i k j 的遍歷方式
void multiplymartix(int **a , int ** b ,int **c,int n)
由與第二個程式,再1次內部第3層迴圈中,每一次迴圈讀的 a[i][k] 的臨時變數都是同乙個,所以快取命中次數要比第1個程式佔比來得高,效率更快。 漸進時間複雜度分析
1.時間複雜度與漸進時間複雜度 演算法時間複雜度的本質是演算法的執行時間,也就是演算法中所有語句的頻度之和。當問題規模很大時,精確的計算是很難實現而且也是沒有必要的,引入了漸進時間複雜度作為時間效能分析的依據。漸進時間複雜度可以簡稱為時間複雜度,記為t n o f n 這個博文寫的不錯。通常,在評估...
時間複雜度分析 大O記法
就是看乙個程式執行消耗的時間,這個最簡單的分析方法但是有很大的缺點 用這種方式去測試需要等待程式執行完畢,浪費了很多時間在等待程式執行上 對於不同的硬體條件,程式執行的速度都是不一樣的,這樣的結果就沒有說服力 程式設計師主要關注的是 使用什麼演算法實現 乙個問題的規模 設t n 為問題規模n的函式,...
演算法分析基礎 漸進時間複雜度
這裡通過從無窮大的比較來理解,漸進時間複雜度。要求具有高等數學基礎 可以從無窮大比較分析的原因 我們一般只考慮輸入規模比較大 無窮大 的情況,一般這時候t n 是很大的的。從而我們通過無窮大的階數來比較t n 和f n 的情況,無論初始情況怎麼樣,階數大的在n趨於無窮時總是會超過另乙個階數小的。當然...