一:直觀理解
先從至於
而在比如說構建乙個網路,每個點都和其他的點相連。顯然,每當我們增加乙個點,其實就需要構建這個點和所有現存的點的連線,而現存的點的個數是n,所以每增加1,就需要增加n個連線,那麼如果我們增加n個點呢,那這個連線的個數自然也就是
無論是翻試卷,還是建立網路,每增加乙份試卷,每增加乙個點,都需要給演算法執行人帶來n量級的工作量,這種演算法的複雜度就是
然後是假如有32份試卷,你丟一次,還剩16份 ,丟兩次,還剩下8 份,丟三次,就只剩下4份了,可以這麼一直丟下去,丟到第五次,就只剩下乙份了。而
也就是大約需要
理解了這一點,就可以理解快速排序為什麼是
2.1 - 大o表示法
用o(n)來體現演算法時間複雜度的記法被稱作大o表示法
一般我們我們評估乙個演算法都是直接評估它的最壞的複雜度。
大o表示法o(f(n))
中的f(n)
的值可以為1、n、logn、n^2 等,所以我們將o(1)、o(n)、o(logn)、o( n^2 )分別稱為常數階、線性階、對數階和平方階。下面我們來看看推導大o階的方法:
推導大o階
推導大o階有一下三種規則:
用常數1取代執行時間中的所有加法常數只保留最高端項去除最高端的常數
舉好多栗子
let sum = 0, n = 10; // 語句執行一次
let sum = (1+n)*n/2; // 語句執行一次
console.log(`the sum is : $`) //語句執行一次
這樣的一段**它的執行次數為 3 ,然後我們套用規則1,則這個演算法的時間複雜度為o(1),也就是常數階。
let i =0; // 語句執行一次
while (i < n) `); //語句執行n次
i++; // 語句執行n次
}
這個演算法中**總共執行了 3n + 1次,根據規則 2->3,因此該演算法的時間複雜度是o(n)。
let number = 1; // 語句執行一次
while (number < n)
上面的演算法中,number每次都放大兩倍,我們假設這個迴圈體執行了m次,那麼2^m = n
即m = logn
,所以整段**執行次數為1 + 2*logn,則f(n) = logn
,時間複雜度為o(logn)。
for (let i = 0; i < n; i++)
}
上面的巢狀迴圈中,**共執行 2*n^2 + n,則f(n) = n^2
。所以該演算法的時間複雜度為o(n^2 )
常見時間複雜度的比較
o(1)
dfs時間複雜度 時間複雜度 空間複雜度
時間複雜度的數學證明方法相對比較複雜,通常在工程實際中,會分析就好。注意 只看最高複雜度的運算 int for for for for int遞迴如何分析時間複雜度?常數係數可以忽略,在分析時不用考慮,只要說以上術語即可。主定理 master throrem 上述第四種是歸併排序,所有排序演算法,最...
時間複雜度 空間複雜度
時間複雜度 在電腦科學中,演算法的時間複雜度是乙個函式,它定性描述了該演算法的執行時間。這是乙個關於代表演算法輸入值的字串 的長度的函式。時間複雜度常用大o符號 表述,不包括這個函式的低階項和首項係數。計算時間複雜度的方法 1 只保留高階項,低階項直接丟棄 2 係數不要 3 執行次數是常數是為o 1...
時間複雜度 空間複雜度
演算法複雜度分為時間複雜度和空間複雜度。其作用 時間複雜度是指執行演算法所需要的計算工作量 而空間複雜度是指執行這個演算法所需要的記憶體空間。一 時間複雜度 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道...