時間複雜度和空間複雜度

2021-10-13 09:51:26 字數 3183 閱讀 6606

在聊時間複雜度和空間複雜度之前我們先來了解一下演算法的效率吧。

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

時間複雜度的概念

大o的漸進表示法

常見的時間複雜度舉例

時間複雜度的概念

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

大o的漸進表示法t(n)=o(f(n));

在乙個演算法存在最好、平均、最壞三種情況,我們一般關注的是最壞情況(最壞的情況都考慮到了,平均和最好就不用看了)而且最壞情況出現的比較頻繁。

一般o(n)的計算方法:

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

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

3、如果最高端項存在且不是1,則去除常數即可。

注意:4.遞迴演算法的時間複雜度為:遞迴總次數*每次遞迴中基本操作執行的次數。

常見的時間複雜度有以下七種:o(1)常數型;o(log2n)對數型,o(n)線性型,o(nlog2n)二維型,o(n2)平方型,o(n3)立方型,o(2^n)指數型。

常見的時間複雜度舉例

例項1:

// 計算func2的時間複雜度?

void

func2

(int n)

int m =10;

while

((m--

)>0)

system.out.

println

(count)

;}

例項1基本操作執行了2n+10次,通過推導大o階方法知道,時間複雜度為 o(n)

例項2:

// 計算func3的時間複雜度?

void

func3

(int n,

int m)

for(

int k =

0; k < n ; k++

)system.out.

println

(count)

;}

例項2基本操作執行了m+n次,有兩個未知數m和n,時間複雜度為 o(n+m)

例項3:

// 計算func4的時間複雜度?

void

func4

(int n)

system.out.

println

(count)

;}

例項3基本操作執行了100次,通過推導大o階方法,時間複雜度為 o(1)

例項4:

// 計算bubblesort的時間複雜度?

void

bubblesort

(int

array)}if

(sorted ==

true)}

}

例項4基本操作執行最好n次,最壞執行了(n*(n-1))/2次,通過推導大o階方法+時間複雜度一般看最壞,時間複雜度為 o(n^2)

例項5:

// 計算binarysearch的時間複雜度?

intbinarysearch

(int

array,

int value)

return-1

;}

例項5基本操作執行最好1次,最壞o(logn)次,時間複雜度為 o(logn) ps:logn在演算法分析中表示是底數為2,對數為n。有些地方會寫成lgn。

例項6:

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

long

factorial

(int n)

例項6通過計算分析發現基本操作遞迴了n次,時間複雜為o(n)

例項7:

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

intfibonacci

(int n)

例項7通過計算分析發現基本操作遞迴了2n次,時間複雜度為o(2n)。

常見時間複雜度的比較

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

舉例

例項1

// 計算bubblesort的空間複雜度?

void

bubblesort

(int

array)}if

(sorted ==

true)}

}

例項1使用了常數個額外空間,所以空間複雜度為 o(1)

例項二

// 計算fibonacci的空間複雜度?

int[

]fibonacci

(int n)

return fibarray;

}

例項2動態開闢了n個空間,空間複雜度為 o(n)

例項三

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

long

factorial

(int n)

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

其實時間複雜度和空間複雜度與排序密切相關,之後會詳細介紹。這次就先到這裡吧。

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

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

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

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

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

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