演算法效率衡量
時間頻度
一個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且一個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。一個演算法中的語句執行次數稱為語句頻度或時間頻度。記為T(n)。
時間複雜度與“大O記法”
上面提到的時間頻度T(n)中,n稱為問題的規模,當n不斷變化時,時間頻度T(n)也會不斷變化。但有時我們想知道它變化時呈現什麼規律,為此我們引入時間複雜度的概念。一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用T(n)表示,如果存在一個整數函式g和實常數c>0,使得對於充分大的n總有T(n)<=c*g(n),就說函式g是T(n)函式的一個漸近函式(忽略常數),記為T(n)=O(g(n)),它稱為演算法的漸進時間複雜度,簡稱時間複雜度。這種用O( )來體現演算法時間複雜度的記法,我們稱之為大O表示法。
大O表示法實際就是去掉T(n)函式的最高階項係數、低階項和常數項,只保留最高階項。如T(n)函式為5n3 + 3n + 5,使用大O表示法則時間複雜度為O(n3)。
如何理解“大O記法”
對於演算法的效率衡量,最重要的是其數量級和趨勢,這些是分析演算法效率的主要部分。而計量演算法基本運算元量的規模函式中那些常量因子可以忽略不計。例如,可以認為3n2和100n2屬於同一個量級,如果兩個演算法處理同樣規模例項的代價分別為這兩個函式,就認為它們的效率“差不多”,都為n2級。
時間複雜度的分類
時間複雜度根據操作的多少分為如下三種:
- 最優時間複雜度:演算法完成工作最少需要多少基本操作
- 最壞時間複雜度:演算法完成工作最多需要多少基本操作
- 平均時間複雜度:演算法完成工作平均需要多少基本操作
對於最優時間複雜度,其價值不大,因為它沒有提供什麼有用資訊,其反映的只是最樂觀最理想的情況,沒有參考價值。
對於最壞時間複雜度,提供了一種保證,表明演算法在此種程度的基本操作中一定能完成工作。
對於平均時間複雜度,是對演算法的一個全面評價,因此它完整全面的反映了這個演算法的性質。但另一方面,這種衡量並沒有保證,不是每個計算都能在這個基本操作內完成。而且,對於平均情況的計算,也會因為應用演算法的例項分佈可能並不均勻而難以計算。
因此,我們主要關注演算法的最壞情況,亦即最壞時間複雜度。
時間複雜度的幾條基本計算規則
基本操作,即只有常數項,認為其時間複雜度為O(1),
順序結構,時間複雜度按加法進行計算
迴圈結構,時間複雜度按乘法進行計算
分支結構,時間複雜度取最大值
判斷一個演算法的效率時,往往只需要關注運算元量的最高次項,其它次要項和常數項可以忽略
在沒有特殊說明時,我們所分析的演算法的時間複雜度都是指最壞時間複雜度
空間複雜度
- 空間複雜度的概念
類似於時間複雜度的討論,一個演算法的空間複雜度S(n)定義為該演算法所耗費的儲存空間,它也是問題規模n的函式。漸近空間複雜度也常常簡稱為空間複雜度。空間複雜度(SpaceComplexity)是對一個演算法在執行過程中臨時佔用儲存空間大小的量度。 - 空間複雜度和時間複雜度的關係
對於一個演算法,其時間複雜度和空間複雜度往往是相互影響的。當追求一個較好的時間複雜度時,可能會使空間複雜度的效能變差,即可能導致佔用較多的儲存空間;反之,當追求一個較好的空間複雜度時,可能會使時間複雜度的效能變差,即可能導致佔用較長的執行時間。大部分時間我們在完成一個程式時採用空間換時間的策略
演算法的時間複雜度和空間複雜度合稱為演算法的複雜度。