2.時間複雜度
乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。乙個演算法中的語句執行次數稱為語句頻度或時間頻度。記為t(n)。
前面提到的時間頻度t(n)中,n稱為問題的規模,當n不斷變化時,時間頻度t(n)也會不斷變化。但有時我們想知道它變化時呈現什麼規律,為此我們引入時間複雜度的概念。一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t(n)表示,若有某個輔助函式f(n),使得當n趨近於無窮大時,t(n)/f(n)的極限值為不等於零的常數,則稱f(n)是t(n)的同數量級函式,記作t(n)=o(f(n)),它稱為演算法的漸進時間複雜度,簡稱時間複雜度。
3.大o表示法
推導大o階,我們可以按照如下的規則來進行推導,得到的結果就是大o表示法:
1.用常數1來取代執行時間中所有加法常數。
2.修改後的執行次數函式中,只保留最高端項
3.如果最高端項存在且不是1,則去除與這個項相乘的常數。
先舉了例子,如下所示。
int
sum = 0,n = 100; //執行一次
sum = (1+n)*n/2; //執行一次
system.out.println (sum); //執行一次
線性階主要要分析迴圈結構的運**況,如下所示。
for(int i=0;i1)的演算法
...}
接著看如下**:
int number=1;
while(number2;
//時間複雜度為o(1)的演算法
...}
下面的**是迴圈巢狀:
for(int i=0;ifor(int j=0;j1)的演算法
...
}}
for(int i=0;ifor(int j=i;j1)的演算法
...
}}
4.複雜度的比較
logn
√nnlogn
n²2ⁿn!5
221025
32120103
3301001024
3628800505
7250
2500
約10^15
約3.0*10^64
1006
10600
10000
約10^30
約9.3*10^157
1000931
9000
1000 000
約10^300
約4.0*10^2567
關於演算法的時間複雜度和空間複雜度
首先,需要解釋一下經常看到的o log n 是什麼意思。大概總結為普通應用都是10,計算機學科是2,程式語言裡面是e。在我們初中最初接觸到對數時,學到的log指以10為底的對數,為了簡化把下標10去掉,記為log。以常數e為底的對數,簡化下標記為ln。但是在計算機學科裡,不知道為什麼流傳下來的log...
關於時間複雜度
1.演算法複雜度分為 時間複雜度和空間複雜度。作用 時間複雜度是度量演算法執行的時間長短 而空間複雜度是度量演算法所需儲存空間的大小。2.一般情況下,演算法的基本操作重複執行的次數是模組n的某乙個函式f n 因此,演算法的時間複雜度記做 t n o f n 分析 隨著模組n的增大,演算法執行的時間的...
關於時間複雜度
關於時間複雜度 o 的定義 若f n 是正整數n的乙個函式,則o f n 表示 m 0 使得當n n0時,f n m f n0 表示時間複雜度的階有 o 1 常量時間階 o n 線性時間階 o n 對數時間階 o n n 線性對數時間階 o n k k 2,k次方時間階 例 兩個n階方陣的乘法 fo...