源於生活,抽象生活。
是時候引入時間複雜度這個概念了。好長時間沒有辦法表述這個用來精確衡量乙個演算法在時間上複雜度優劣指標,直到我看到我看到小會的麵包和雞腿的描述。我想,這才是源於生活的演算法。
如何衡量乙個演算法的好壞?一般來說,我們從兩個方面來衡量乙個演算法:
占用空間我們先按下不表(土豪,有的是硬碟和記憶體),我們主要討論執行時間這個維度。我們把乙個程式在特定cpu上的執行時間的長短稱為時間複雜度。即正相關的時間越長,複雜度越高;時間越短,複雜度越低。
怎麼計算時間呢?等價於cpu執行的次數唄。
怎麼統計cpu執行次數?等價於迴圈執行了多少遍唄。
基本操作執行次數這個簡單,我們可以先用生活中的幾個場景來拋個引子。
長度為16cm的麵包,小會每3min吃掉1cm,那麼吃掉整個麵包需要多長時間?小學送分題,16 * 3 = 48 min.
抽象一下,如果麵包長度為n cm,吃掉整個麵包就需要3n min時間。
這種場景下得到乙個公式(3為單位時間,n為總長度):
16cm的麵包,小灰每3min吃掉剩餘麵包長度的一半,那麼把麵包吃到剩1cm需要多久?高中題,不過也難不倒我,這是以2為底的對數關係, 3 * log16 = 12min.
抽象一下就是莊子的「一尺之錘, 日取其半,萬世不竭」,麵包長度為n cm,這是得到的公式(3為單位係數,n為總長度):
長度為16cm的麵包和1個雞腿,小灰每3min吃掉1個雞腿,那麼小灰吃掉所有雞腿要多長時間?初中題,當然是3min,吃雞腿跟麵包沒有關係。
那麼抽象成麵包長度為n,得到的公式(函式值跟n的大小沒有關係):
乙個長度為16cm的麵包,小灰吃掉第乙個1cm需要1min,第二個1cm需要2mins,第三個1cm需要3mins.....即每吃掉1cm所花的時間都比上一次吃掉1cm多用1min。那麼小灰吃掉整個麵包需要多久?嗯,高斯的小學題。(1+2+....+15+16) = 136mins。
抽象一下,如果麵包長度為n,怎麼辦?高斯告訴我們1+2+....+(n-1)+n = (n+1)*n/2,這個公式為:
這樣,我們得到了四個基本用來衡量時間複雜度的公式,下面我們看一下他們在程式中是什麼樣的形態?
需求:
#include #include #include using namespace std;
class timecom
; timecom(int n);
~timecom() {};
dword scene1();
dword scene2();
dword scene3();
dword scene4();
dword scene5();
void showall();
private:
int m_inumber;
};timecom::timecom(int n)
/* o(n) */
dword timecom::scene1()
stop = gettickcount();
cout << "scene1: " << stop - start << endl;
return (stop - start);
}/* o(logn) */
dword timecom::scene2()
stop = gettickcount();
cout << "scene2: " << stop - start << endl;
return (stop - start);
}/* o(1) */
dword timecom::scene3()
/* o(n^2) */
dword timecom::scene4()
} stop = gettickcount();
cout << "scene4: " << stop - start << endl;
return (stop - start);
}void timecom::showall()
int main()
輸出:
可以看到場景3永遠是衡量,場景4增加最快,其次是場景1,然後是場景2.
漸進時間的複雜度的簡便記法我們上面的例子中,n都是按照乙個有限的數字來算的,不過還是給出了他們的公式。通過公式,我們想象:
如果存在函式f(n),使得當n趨向於無窮大時,
的極限值為不等於0的常數,則稱
是
的同量級函式。記做
, 稱為
,
為演算法的漸進時間複雜度,也簡稱時間複雜度。
有了這個概念,怎麼推導時間複雜度呢?我們看下面幾個原則:
如果時間執行時間是常數量級,則用常數1表示只保留時間函式的最高端項如果最高端項存在,則省去最高端項前面的係數
我們反過來再看一下這四種場景對應的大
表示式怎麼算:
先記住這幾種場景,和對應的for迴圈的形式,後面我們遇到不同的形式,會接著補充。
01 時間複雜度 空間複雜度
1 時間頻度 乙個演算法中的語句執行次數稱為語句頻度或時間頻度。記為t n n稱為問題的規模,當n不斷變化時,時間頻度t n 也會不斷變化。2 時間複雜度 若有某個輔助函式f n 使得當n趨近於無窮大時,t n f n 的極限值為不等於零的常數,則稱f n 是t n 的同數量級函式。記作t n f ...
時間複雜度 空間複雜度
時間複雜度 在電腦科學中,演算法的時間複雜度是乙個函式,它定性描述了該演算法的執行時間。這是乙個關於代表演算法輸入值的字串 的長度的函式。時間複雜度常用大o符號 表述,不包括這個函式的低階項和首項係數。計算時間複雜度的方法 1 只保留高階項,低階項直接丟棄 2 係數不要 3 執行次數是常數是為o 1...
時間複雜度 空間複雜度
演算法複雜度分為時間複雜度和空間複雜度。其作用 時間複雜度是指執行演算法所需要的計算工作量 而空間複雜度是指執行這個演算法所需要的記憶體空間。一 時間複雜度 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道...