一.時間複雜度:
時間複雜度實際就是函式,函式計算執行的基本操作次數。
ps:這裡的函式是指數學裡面的函式,而不是c語法裡的函式。
void test1 ( int n )
}for (int k = 0; k < 2 * n ; ++ k)
int count = 10;
while (count --)
}
時間複雜度函式--> f(n) = n^2 + 2n + 10
這個函式計算的就是運算次數。
1.演算法分析的分類
*最壞情況:任意輸入規模的最大執行時間。(上界)
*平均情況:任意輸入規模的期望執行時間。
*最好情況:任意輸入規模的最小執行時間,通常最好情況不會出現。(下界)
例如:在乙個長度為n的線性表中搜尋乙個資料x。
最壞情況:n次比較。
平均情況:n/2次比較。
最好情況:1次比較。
在實際中我們通常情況考量的是演算法的最壞運**況。也就是說對於任意輸入規模n,演算法的最長執行時間,理由如下:
》乙個演算法的最壞情況的執行時間是在任意輸入下的執行時間上界。
》對於某些演算法,最壞的情況出現的較為頻繁。
》大體上看,平均情況與最壞情況一樣差。
演算法分析要保持大局觀:
//忽略掉那些的常數。
//關注執行時間的增長趨勢,關注函式式中增長最快的表示式。
2.o的漸進表示法(big o notation)
通常我們使用o記號法表示最壞運**況的漸進上界。其實也就是說我們使用o標記法表示時間複雜度,一般關注的是演算法執行的最壞情況。
下面我們使用大o的漸進表示法計算下面函式的時間複雜度
如:f(n) = n^3 + n^2 + n +1000,則關注n^3->o(n^3)
3.時間複雜度計算
【1.一般演算法的時間複雜度計算】
void test1 ( int n )
}for (int k = 0; k < 2 * n ; ++ k)
int count = 10;
while (count --)
}test1的時間複雜度為:o(n^2)
void test2 (int n, int m)
for (int k = 0; k < n ; ++k)
}test2的時間複雜度為:o(m+n)
void test3 (int n, int m)
}}test3的時間複雜度為:o(m*n)
【2.分治演算法的時間複雜度計算】
【3.遞迴演算法的時間複雜度計算】
遞迴演算法的時間複雜度為 :遞迴總次數*每次遞迴次數。
二,空間複雜度
乙個程式的空間複雜度是指執行完乙個程式所需記憶體的大小。利用程式的空間複雜度,可以對程式的執行所需要的記憶體多少有個預先估計。乙個程式執行時除了需要儲存空間和存
儲本身所使用的指令、常數、變數和輸入資料外,還需要一些對資料進行操作的工作單元和儲存一些為現實計算所需資訊的輔助空間。程式執行時所需儲存空間包括以下兩部分。
(1)固定部分。這部分空間的大小與輸入/輸出的資料的個數多少、數值無關。主要包括指令空間(即**空間)、資料空間(常量、簡單變數)等所佔的空間。這部分屬於靜態空間。
(2)可變空間,這部分空間的主要包括動態分配的空間,以及遞迴棧所需的空間等。這部分的空間大小與演算法有關。
乙個演算法所需的儲存空間用f(n)表示。s(n)=o(f(n)) 其中n為問題的規模,s(n)表示空間複雜度。
更詳細見:
賜教!
演算法複雜度 時間複雜度和空間複雜度
1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...
演算法複雜度 時間複雜度和空間複雜度
演算法複雜度 時間複雜度和空間複雜度 關鍵字 演算法複雜度 時間複雜度 空間複雜度 1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時 間多,哪個演算法花費的時間少就可以...
演算法複雜度 時間複雜度和空間複雜度
演算法的時間複雜度是指執行演算法所需要的計算工作量。n稱為問題的規模,當n不斷變化時,時間頻度t n 也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t n 表示,若有某個輔助函式f n 存在乙個正...