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

2021-08-29 03:57:43 字數 2997 閱讀 3034

3. 空間複雜度

4. 計算案例

同乙個問題可以用不同的演算法解決,而乙個演算法的優劣將影響到演算法乃至程式的效率。演算法分析的目的在於為特定的問題選擇合適演算法。乙個演算法的評價主要從時間複雜度和空間複雜度來考慮。

演算法在時間的高效性和空間的高效性之間通常是矛盾的。所以一般只會取乙個平衡點。通常我們假設程式執行在足夠大的記憶體空間中,所以研究更多的是演算法的時間複雜度

時間複雜度的計算不是通過計算程式的具體執行時間,而是演算法執行語句的次數。

(1)語句頻度t(n): 乙個演算法執行所花費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。而且乙個演算法花費的時間與演算法中的基本操作語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。乙個演算法中的語句執行次數稱為語句頻度,記為t(n)。

(2)時間複雜度: 在剛才提到的語句頻度中,n稱為問題的規模,當n不斷變化時,語句頻度t(n)也會不斷變化。但有時我們想知道它的變化呈現什麼規律。為此,我們引入時間複雜度概念。 一般情況下,演算法中的基本操作語句的重複執行次數是問題規模n的某個函式,用t(n)表示,若有某個輔助函式f(n),使得當n趨近於無窮大時,t(n) / f(n) 的極限值為不等於零的常數,則稱f(n)是t(n)的同數量級函式。記作 t(n)=o( f(n) ),稱o( f(n) ) 為演算法的漸進時間複雜度,簡稱時間複雜度。t(n) 不同,但時間複雜度可能相同。 如:t(n)=n²+5n+6 與 t(n)=3n²+3n+2 它們的t(n) 不同,但時間複雜度相同,都為o(n²)。

(3)平均時間複雜度和最壞時間複雜度:

平均時間複雜度是指所有可能的輸入例項均以等概率出現的情況下,該演算法的執行時間。

最壞情況下的時間複雜度稱最壞時間複雜度。一般討論的時間複雜度均是最壞情況下的時間複雜度。 這樣做的原因是:最壞情況下的時間複雜度是演算法在任何輸入例項上執行時間的界限,這就保證了演算法的執行時間不會比最壞情況更長。

(1)計算方法:

(2) 如果演算法的執行時間不隨著問題規模n的增加而增長,即使演算法中有上千條語句,其執行時間也不過是乙個較大的常數。此類演算法的時間複雜度是o(1)。

int x = 1;

while(x < 10)

該演算法執行次數為10,是乙個常數,用時間複雜度表示是o(1)。

(3) 當有若干個迴圈語句時,演算法的時間複雜度是由巢狀層數最多的迴圈語句中最內層語句的頻度f(n)決定的。

for(int i = 0; i < n; i++)

}

最外層迴圈每執行一次,內層迴圈都要執行n次,執行次數是根據n所決定的,時間複雜度是o(n2)。

(4) 迴圈不僅與n有關,還與執行迴圈滿足的判斷條件有關。

int i = 0;

while(i < n && arr[i] = 1)

在此迴圈中,如果arr[i]不等於1的話,時間複雜度是o(n)。如果arr[i]等於1的話,則迴圈不能執行,時間複雜度是0。

空間複雜度是對乙個演算法在執行過程中臨時占用儲存空間大小的量度。

(1) 計算方法

int a;

int b;

int c;

system.out.printf("%d %d %d\n",a,b,c);

空間複雜度o(n) = o(1);

int

fun(

int n)

else

}

遞迴實現,呼叫fun函式,每次都建立1個變數k。呼叫n次,空間複雜度o(n * 1) = o(n)。

4.1.1 迭代演算法

public

class

test

;int length = arr.length;

int aim =9;

int result;

result =

binarysearch

(arr, length, aim);if

(result ==-1

)else

}static

intbinarysearch

(int arr,

int len,

int num)

else

if(num < arr[mid]

)else

}return-1

;}}

二分查詢時,每次都在原有查詢內容進行二分,所以時間複雜度為o(log2 n)

因為變數值建立一次,所以空間複雜度為o(1)。

4.1.2 遞迴演算法

package com.matthew.xu;

public

class

test

;int length = arr.length;

int aim =9;

int result;

result =

binarysearch

(arr,

0, length -

1, aim);if

(result ==-1

)else

}static

intbinarysearch

(int

arr,

int left,

int right,

int num)

else

if(num < arr[mid]

)else

if(num == arr[mid])}

return-1

;}}

時間複雜度為o(log2 n)。

每進行一次遞迴都會建立變數,所以空間複雜度為o(log2 n)。

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

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

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

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

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

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