時間複雜度和空間複雜度

2021-09-25 12:30:45 字數 1735 閱讀 3386

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

2.1 概念

演算法的時間複雜度是乙個函式,它定量描述了該演算法的執行時間。演算法中的基本操作的執行次數,為演算法的時間複雜度。

2.2 大o的漸進表示演算法

// 請計算一下func1基本操作執行了多少次?

void

func1

(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.

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

下面給出推導大o階方法

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

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

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

使用大o的漸進表示法後,func1的時間複雜度為:o(n^2)

2.3 時間複雜度例題

下面給出例題:

例一:

// 計算階乘遞迴factorial的時間複雜度?

long

long

factorial

(size_t n)

例一解答:基本操作遞迴了n次,時間複雜度為o(n)。

例二:

// 計算斐波那契遞迴fibonacci的時間複雜度?

long

long

fibonacci

(size_t n)

例二解答:基本操作遞迴了2的n次方次,時間複雜度為o(2^n)。

2.4 情況分類

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

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

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

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

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

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

例:

// 計算階乘遞迴factorial的時間複雜度?

long

long

factorial

(size_t n)

例題解答:遞迴呼叫了n次,開闢了n個棧幀,每個棧幀使用了常數個空間。空間複雜度為o(n)。

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

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

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

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

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

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