好程式設計師Java培訓分享演算法入門到精通之02演算法複雜度(一)
好程式設計師 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 好程式設計師Java培訓分享演算法入門到精通之-演算法概述程式設計師Java演算法
- 好程式設計師Java培訓分享演算法系列之演算法概述程式設計師Java演算法
- 好程式設計師Java培訓分享如何快速入門Java程式設計師Java
- 好程式設計師Java培訓分享如何快速入門Java程式設計程式設計師Java
- 好程式設計師Java培訓分享Java教程垃圾回收與演算法程式設計師Java演算法
- 好程式設計師Java培訓分享SpringBoot入門篇程式設計師JavaSpring Boot
- 好程式設計師Java培訓分享Java常見排序演算法之插入排序程式設計師Java排序演算法
- 好程式設計師Java培訓分享零基礎快速入門Java程式設計師Java
- 好程式設計師Java培訓分享Java之反射技術程式設計師Java反射
- 好程式設計師Java培訓分享Java程式設計技巧程式設計師Java
- 好程式設計師Java分享MySQL之SQL入門(一)程式設計師JavaMySql
- 好程式設計師Java培訓分享Java程式設計師技能提升指南程式設計師Java
- 好程式設計師Python培訓分享基礎入門Django程式設計師PythonDjango
- 好程式設計師Java培訓分享Java面試題集合篇一程式設計師Java面試題
- 好程式設計師Java培訓分享maven-概述程式設計師JavaMaven
- 好程式設計師Java培訓分享Java面試題之Java集合篇三程式設計師Java面試題
- 好程式設計師Java培訓分享Java類載入的過程概述程式設計師Java
- 好程式設計師Java培訓分享Java初學者必讀程式設計師Java
- 好程式設計師Java培訓分享Java多執行緒程式設計師Java執行緒
- 好程式設計師Java培訓分享Java包是什麼?程式設計師Java
- 好程式設計師Java培訓分享Java程式設計師常用的工具類庫程式設計師Java
- 好程式設計師Java培訓分享20個Java程式設計師基礎題程式設計師Java
- 好程式設計師Java培訓分享Java之命名、標示符、變數程式設計師Java變數
- 好程式設計師Java培訓分享BigDecimal的用法程式設計師JavaDecimal
- 好程式設計師Java培訓分享SpringBoot -YAML程式設計師JavaSpring BootYAML
- 好程式設計師Java培訓分享For迴圈詳解程式設計師Java
- 好程式設計師Java培訓分享Mybatis面試題集合程式設計師JavaMyBatis面試題
- 好程式設計師Java培訓分享本地快取如何設計程式設計師Java快取
- 好程式設計師大資料培訓分享Hadoop入門進階程式設計師大資料Hadoop
- 好程式設計師Java培訓分享初學入門須掌握4大核心基礎!程式設計師Java
- 好程式設計師Python培訓分享入門之元組列表字典詳解程式設計師Python
- 好程式設計師Java培訓分享學Java程式設計要注意什麼程式設計師Java
- 好程式設計師Java培訓分享實用的Redis面試題一程式設計師JavaRedis面試題
- 好程式設計師Java培訓分享Java面試題集合篇二程式設計師Java面試題
- 好程式設計師Java培訓分享Java和HTML的區別?程式設計師JavaHTML
- 好程式設計師Java培訓分享面試Java要注意什麼程式設計師Java面試
- 好程式設計師Java培訓分享Java物件導向概念解析程式設計師Java物件
- 好程式設計師Java培訓分享面試Java的注意事項程式設計師Java面試