時間複雜度

2021-08-28 16:47:09 字數 1579 閱讀 7320

一:直觀理解

先從至於

而在比如說構建乙個網路,每個點都和其他的點相連。顯然,每當我們增加乙個點,其實就需要構建這個點和所有現存的點的連線,而現存的點的個數是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 = nm = 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...

時間複雜度 空間複雜度

演算法複雜度分為時間複雜度和空間複雜度。其作用 時間複雜度是指執行演算法所需要的計算工作量 而空間複雜度是指執行這個演算法所需要的記憶體空間。一 時間複雜度 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道...