幾種排序演算法的思想很容易掌握,就是對應的時間複雜度,究其原因就是對時間複雜度是什麼,如何定義計算還不知道,那麼時間複雜度是如何計算的呢?請看下文。
在說時間複雜度之前要說一下演算法,演算法是為解決某問題而採取的
具體的,
有限的
操作步驟,既然演算法是操作步驟,那麼步驟
占用計算機資源的多少就決定了演算法的效率。而計算機資源中有時間資源(處理器)和空間資源(儲存器),因此時間複雜度是描述演算法效率的標準中的一種。
什麼是時間複雜度?
演算法中,操作重複執行的次數為演算法的時間度量。
設f(n)為描述乙個演算法重複執行次數的函式,這個演算法的時間複雜度即為o(f(n))。這裡只需求的函式(f(n))的增長率。
例題1:
f(n)=n^3+3n o(f(n))=n^3
f(n)=2 o(f(n))=1
f(n)=logn+n o(f(n))=logn
上面的結果為什麼那樣,大家應該去看一下漸進符號就知道了。
現在如果給定我們乙個演算法的函式,我們肯定可以特別輕鬆的寫出時間複雜度,但是,函式往往不直接給我們,給我們的是一段**,我們是否很容易的求出時間複雜度呢?
如下:例題2.1:
for(i=1;i<=n;++i)
}
分析: 1)第乙個for迴圈重複的次數為n
2)第二個for重複的次數也為n
3)兩個for是巢狀的,程式總的重複次數為n^2
4)時間複雜度即為n^2
例題2.2:
i=1;
while(i<=n)
分析:1)設重複的次數為m
2)i=1 迴圈一次i的值都乘以2, m次迴圈後i的值就不滿足小於等於n了,得函式i*(2^m)>n (i=1)
3)求得重複次數m=l
og2(n/i),即得時間複雜度
說明:上題中i如果不為1時,時間複雜度還是log2(n/i),原因是求的是函式的增長率。
好了,現在我們知道了如何去求時間複雜度的函式及時間複雜度,單個的函式能求出來,那麼多個函式在一塊呢?就好比我們會算加法、減法和乘法,那麼混合運算怎麼算呢? 復合的程式中就能寫出多個時間複雜度的函式,整個函式的時間複雜度如何計算就好比混合運算的優先順序,是有規則的,請繼續看:
針對並列程式
o(f(n1))+o(f(n2))=o( max(f(n1),f(n2)) )
針對巢狀程式
o(f(n1))*o(f(n2))=o( f(n1)*f(n2) )
特例:若其中有乙個為常數c
f(n1)=c o(f(n1))*o(f(n2))=o( c*f(n2) ) = o( f(n2) )
例3:
} for ( i = 0; i < m; i++ )
}
分析: 1)巢狀的兩個for迴圈,用乘法法則得:o(m*n)
2)第三個for迴圈,時間複雜度為o(m)
3)利用加法法則得:時間複雜度為o( max(o(m*n),o(m)) )
如何計算時間複雜度
求解演算法的時間複雜度的具體步驟是 找出演算法中的基本語句 演算法中執行次數最多的那條語句就是基本語句,通常是最內層迴圈的迴圈體。計算基本語句的執行次數的數量級 只需計算基本語句執行次數的數量級,這就意味著只要保證基本語句執行次數的函式中的最高次冪正確即可,可以忽略所有低次冪和最高次冪的係數。這樣能...
如何計算時間複雜度
定義 如果乙個問題的規模是n,解這一問題的某一演算法所需要的時間為t n 它是n的某一函式 t n 稱為這一演算法的 時間複雜性 當輸入量n逐漸加大時,時間複雜性的極限情形稱為演算法的 漸近時間複雜性 我們常用大o表示法表示時間複雜性,注意它是某乙個演算法的時間複雜性。大o表示只是說有上界,由定義如...
如何計算時間複雜度
一 概念時間複雜度是總運算次數表示式中受n的變化影響最大的那一項 不含係數 比如 一般總運算次數表示式類似於這樣 a 2 n b n 3 c n 2 d n lg n e n f a 0時,時間複雜度就是o 2 n a 0,b 0 o n 3 a,b 0,c 0 o n 2 依此類推eg 1 for...