3、空間複雜度
1.演算法效率
演算法效率分析分為兩種:第一種是時間效率,第二種是空間效率。時間效率被稱為時間複雜度,而空間效率被稱作空間複雜度。 時間複雜度主要衡量的是乙個演算法的執行速度,而空間複雜度主要衡量乙個演算法所需要的額外空間,在計算機發展的早期,計算機的儲存容量很小。所以對空間複雜度很是在乎。
但是經過計算機行業的迅速發展,計算機的儲存容量已經達到了很高的程度。所以我們如今已經不需要再特別關注乙個演算法的空間複雜度。
概念:演算法中的基本操作的執行次數,為演算法的時間複雜度。
請計算一下func1基本操作執行了多少次?
void
func1
(int n)
}for
(int k =
0; k <
2* n ;
++ k)
int m =10;
while
(m--
)printf
("%d\n"
, count)
;}
f(n)=n²+2*n+10
n = 10 f(n) = 130
n = 100 f(n) = 10210
n = 1000 f(n) = 1002010
實際中我們計算時間複雜度時,我們其實並不一定要計算精確的執行次數,而只需要大概執行次數,那麼這裡我們使用大o的漸進表示法。
大o符號(big o notation):是用於描述函式漸進行為的數學符號。
推導大o階方法:
1、用常數1取代執行時間中的所有加法常數。
2、在修改後的執行次數函式中,只保留最高端項。
3、如果最高端項存在且不是1,則去除與這個專案相乘的常數。得到的結果就是大o階。
使用大o的漸進表示法以後,func1的時間複雜度為:
n = 10 f(n) = 100
n = 100 f(n) = 10000
n = 1000 f(n) = 1000000
通過上面我們會發現大o的漸進表示法去掉了那些對結果影響不大的項,簡潔明瞭的表示出了執行次數。
另外有些演算法的時間複雜度存在最好、平均和最壞情況:
最壞情況:任意輸入規模的最大執行次數(上界)
平均情況:任意輸入規模的期望執行次數
最好情況:任意輸入規模的最小執行次數(下界)
例如:在乙個長度為n陣列中搜尋乙個資料x
最好情況:1次找到
最壞情況:n次找到
平均情況:n/2次找到
在實際中一般情況關注的是演算法的最壞運**況,所以陣列中搜尋資料時間複雜度為o(n)
分別計算下列函式的時間複雜度。
例項1:
void
func2
(int n)
int m =10;
while
(m--
)printf
("%d\n"
, count)
;}
例項2:
void
func3
(int n,
int m)
for(
int k =
0; k < n ;
++ k)
printf
("%d\n"
, count)
;}
例項3:
void
func4
(int n)
printf
("%d\n"
, count)
;}
例項4:
// 計算strchr的時間複雜度?
const
char
* strchr (
const
char
* str,
int character )
;
例項5:
// 計算bubblesort的時間複雜度?
void
bubblesort
(int
* a,
int n)}if
(exchange ==0)
break;}
}
例項6:
// 計算binarysearch的時間複雜度?
intbinarysearch
(int
* a,
int n,
int x)
return-1
;}
例項7:
// 計算階乘遞迴factorial的時間複雜度?
long
long
factorial
(size_t n)
例項8:
// 計算斐波那契遞迴fibonacci的時間複雜度?
long
long
fibonacci
(size_t n)
例項答案及分析:
例項1基本操作執行了2n+10次,通過推導大o階方法知道,時間複雜度為 o(n)
例項2基本操作執行了m+n次,有兩個未知數m和n,時間複雜度o(n+m)
例項3基本操作執行了10次,通過推導大o階方法,時間複雜度為 o(1)
例項4基本操作執行最好1次,最壞n次,時間複雜度一般看最壞,時間複雜度為 o(n)
例項5基本操作執行最好n次,最壞執行了(n*(n+1)/2次,通過推導大o階方法+時間複雜度一般看最壞,時間複雜度為 o(n^2)
例項6基本操作執行最好1次,最壞o(logn)次,時間複雜度為 o(logn) ps:logn在演算法分析中表示是底數為2,對數為n。有些地方會寫成lgn。(建議通過摺紙查詢的方式講解logn是怎麼計算出來的)
例項7通過計算分析發現基本操作遞迴了n次,時間複雜度為o(n)。
例項8通過計算分析發現基本操作遞迴了2n次,時間複雜度為o(2n)。(
3.空間複雜度
空間複雜度是對乙個演算法在執行過程中臨時占用儲存空間大小的量度 。空間複雜度不是程式占用了多少
bytes的空間,因為這個也沒太大意義,所以空間複雜度算的是變數的個數。空間複雜度計算規則基本跟實踐
複雜度類似,也使用大o漸進表示法。
空間複雜度是對乙個演算法在執行過程中臨時占用儲存空間大小的量度 。空間複雜度不是程式占用了多少bytes的空間,因為這個也沒太大意義,所以空間複雜度算的是變數的個數。空間複雜度計算規則基本跟時間複雜度類似,也使用大o漸進表示法。
例項1:
// 計算bubblesort的空間複雜度?
void
bubblesort
(int
* a,
int n)}if
(exchange ==0)
break;}
}
例項2:
// 計算fibonacci的空間複雜度?
long
long
*fibonacci
(size_t n)
return fibarray ;
}
例項3:
// 計算階乘遞迴factorial的空間複雜度?
long
long
factorial
(size_t n)
例項答案:
例項1使用了常數個額外空間,所以空間複雜度為 o(1)
例項2動態開闢了n個空間,空間複雜度為 o(n)
例項3遞迴呼叫了n次,開闢了n個棧幀,每個棧幀使用了常數個空間。空間複雜度為o(n)
01 時間複雜度 空間複雜度
1 時間頻度 乙個演算法中的語句執行次數稱為語句頻度或時間頻度。記為t n n稱為問題的規模,當n不斷變化時,時間頻度t n 也會不斷變化。2 時間複雜度 若有某個輔助函式f n 使得當n趨近於無窮大時,t n f n 的極限值為不等於零的常數,則稱f n 是t n 的同數量級函式。記作t n f ...
1 時間複雜度
演算法的計算成本涵蓋許多方面,為確定計算成本的度量標準,我們不妨從計算速度這一重要因素入手。但是這一問題並不是容易直接上手回答,原因在於,運算時間是由許多因素綜合作用而決定的。即使是同一演算法,對於不同的輸入所需的運算時間並不相同。問題規模往往是決定計算成本的主要因素。一般的,問題規模越相近,相應的...
演算法效率度量 時間複雜度和空間複雜度
演算法效率的度量是通過時間複雜度和空間複雜度來描述的。乙個語句的頻度是指該語句在演算法中被重複執行的次數。演算法中所有語句的頻度之和記作t n 它是該演算法問題規模n的函式,時間複雜度主要分析t n 的數量級。演算法中的基本運算 最深層迴圈內的語句 的頻度與t n 同數量級,所以通常釆用演算法中基本...