一.什麼是時間複雜度呢?
解析:時間複雜度其實就是函式,函式計算執行的 基本操作次數。(這裡的函式是指數學裡面的函式,而不是c語法裡的函式)
為什麼時間複雜度不是計算執行的實踐而是次數呢?
解析:因為我們無法計算執行的時間,比如不同的機器不同的配置,同乙個演算法的執行時間都是不一樣的。所以我們只能在這裡計算執行的次數來表示演算法的效能。
首先來看乙個簡單的例子:
二.演算法分析的分類
1.最壞情況:任意輸入規模的最大執行時間(上界)
2.平均情況:任意輸入規模的期望執行實踐。
3.最好情況:任意輸入規模的最小執行實踐,通常好的情況不會出現。(下界)
例如:在乙個長度為n的線性表中搜尋乙個資料x
最壞情況:比較n次
平均情況:比較n/2次
最好情況:比較1次
注意:在實際中我們通常情況考量的是演算法的最壞的運**況。也就是說對於任意規模的n,演算法的最長執行時間。理由如下:
1.乙個演算法的最壞情況的執行時間是在任意輸入下的執行時間的上界。
2.對於某些演算法,最壞的情況出現的較為頻繁
3.大體上看,平均的情況與最壞的情況一樣差
演算法分析要保持大局觀:
1.忽略掉那些的常數
2.關注執行實踐的增長趨勢,關注函式式中增長最快的表示式。
三.o的漸進表示法(big o notation)
通常我們使用o記號法表示最壞運**況的漸進上界。其實也就是說我們使用o標記法表示時間複雜度,一般情況關注的是演算法的執行最壞的情況。
為什麼關注的是最壞的情況呢,我們以上圖中的f(n)=n^2+2*n+10說明:
所以這個演算法的實踐複雜度就是:o(n^2)
下面我們使用大o漸進表示法計算下面函式的時間複雜度
1.f(n)=n^3+n^2+n+1000,只需要關注n^3,所以o(n^3)
2.f(n)=10000*n*n+2*n+10,所以o(1000*n*n),實際是o(n^2),因為我們要忽略一些常數,看起來1000對執行結果也很有影響,不過當n足夠大的時候10000就顯得微不足道,可以忽略了,所以只要是常識就忽略掉
3.f(m,n)=2m+n---->:o(m+n)
4.f(m,n)=m*n----->o(m*n)
接下來我們深入了解:
1.二分查詢的時間複雜度:
2.遞迴演算法的時間複雜度:遞迴次數*遞迴每次走的次數
四.空間複雜度
解析:空間複雜度的計算和時間複雜度類似,也使用大o的漸進表示法。(開闢物件的個數,不是累積的個數)
要注意的是遞迴演算法的空間複雜度,假如遞迴深度為n*每次遞迴的空間大小,如果每次遞迴的空間為常數,則空間複雜度為o(n)
首先我們來看:以斐波那契數列的時間複雜度和空間複雜度
總結來看就是如下公式:
**實現如下:
int fib(int n)
其時間複雜度和空間複雜度在下面圖示中。
例: 1.
演算法複雜度 時間複雜度和空間複雜度
1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...
演算法複雜度 時間複雜度和空間複雜度
演算法複雜度 時間複雜度和空間複雜度 關鍵字 演算法複雜度 時間複雜度 空間複雜度 1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時 間多,哪個演算法花費的時間少就可以...
演算法複雜度 時間複雜度和空間複雜度
演算法的時間複雜度是指執行演算法所需要的計算工作量。n稱為問題的規模,當n不斷變化時,時間頻度t n 也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t n 表示,若有某個輔助函式f n 存在乙個正...