演算法複雜度 二

2021-10-01 03:28:56 字數 3704 閱讀 3091

2.空間複雜度

3.列出一些常用演算法的時間複雜度和空間複雜度

4.結束語

[ 來自360百科 ]演算法在編寫成可執行程式後,執行時所需要的資源,資源包括時間資源和記憶體資源。應用於數學和計算機導論。同一問題可用不同演算法解決,而乙個演算法的質量優劣將影響到演算法乃至程式的效率。演算法分析的目的在於選擇合適演算法和改進演算法。乙個演算法的評價主要從時間複雜度和空間複雜度來考慮。下面就時間複雜度和空間複雜度做出解釋。

什麼是時間複雜度,乙個演算法的執行時間是指演算法中所有語句所執行完畢的時間總和,我們可以計算每條語句執行的時間,但是由於語句的執行速度與計算機的軟,硬體(硬碟,儲存控制器,介面卡,cpu)環境有很大影響,一條語句在不同裝置上可能有不一樣的執行時間,顯然,計算語句的執行時間是非常不明智的,這時候,乙個新的解決方案誕生了,既然我們想要準確得到語句的執行時間有些麻煩,何不換個角度思考問題,引入我們今天的主角,複雜度,我們只需要規定語句的複雜度,只需要知道執行語句花費的大致時間可以了(可以認為複雜度與時間成正比,時間越多,複雜度就越高)並規定乙個語句執行花費的時間與語句的執行次數成正比,這便是時間複雜度。在進行演算法分析時,語句總的執行次數t(n)是關於問題規模n的函式,進而分析t(n)隨n的變化情況並確定t(n)的數量級。

演算法的時間複雜度,也就是演算法的時間量度,記作:t(n)= o(f(n))

用大寫o()來體現演算法時間複雜度的記法,我們稱之為大o記法

一般情況下,隨著輸入規模n的增大,t(n)增長最慢的演算法為最優演算法。

常見的演算法時間複雜度有: o(1) < o(logn) < o(n) < o(nlogn) < o(n²) < o(n³) < o(2^n) < o(n!)

複雜度對應的名稱分別是:常數階,對數階,線性階,二維階,平方階,立方階,指數階,乘階階

那麼我們該如何計算乙個現有演算法的時間複雜度呢?只要記住下面三句話即可!

1.用常數1來取代執行時間中所有加法常數。

2.只要高階項,捨去低階項。

3.不要高階項係數。

下面,用一些例項來介紹常見的時間複雜度。

例1:

int a =2;

int b =3;

int temp;

temp = a;

//執行第一次

a = b;

//執行第一次

b = temp;

//執行第一次

//三條語句一共執行了(1+1+1)= 3次,根據第一句話,用常數1來取代執行時間中所有加法常數。

//所以3用1來代替,所以該程式執行完,時間複雜度為o(1)。

例2:

printf

("hello world");

//執行第一次

printf

("堅持就會有收穫");

//執行第一次

int sum=

0;

int n=

10;

sum=

(n*(n+1)

)/2;

//執行第一次

printf

("加油!");

//執行第一次

//三條語句一共執行了(1+1+1+1)= 4次,根據第一條規定,用常數1來取代執行時間中所有加法常數。

//所以4用1來代替,所以該程式執行完,時間複雜度為o(1)。

有些萌新看到這裡可能會問為什麼類似int sum=0的語句為什麼不算執行次數,因為int sum=0這屬於定義變數。並不是語句,請看文章開頭的黃色句子,那麼那些算作是語句呢?

以c語言為例:

語句解釋

賦值語句

變數=表示式

輸入語句

scanf

輸出語句

printf

條件語句

if迴圈語句

while for

接著往下看之前,先複習一下,什麼是對數,可能有人已經忘記了。

a^x = n ( a > 0 && a != 1 )

即x為以a為底,n的對數,a叫做對數的底數,n叫做真數。

int sum=1;

int n =

1000

;while

(sum < n)

//第一次執行:sum=1*2=2 2^1

//第二次執行:sum=2*2=4 2^2

//第三次執行:sum=4*2=8 2^3

//第四次執行:sum=8*2=16 2^4

//第x次執行:2^x=n,可得x=log2n,所以複雜度為o(logn)。

for

(int i =

0; i < n; i++

)//執行n+1次

//n+n+1=2n+1

//由三句話可得,複雜度為o(n)。

for

(int i =

0; i < n; i++

)//執行n+1次

}//二維階也叫線性對數階,將對數階 o(logn)**迴圈n次便是

for

(int i =

0; i < n; i++)}

//平方階就是把複雜度是 o(n)的**巢狀一遍

//立方階就是複雜度是 o(n)的**巢狀兩遍,這裡就不再贅述。
類似於時間複雜度的討論,乙個演算法的空間複雜度(spacecomplexity)s(n)定義為該演算法所耗費的儲存空間,它也是問題規模n的函式。漸近空間複雜度也常常簡稱為空間複雜度。

空間複雜度是乙個演算法在執行過程中臨時占用儲存空間大小的度量,記作s(n)=o( f(n) )。

常見的空間複雜度有 o(1),o(n),o(n^2)。

int i =1; 

int j =2;

++i;

j++; int m = i + j;

//**中的i j m變數所分配的空間都不隨著處理資料量變化,因此它的空間複雜度s(n)=o(1).

int n =20;

int *a =

newint

[n];

int j;

for(int i =

1; i <= n; i++

)//這段**中,第一行new了乙個陣列出來,大小為n,雖然有迴圈,但沒有分配空間。

//所以空間複雜度主要在第一行,即s(n)=o(n).

演算法複雜度 時間複雜度和空間複雜度

1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...

演算法複雜度 時間複雜度和空間複雜度

演算法複雜度 時間複雜度和空間複雜度 關鍵字 演算法複雜度 時間複雜度 空間複雜度 1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時 間多,哪個演算法花費的時間少就可以...

演算法複雜度 時間複雜度和空間複雜度

演算法的時間複雜度是指執行演算法所需要的計算工作量。n稱為問題的規模,當n不斷變化時,時間頻度t n 也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t n 表示,若有某個輔助函式f n 存在乙個正...