C語言資料結構 時間複雜度和空間複雜度

2021-09-09 07:11:50 字數 1888 閱讀 1527

演算法效率分為兩種,一種是時間效率,一種是空間效率。時間效率被叫做時間複雜度,

空間效率被稱為空間複雜度。

時間複雜度主要衡量乙個演算法的執行速度,空間複雜度主要衡量乙個演算法執行時所需要開闢的空間。

電腦科學中,演算法的時間複雜度是乙個函式,它定性描述了該演算法的執行時間。這是乙個關於代表演算法輸入值的字串的長度的函式。時間複雜度常用大o符號表述,不包括這個函式的低階項和首項係數。使用這種方式時,時間複雜度可被稱為是漸近的,它考察當輸入值大小趨近無窮時的情況。

案例:

void

func

(int n)

}for

(int k =

0; k <

2* n ;

++ k)

int m =10;

while

(m--

)printf

("%d\n"

, count)

;}

此**中func執行的基本操作的次數為

當 n = 10 時, f(n) = 130

當 n = 100 時, f(n) = 10210

當 n = 1000 時, f(n) = 1002010

實際上,計算時間複雜度時,並不需要精確的數值,只需要大概的次數,用o表示的漸進表示法

o( f( n ) )表示乙個演算法的時間複雜度

推導 o 的方法

(1). 用常數1取代執行時間中所有的加法常數

比如 o(100) 或者 o(10 + 20) 均可用 o(1) 來表示

(2). 在修改後的執行次數函式中,只保留最高端項

比如 o(n² + n) 用 o(n²) 來表示

(3). 如果最高端項存在且不是1,則去除與這個專案相乘的常數

比如 o(2n²) 用 o(n²) 來表示

有以上的方法,可以計算出案例中func的時間複雜度為

另外有些演算法的時間複雜度存在最好、平均和最壞情況:

最壞情況:任意輸入規模的最大執行次數(上界)

平均情況:任意輸入規模的期望執行次數

最好情況:任意輸入規模的最小執行次數(下界)

例如:在乙個長度為n陣列中搜尋乙個資料x

最好情況:1次找到

最壞情況:n次找到

平均情況:n/2次找到

在實際情況中,關注的往往是乙個演算法的 最壞運**況

空間複雜度是對乙個演算法在執行過程中臨時占用儲存空間大小的量度 。空間複雜度不是程式占用了多少bytes的空間,因為這個也沒太大意義,所以空間複雜度算的是變數的個數。空複雜度計算規則基本跟實踐複雜度類似,也使用大o漸進表示法。

比如直接插入排序的時間複雜度是o(n^2),空間複雜度是o(1) 。而一般的遞迴演算法就要有o(n)的空間複雜度了,因為每次遞迴都要儲存返回資訊。乙個演算法的優劣主要從演算法的執行時間和所需要占用的儲存空間兩個方面衡量。

案例:

void

bubblesort

(int

* a,

int n)}if

(exchange ==0)

break;}

}

在案例中bubblesort使用的是常數個開闢的額外空間。用和時間複雜度計算方式相同的o漸進表示法,則可以計算出該演算法的空間複雜度為

o(1)

案例

long

long

*fibonacci

(size_t n)

return fibarray ;

}

在案例中fibonacci函式動態開闢了n個空間。用和時間複雜度計算方式相同的o漸進表示法,則可以計算出該演算法的空間複雜度為

o(n)

資料結構時間複雜度和空間複雜度

1 演算法o n 關注n的階數,當數十分大的時候,常數可以忽略。o n 又稱為大o記法。2 t n o f n 隨著n變化而變化,f n 是某個函式,執行的次數等於時間,一般情況下,t n 增長最慢的演算法最優。4 推到o n 1,用1取代時間中所有加法常數 哪些可以忽略 2,在修改後的執行函式中,...

資料結構 時間複雜度和空間複雜度

通常我們衡量乙個演算法的複雜度時,會有兩種演算法效率分析方式 第一種是時間效率,第二種是空間效率。時間效率被稱為時間複雜度,而空間效率被稱作空間複雜度。時間複雜度主要衡量的是乙個演算法的執行速度,空間複雜度主要衡量一乙個演算法所需要的額外空間,在計算機發展的早期,計算機的儲存容量很小。所以對空間複雜...

資料結構 時間複雜度和空間複雜度

演算法 algorithm 是對特定問題求解步驟的一種描述。解決乙個問題往往有不止一種方法,演算法也是如此。那麼解決特定問題的多個演算法之間如何衡量它們的優劣呢?有如下的指標 1 時間複雜度 執行這個演算法需要消耗多少時間。2 空間複雜度 這個演算法需要占用多少記憶體空間。同乙個問題可以用不同的演算...