一:時間複雜度
1:什麼是時間複雜度?
演算法的時間複雜度是乙個函式,它定性的描述了該演算法的執行時間,乙個演算法執行所消耗的時間。乙個演算法所花費的時間與其中語句的執行次數成正比,演算法中基本操作的執行次數,為演算法的時間複雜度。
2:時間複雜度為什麼看的是最差情況?
理由如下:
3:為什麼時間複雜度看的是執行次數而不是執行時間?
乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。
4:一般演算法的時間複雜度怎麼求?
(1)找出演算法的基本語句
演算法中執行次數最多的那條語句就是基本語句,通常是最內層迴圈的迴圈體。
(2)計算基本語句執行次數的數量級
只需計算基本語句執行次數的數量級,這就意味著只要保證基本語句的執行次數的函式中的最高次冪正確即可,可以忽略很多低次冪和最高次冪的係數,這樣能構簡化演算法分析,並且使注意力集中在最重要的一點上:增長率;
(3)用大o記號表示演算法的時間效能
將基本語句執行次數的數量級放到大o記號中
如果演算法中包含巢狀的迴圈,則基本語句通常是最內層的迴圈體,如果演算法中包含並列的迴圈,則將並列的時間複雜度相加
例如:
for
(int i=
0;i)for
(int i=
0;i)}
第乙個for迴圈的時間複雜度為o(n),第二個for迴圈的時間複雜度為o(n2),則整個演算法的時間複雜度為o(n+n2)=o(n2);
常見演算法的時間複雜度從小到大依次為:
ο(1)<ο(log2n)<ο(n)<ο(nlog2n)<ο(n2)<ο(n3)<…<ο(2n)<ο(n!)
5:特殊演算法的時間複雜度
二分法的時間複雜度為o(logn),二分演算法是分治演算法的一種特殊情況,分治演算法的時間複雜度為o(n),二分演算法是比較一次,扔掉不符合條件的一半,分治不能這麼做,他只是做了劃分,但並不能減小規模。
分析方法:
二分:通過o(1)的操作,將規模為n的問題,變為規模為n/2的問題
即:t(n)=t(n/2)+o(1)
t
(n)=
t(n/2)
+o(1
)t(n)=
t(n/4)
+2*o
(1).
..共log
(n)次..
.t(n)=t(
1)+logn*o(
1)
分治:通過o(1)的操作,將規模為 n 的問題變成了2個 n/2 的問題。
即:t(n)=2t(n/2)+o(1)
t
(n)=
2t(n/2)
+o(1
)t(n)=
4t(n/4)
+3*o
(1).
..共log
(n)次..
.t(n)=nt(
1)+(2logn-
1)*o(1
)t(n)=
o(n)
二:空間複雜度
1:什麼是空間複雜度?
空間複雜度是對乙個演算法在執行過程中臨時占用儲存空間大小的量度,計做s(n)=o((f(n)),一般遞迴演算法的空間複雜度為o(n)。乙個演算法的優劣主要從執行的時間和所需占用的儲存空間兩個方面來衡量。
2:計算空間複雜度
乙個程式的空間複雜度分為兩部分:固定不變的部分和可變部分
固定不變的部分:部分空間的大小與輸入/輸出的資料的個數多少,數值無關。主要包括指令空間(即**空間),資料空間(常量,簡單變數)所沿用的空間,這部分屬於靜態空間。
可變部分:這部分空間主要包括動態分配的空間,以及遞迴棧所需要的空間,這部分的空間與演算法有關。
乙個演算法所需的儲存空間用f(n)表示。s(n)=o(f(n)) 其中n為問題的規模,s(n)表示空間複雜度。
3.分析斐波那契演算法的時間複雜度
斐波那契數列,又稱**分割數列,指的是這樣乙個數列:0、1、1、2、3、5、8、13、21、34、……在數學上,斐波納契數列以如下被以遞迴的方法定義:f(0)=0,f(1)=1,f(n)=f(n-1)+f(n-2)(n≥2,n∈n*)
遞迴法:
#include
using namespace std;
intfeibonacci
(int n)
if(n ==1)
else
}int
main()
時間複雜度分析:
求解法f(n),必須先計算出f(n-1)和f(n-2),計算f(n-1)和f(n-2),又必須先計算出f(n-3)和f(n-4)…以此類推,直至必須先計算出f(1)和f(0),然後逆推得到f(n-1)和f(n-2),從而得到法f(n)需要計算很重複的值,在時間上造成了很大的消耗,時間複雜度為o(2^n)即2的n次方。
非遞迴:
#include
using namespace std;
intfeibonacci
(int n)
if(n<=2)
else
return num1 + num2;}}
intmain()
時間複雜度分析:
從n>2開始計算,用f(n-1)和f(n-2)求出結果,這樣就避免了大量的重複計算,它的效率比遞迴演算法的效率快很多,演算法的時間複雜度與n成正比,即演算法的時間複雜度為o(n);
複雜度分析 時間複雜度 空間複雜度
執行效率是演算法的乙個重要的考量指標,演算法的執行效率用時間 空間複雜度來衡量。今天我們來學習一下複雜度的分析。通常我們可以通過執行程式來獲得演算法的真正的執行時間,這種方法我們可以稱為事後統計法,但這種方法得到的是具體的資料,測試結果很依賴測試環境,而且受資料規模影像最大。因此,我們需要乙個不需要...
複雜度分析 時間複雜度分析和空間複雜度分析
其實,只要講到資料結構與演算法,就一定離不開時間 空間複雜度分析。而且我個人認為,複雜度分析是整個演算法學習的精髓,只要掌握了它,資料結構和演算法的內容基本上就掌握了一半。1.時間複雜度分析 對於剛才羅列的複雜度量級,我們可以粗略地分為兩類,多項式量級和非多項式量級。其中,非多項式量級只有兩個 o ...
複雜度分析(上)時間複雜度 空間複雜度
為了肉眼 實時 快速地來分析出 的複雜度,我們需要乙個不用具體的測試資料來測試,就可以粗略地估計演算法的執行效率的方法。時間複雜度 空間複雜度 表示演算法的執行時間與資料規模之間的增長關係。每行 對應的 cpu 執行的個數 執行的時間都不一樣,但是,我們這裡只是粗略估計,所以可以假設每行 執行的時間...