關於演算法複雜度:
演算法複雜度是我們來衡量乙個演算法效率的標準,主要分為時間複雜度和空間複雜度。時間複雜度就是指演算法**在執行最終得到我們想要的結果時所消耗的時間,而空間複雜度則是指演算法中用來儲存的資料結構所占用的空間。
大o複雜度表示法:
大o複雜度表示法描述演算法的效能和複雜程度。舉例如下:
function
total
(n)return sum;
// t
}
若執行每一行的時間都為 t,for 迴圈相當於執行了 n 次,所以這一段**總執行時間為 (t+nt+nt+t) = (2n+2)t。
function
total
(n)}
return sum;
//t
在第乙個 for 迴圈執行 n 次的同時,第二個 for 迴圈執行了 n*n 次,這段**總執行時間為(t+nt+n*n*t*2+t)=(2n*n+n+2)t。
上邊兩個函式的執行時間可以標記為 t(n) = o(2n+2) 和 t(n) = o(2n*n+n+2)。這就是大 o 時間複雜度表示法,它不代表**真正的執行時間,而是表示**隨資料規模增長的變化趨勢,簡稱時間複雜度。
當 n 很大時,我們可以忽略常數項,只保留乙個最大量級即可。所以上邊的**執行時間可以簡單標記為 t(n) = o(n) 和 t(n) = o(n2)。
時間複雜度分析
時間複雜度的取值
for
(var i =
0; i < n; i++
)
在分析的時候,只需要關心哪個**塊迴圈次數最多的那段**,比如說剛才的第乙個例子,迴圈最多的**塊是這兩行,迴圈都是n次。
最大值原則:總複雜度等於最大的**塊的複雜度
function
total
(n)}
// 第二個 for 迴圈
var sum2 =0;
for(
var i=
0;i<
1000
;i++
)// 第三個 for 迴圈
var sum3 =0;
for(
var i =
0; i < n; i++
)return
}
分別分析每一段迴圈時間複雜度,取他們最大的量級決定整段**複雜度。
第一段,時間複雜度 o(n^2)。
第二段,時間複雜度可以忽略,迴圈執行了 1000 次,是個常數量級,儘管對**的執行時間會有影響,但是當 n 無限大的時候,就可以忽略。
第三段,時間複雜度o(n)。
綜上所述,所以上述**的時間複雜度為 o(n^2)。
乘法原則:巢狀**複雜度等於巢狀內外**複雜度乘積
function
f(i)
return sum;
}function
total
(n)}
total方法時間複雜度o(n),f方法的時間複雜度o(n)。所以整段**的時間複雜度o(n2)。
常見的時間複雜度分析
對應的增長率如下圖所示
時間複雜度可以分為兩類,多項式量級和非多項式量級。其中,非多項式量級只有兩個:o(2n) 和 o(n!),當資料規模 n 增長時,非多項式量級的執行時間就會急劇增加,所以,非多項式量級的**演算法是非常低效的演算法。
空間複雜度分析
空間複雜度的話和時間複雜度類似推算。 所謂空間複雜度就是表示演算法的儲存空間和資料規模之間的關係。
時間複雜度的推算,忽略掉常數量級,每次陣列賦值都會申請乙個空間儲存變數。
function
initarr
(n)}
此函式的空間複雜度為 o(n)。 演算法複雜度 時間複雜度和空間複雜度
1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...
演算法複雜度 時間複雜度和空間複雜度
演算法複雜度 時間複雜度和空間複雜度 關鍵字 演算法複雜度 時間複雜度 空間複雜度 1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時 間多,哪個演算法花費的時間少就可以...
演算法複雜度 時間複雜度和空間複雜度
演算法的時間複雜度是指執行演算法所需要的計算工作量。n稱為問題的規模,當n不斷變化時,時間頻度t n 也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t n 表示,若有某個輔助函式f n 存在乙個正...