好程式設計師Java培訓分享演算法入門到精通之02演算法複雜度(一)

好程式設計師發表於2020-06-16

  好程式設計師 Java 培訓分享 演算法入門到精通之02 演算法複雜度 ( ) 一、概述 演算法複雜度又分為時間複雜度和空間複雜度。本節主要是介紹時間複雜度。時間複雜度表示計算機執行一段演算法所需要的時間。對於計算機來說,解決同一個問題不同的演算法,所需時間越少的演算法越優(不考慮空間問題),所以時間複雜度是衡量一個演算法好壞的指標之一。

二、大O符號

衡量時間複雜度通常使用”大O符號“。什麼是大O符號?我們需要先看看一些數學知識:函式和極限。

2.1、數學舉例:

00001.  一元二次函式f(x)=2x^2+2x+2;

00002.  x趨於無窮大的時候,記作x—>∞。

00003.  x->∞,f(x)=2x^2+2x+2 = 2x^2 = 2x^2。

上述第3項,當x無窮大的時候2x^2+2x+2約等於2x^2,在極限思想(演算法分析)裡面可以理解為2x^2+2x+2=2x^2。原因如下:

x=5的時候:

2x^2+2x+2=62.

2x^2=50.

x=500的時候:

2x^2+2x+2=501002

2x^2=250000.

透過上面的例子,繼續增大x的值,甚至無窮大的時候,f(x)函式中的2x+2這一項就可以忽略不計了。所以x->∞時,(2x^2+2x+2)約等(2x^2),或者(2x^2+2x+2)=(2x^2)。並且在極限思想裡面,2x^2前面的係數2也是可以省略的。也就是說x->∞的時候,2x^2~x^2。

透過極限的思想,我們將函式f(x)=2x^2+2x+2,省略剩餘項為x^2。也就是說x->∞時,f(x)=2x^2+2x+2=x^2;使用大O符號表示:x->無窮大,f(x)=O(x^2)。

2.2、概念

O是用來刻畫被截斷的無窮級數尤其是漸近級數的剩餘項。大O符號表示函式的漸進性上界。就好比上面的數學舉例,函式f(x)=2x^2+2x+2 漸進級數的剩餘項就是x^2,記作O(x^2)。也就是說O(x^2)是f(x)的漸進性上界。

三、時間複雜度

題目:求1+2+3+……+n的和。(高斯演算法)

● 初級程式設計師的程式碼:

… …

    for (int i = 1; i <= n; i++) {

        sum+=i;

    }

… …

分析:

00001.  上述程式碼中的sum+=1執行多少次? 答案:n次。

00002.  int i=1執行1次。

00003.  i<=n執行n+1次。(因為for迴圈執行的順序,只有i大於n時才會停止迴圈,所以i=n+1的時候,還會再判斷一下i<=n,所以相比較而言會多執行一次)。

00004.  i++執行n次。

彙總一下,上述程式碼執行n+1+n+1+n=3n+2次。

如果用極限思維,n->∞,3n+2 ~ 3n ~ n;記作O(n)。O(n)就是上述程式碼的時間複雜度。

● 高階程式設計師的程式碼:

… …

   (1+n)*n/2

… …

如上,同樣的計算1加到n,採用高斯演算法就簡單多了。上述程式碼只需要執行1次,沒有迴圈。所以時間複雜度就是O(1)。

● 小結

O(1)和O(n)的區別是什麼呢?當上述”初級程式設計師程式碼“和”高階程式設計師程式碼”中的變數n不斷增大的時候,高斯演算法的時間複雜度基本不變,還是O(1)。但是“初級程式設計師程式碼”的時間複雜度就會增加。

對於計算機來說,高斯演算法求解1連續加到n的計算速度遠遠大於for迴圈的速度。速度越快,系統的效能就會越好。

 

總結

00001.  O(1)和O(n)都是時間複雜度的表示法。簡單理解1代表一個單位時間,n代表n個單位時間。

00002.  因為計算機硬體的不同,同樣的一個演算法可能時間是不一樣的,但是在同樣硬體的計算機上執行同樣的演算法的時間複雜度是一樣的,因為硬體不同導致的時間區別,所以常用“單位時間”這個詞,而不是具體的1s或者2s。

00003.  時間複雜度的計算用到的符號和概念涉及到數學的函式和極限的知識點,如果忘記的同學,可以複習一下。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913864/viewspace-2698805/,如需轉載,請註明出處,否則將追究法律責任。

相關文章