介紹時間複雜度和空間複雜度之前,我們先了解乙個概念,什麼是演算法效率?
演算法效率:
演算法效率分析分為兩種:第一種是時間效率,第二種是空間效率。時間效率被稱為時間複雜度,而空間效率被稱作空間複雜度。 時間複雜度主要衡量的是乙個演算法的執行速度,而空間複雜度主要衡量乙個演算法所需要的額外空間,在計算機發展的早期,計算機的儲存容量很小。所以對空間複雜度很是在乎。但是經過計算機行業的迅速發展,計算機的儲存容量已經達到了很高的程度。所以我們如今已經不需要再特別關注乙個演算法的空間複雜度。
時間複雜度
1.概念
時間複雜度的定義:在電腦科學中,演算法的時間複雜度是乙個函式,它定量描述了該演算法的執行時間。一 個演算法執行所耗費的時間,從理論上說,是不能算出來的,只有你把你的程式放在機器上跑起來,才能知道。但是我們需要每個演算法都上機測試嗎?是可以都上機測試,但是這很麻煩,所以才有了時間複雜度這個分析方式。乙個演算法所花費的時間與其中語句的執行次數成正比例,演算法中的基本操作的執行次數,為演算法的時間複雜度。
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)
通過上面我們會發現大o的漸進表示法去掉了那些對結果影響不大的項,簡潔明瞭的表示出了執行次數。
另外有些演算法的時間複雜度存在最好、平均和最壞情況:
最壞情況:任意輸入規模的最大執行次數(上界)
平均情況:任意輸入規模的期望執行次數
最好情況:任意輸入規模的最小執行次數(下界)
舉例:
在乙個長度為n陣列中搜尋乙個資料x
最好情況:1次找到 最壞情況:n次找到 平均情況:n/2次找到
在實際中一般情況關注的是演算法的最壞運**況,所以陣列中搜尋資料時間複雜度為o(n)
以下幾個例子進一步理解時間複雜度的計算:
void
func2
(int n)
int m =10;
while
(m--
)printf
("%d\n"
, count);}
//執行2n+10次,時間複雜度為o(n)
void
func3
(int n,
int m)
for(
int k =
0; k < n ;
++ k)
printf
("%d\n"
, count);}
//執行m+n次,m和n都是未知數,時間複雜度為o(m+n)
void
func4
(int n)
printf
("%d\n"
, count);}
//執行100次,100是常數,時間複雜度為o(1)
空間複雜度
空間複雜度是對乙個演算法在執行過程中臨時占用儲存空間大小的量度 。空間複雜度不是程式占用了多少 bytes的空間,因為這個也沒太大意義,所以空間複雜度算的是變數的個數。空間複雜度計算規則基本跟時間複雜度類似,也使用大o漸進表示法。
舉例:
// 計算bubblesort的空間複雜度
void
bubblesort
(int
* a,
int n)}if
(exchange ==0)
break;}
}//這裡使用了常數個額外空間,所以空間複雜度為 o(1)
// 計算fibonacci的空間複雜度
long
long
*fibonacci
(size_t n)
return fibarray ;
}//這裡動態開闢了n個空間,空間複雜度為 o(n)
資料結構 時間複雜度 空間複雜度
1.演算法效率 演算法效率可以用來衡量乙個演算法的好壞 演算法效率分析分為兩種 第一種是時間效率,第二種是空間效率.時間效率被稱為時間複雜度,空間效率被稱為空間複雜度.時間複雜度主要衡量的是乙個演算法的執行速度,而空間複雜度主要衡量乙個演算法所需要的額外空間,在計算機發展的早期,計算機的儲存容量很小...
資料結構時間複雜度和空間複雜度
1 演算法o n 關注n的階數,當數十分大的時候,常數可以忽略。o n 又稱為大o記法。2 t n o f n 隨著n變化而變化,f n 是某個函式,執行的次數等於時間,一般情況下,t n 增長最慢的演算法最優。4 推到o n 1,用1取代時間中所有加法常數 哪些可以忽略 2,在修改後的執行函式中,...
資料結構 時間複雜度和空間複雜度
通常我們衡量乙個演算法的複雜度時,會有兩種演算法效率分析方式 第一種是時間效率,第二種是空間效率。時間效率被稱為時間複雜度,而空間效率被稱作空間複雜度。時間複雜度主要衡量的是乙個演算法的執行速度,空間複雜度主要衡量一乙個演算法所需要的額外空間,在計算機發展的早期,計算機的儲存容量很小。所以對空間複雜...