資料結構之演算法的時間與空間複雜度

2021-10-04 10:34:06 字數 4617 閱讀 9968

1.演算法效率

演算法效率分析分為兩種:第一種是時間效率,第二種是空間效率。時間效率被稱為時間複雜度,而空間效率被稱作空間複雜度。時間複雜度主要衡量的是乙個演算法的執行速度,而空間複雜度主要衡量乙個演算法所需要的額外空間,在計算機發展的早期,計算機的儲存容量很小。所以對空間複雜度很在乎。但是經過計算機行業的迅速發展,計算機的儲存容量已經達到了極高的水平。所以如今我們已經不需要再特別關注乙個演算法的空間複雜度。

2.時間複雜度

2.1.什麼是時間複雜度

基本概念:在電腦科學中,演算法的時間複雜度是乙個函式,它定量描述了該演算法的執行時間。乙個演算法執行所耗費的時間,從理論上說,是不可以算出來的,只有把程式放到計算機上跑起來,才可以測試出來。但是我們需要每個演算法都上機測試,這很麻煩,所以才有了時間複雜度這個分析方式。乙個演算法所花費的時間與其中語句的執行次數成正比例,演算法中的基本操作的執行次數,為演算法的時間複雜度。

2.2 大o的漸進表示法

2.2.1.例題分析

:請計算func基本操作執行了多少次?

void

func

(int n)

}for

(int k =

0; k <

2* n ;

++ k)

int m =10;

while

(m--

)printf

("%d\n"

, count)

;}

func1 執行的基本操作次數為 :

f

(n)= n^2+

2*n +

10;

1.若 n = 10 f(n) = 130

2.若 n = 100 f(n) = 10210

3.若 n = 1000 f(n) = 1002010

在實際中我們計算時間複雜度時,我們其實並不一定要計算精確的執行次數,而只需要大概執行次數,我們使用大o的漸進表示法

2.2.2.大o的漸進表示法

大o符號(big o notation):是用於描述函式漸進行為的數學符號。

推導大o階方法:

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

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

3.如果最高端項存在且不是1,則去除與這個專案相乘的常數。得到的結果就是大o階。

使用大o的漸進表示法以後,func的時間複雜度為:

1.若 n = 10 f(n) = 100

2.若 n = 100 f(n) = 10000

3.若 n = 1000 f(n) = 1000000

通過上面我們會發現大o的漸進表示法去掉了那些對結果影響不大的項,簡潔明瞭的表示出了執行次數。

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

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

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

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

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

最好情況:1次找到 (資料在陣列開頭)

最壞情況:n次找到 (資料在陣列末尾)

平均情況:n/2次找到

在實際中一般情況關注的是演算法的最壞執行情況,所以陣列中搜尋資料時間複雜度為o(n) 。

2.3.時間複雜度計算例題
1. 計算func1的時間複雜度

void

func1

(int n)

int m =10;

while

(m--

)printf

("%d\n"

, count)

;}

解答:func1基本操作執行了2n+10次,通過推導大o階方法可知,func1的時間複雜度為o(n)

2. 計算func2的時間複雜度

void

func2

(int n,

int m)

for(

int k =

0; k < n ;

++ k)

printf

("%d\n"

, count)

;}

解答:func2基本操作執行了m+n次,有兩個未知數m和n,故時間複雜度為o(n+m)

3. 計算func3的時間複雜度

void

func3

(int n)

printf

("%d\n"

, count)

;}

解答: func3基本操作執行了10次,通過推導大o階方法,10為常數,故時間複雜度為o(1)

4. 計算二分查詢的時間複雜度。

int

binaryfind

(int

*a,int n,

int x)

return-1

;

解答:二分查詢基本操作執行最好1次,最壞o(logn)次 (2^x = n;x = logn),故時間複雜度為o(logn).(logn在演算法分析中表示是底數為2,對數為n.)

5.計算遞迴斐波那契數列的時間複雜度

unsigned

intfibonacci

(size_t n)

解答:通過計算分析發現斐波那契數列遞迴了2^n次,時間複雜度為o(2^n)

3.空間複雜度

3.1.什麼是空間複雜度

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

3.2.空間複雜度計算例題
1. 計算氣泡排序的空間複雜度

void

bubblesort

(int

* a,

int n)

}--end;

if(exchange ==0)

break;}

}

氣泡排序使用了常數個額外空間,所以空間複雜度為o(1)

2. 計算階乘遞迴斐波那契數列的空間複雜度

unsigned

intfactorial

(size_t n)

斐波那契數列遞迴呼叫了n次,開闢了n個棧幀,每個棧幀使用了常數個空間。空間複雜度為o(n)

資料結構與演算法之美之 時間複雜度與空間複雜度

時間複雜度 漸進時間複雜度,表示演算法的執行時間與資料規模之間的增長關係 執行時間隨資料增長的變化趨勢 關注迴圈次數最多的一段 加法法則 總複雜度等於量級最大的那段 的複雜度,乘法法則 巢狀 的複雜度等於巢狀內外 複雜度的乘積 常見的時間複雜度 常量階 o 1 對數階o logn 線性階 o n 線...

資料結構與演算法 演算法的時間複雜度和空間複雜度

無論 執行了多少行,只要是沒有迴圈等複雜結構,那這個 的時間複雜度就都是o 1 如 int i 1 int j 2 i j int m i j 上述 在執行的時候,它消耗的時候並不隨著某個變數的增長而增長,那麼無論這類 有多長,即使有幾萬幾十萬行,都可以用o 1 來表示它的時間複雜度。例如有乙個迴圈...

資料結構與演算法 時間複雜度與空間複雜度

解決乙個問題的方法可能有很多,但能稱得上演算法的,首先它必須能徹底解決這個問題 稱為準確性 且根據其編寫出的程式在任何情況下都不能崩潰 稱為健壯性 程式和演算法是完全不同的概念。演算法是解決某個問題的想法 思路 而程式是在根據演算法編寫出來的真正可以執行的 例如,要依次輸出一維陣列中的資料元素的值,...