複雜度的總結概要
最近複習演算法,先總結一下最基本的時間複雜度概念和判斷方法。
常用七種
不考慮常數係數。
判斷: **根據n的情況執行的次數
o(1)
var n =
1000
;console.
log(
'輸出一次:'
+ n )
console.
log(
'輸出二次:'
+ n )
console.
log(
'輸出三次:'
+ n )
不關心常數係數,無論輸出多少次,複雜度都是o(1)
o(n)
var n =5;
for(
var i =
1; i <= n ; i++
)
隨著n的變化執行次數與n成線性關係
另外,兩次for迴圈是並列執行,時間複雜度還是o(n)
o(n^2)
var n =5;
for(
var i =
1; i <= n ; i++
)}
二次迴圈巢狀時間複雜度變為o(n^2)
o(log(n))
var n =4;
for(
var i =
1; i <= n ; i=i*2)
如果n為4,i 執行2次 ,函式體執行次數為 log2(n),所以其時間複雜度為o(log(n))
o(k^n)
var
fib=
function
(n)else
}console.
log(
fib(5)
);
遞迴求斐波那契數列,指數級的時間複雜度;畫樹求解。
遞迴函式的時間複雜度計算原理: 主定理;
常見四種演算法的時間複雜度:
(有序陣列)二分查詢:o(log(n))
二叉樹遍歷: o(n) 每次一分為二,每邊以相等的時間複雜度計算, 每個節點只訪問一次
有序矩陣)二分查詢:o(n)
歸併排序(所有排序中最優的時間複雜度):o(nlogn)
降低時間、空間複雜度,節約計算機資源
例:計算: 1+2+3+…+100
方法一:for迴圈累加 o(n)
var sum =0;
for(
var i =
0; i <=
100; i++
)
方法二: 公式法 求和公式 sum=n(n+1)/2 o(1)
常見面試總結
二叉樹遍歷- 前序、中序、後序:o(n) n表示二叉樹的樹的節點總數。遍歷二叉樹,每個節點都會被訪問,且只被訪問一次。
圖的遍歷: o(n) 每個節點訪問一次
搜尋演算法:dfs深度優先、bfs廣度優先的時間複雜度: o(n) 只訪問一次節點,n為搜尋空間節點總數
空間複雜度
1.陣列的長度:空間複雜度。 一維陣列o(n);二維陣列o(n^2)
2.遞迴的深度
3.兩者結合,取最大值
複雜度分析 時間複雜度分析和空間複雜度分析
其實,只要講到資料結構與演算法,就一定離不開時間 空間複雜度分析。而且我個人認為,複雜度分析是整個演算法學習的精髓,只要掌握了它,資料結構和演算法的內容基本上就掌握了一半。1.時間複雜度分析 對於剛才羅列的複雜度量級,我們可以粗略地分為兩類,多項式量級和非多項式量級。其中,非多項式量級只有兩個 o ...
複雜度分析 時間複雜度 空間複雜度
執行效率是演算法的乙個重要的考量指標,演算法的執行效率用時間 空間複雜度來衡量。今天我們來學習一下複雜度的分析。通常我們可以通過執行程式來獲得演算法的真正的執行時間,這種方法我們可以稱為事後統計法,但這種方法得到的是具體的資料,測試結果很依賴測試環境,而且受資料規模影像最大。因此,我們需要乙個不需要...
簡單總結 複雜度分析
執行次數為線性的,t n def eatbread n for i in n print eat bread i 執行次數為對數,t n logn 每一次都是減去一半 def eatbread n i 1while i n i i 2print eat bread 執行次數為常數,t n 1.def...