時間複雜度一直很迷。。。。 在網上找了看了一些部落格,一句話,看不懂。。。。 於是自己去學了一下,總結為下面的。
演算法的效率,就是說乙個演算法的執行時間,它始終還是由我們執行每一行**的次數來決定。我們可為每乙個演算法編寫乙個測試程式,然後拿到機器上去跑,但是由於除了演算法本生,測試結果還受到很多其他因素的影響,列如cpu
的執行速度等不確定因素,而且我們也不可能為了每乙個演算法去編寫乙個測試程式這樣也不現實。
所以後來人們採用事前估算的方法,依據統計學。這種情況下拋開了其他所有的不確定因素,乙個演算法的效率由乙個演算法的本生好壞和輸入規模來決定。
例如:
當n
很大的時候,兩種演算法的差距就大了起來,第乙個是2n+2
次,第二個始終都是2
次。
上面的兩個演算法分別可以看做時間複雜度為n
和1
,下面來解釋為什麼是這樣。
研究演算法的複雜度,側重的研究輸入規模很大的情況,在這種情況下我們就可以忽略乙個複雜度中的一些小項,也就是執行次數特別大的情況,因為這樣才能判定乙個演算法的在某種場景下的好與壞,這個時候就需要利用統計學知識。我們接下來通過大量的例子來解釋。通過這幾個例子為後面的演算法時間複雜度做鋪墊。
例一將設a
演算法要做2n+3
次計算,b
需要做3n+1
次操作,你覺得哪乙個更快一點呢。下面來看看統計的結果。
從結果來看最開始演算法a1
不及b1
,當n
大於5
的時候,執行次數少於b1
,到後面完全勝過它,這就是輸入規模的重要性,而且我們看a2、b2
發現當輸入規模很大的時候常數項可以完全忽略。
函式的漸進增長: 給定兩個函式,f(n)、g(n)
,如果存在乙個整數n
當n>n
的時候,f(n)
總是比g(n)
大,那麼我們說f(n)
的漸進增長比g(n)
大。當例二
演算法c
為4n+8
,演算法d
為2n^2 + 8
圖上有錯,第二張圖為c1、c2, d1,d2
。
從觀察當中可以可以發現,當n
很大的時候,相乘的係數,影響也很小了,比如4n+8和n
,在圖上都重疊到一塊兒去了,但是對於c1、c2
,係數有影響,但是對比c、d
演算法的時候,可以看出係數並不影響比較。可以得出結論係數不影響兩個演算法之間的比較,因此也可以去掉。
例三演算法e
為2n^2+3n+1
,演算法f
為2n^3+3n+1
通過圖中對比e、f
兩個演算法,可以看到指數對於測試結果影響很大。
例四演算法g
為2n^2
,演算法h
為3n+1
,演算法i
為2n^2+3n+1
因此我們可以得出結論:判斷乙個演算法的效率的時候,函式中的常數和次要項都可以忽略,而更應改關注最高項的介數。
用大寫o()
來作為時間複雜度的記法,稱為大o
記法
那麼我們怎麼來推導大o
階呢。首先我們需要計算出程式執行的次數,再按照下面總結出來的方式來求解,這裡的總結均來自前面的例子
其實就是這麼簡單。。。。,我在網上看到的其他文章語言實在太官方,明明簡單的東西被這些糟老頭子給整複雜了。下面來看幾個計算的例子:
上面的時間複雜度為o(1)
時間複雜度為o(n)
時間複雜度為o(n^2)
上面的例子為對數階。假設程式執行x
次退出迴圈,那麼可以得到等式2^x=n
,所以當x=log(2底數)n
的時候推出迴圈,執行次數為log(2)n + 1
,所以可以得到最終結果為o(logn)
還有乙個空間複雜度,空間可以換取時間,時間也可以換取空間,在實際當中往往要在二者之間達到乙個平衡
dfs時間複雜度 時間複雜度 空間複雜度
時間複雜度的數學證明方法相對比較複雜,通常在工程實際中,會分析就好。注意 只看最高複雜度的運算 int for for for for int遞迴如何分析時間複雜度?常數係數可以忽略,在分析時不用考慮,只要說以上術語即可。主定理 master throrem 上述第四種是歸併排序,所有排序演算法,最...
時間複雜度 空間複雜度
時間複雜度 在電腦科學中,演算法的時間複雜度是乙個函式,它定性描述了該演算法的執行時間。這是乙個關於代表演算法輸入值的字串 的長度的函式。時間複雜度常用大o符號 表述,不包括這個函式的低階項和首項係數。計算時間複雜度的方法 1 只保留高階項,低階項直接丟棄 2 係數不要 3 執行次數是常數是為o 1...
時間複雜度 空間複雜度
演算法複雜度分為時間複雜度和空間複雜度。其作用 時間複雜度是指執行演算法所需要的計算工作量 而空間複雜度是指執行這個演算法所需要的記憶體空間。一 時間複雜度 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道...