算法時間複雜度用來度量算法執行時間的多少,用大O階表示,即T(n)=O(f(n)),其中n爲問題規模,也就是問題的大小。算法
既然要理解時間複雜度,咱們首先理解術語中的兩個關鍵詞——「算法」和「時間」,理解了它倆就成功一半了。函數
首先看「算法」,算法是解決特定問題的方法,在計算機領域裏須要將算法用計算機能聽懂的語言描述給它聽,明白以後它才能使用運算能力解決問題。計算機能聽懂的語言,固然是程序代碼了(還需編譯器將代碼翻譯成2進制流),也就是一系列的指令。翻譯
再看「時間」,此處的時間指執行算法消耗的時間,也就是計算機執行前面所說的一系列指令的時間。這個時間受blog
的影響。在給定軟硬件環境下,其實就是你在本身電腦上寫算法的時候,算法執行時間只受算法自己的好壞和要處理的問題的規模影響。這樣就將4個影響因素減小爲2個,簡化了問題。ip
既然執行時間受算法好壞和問題規模n的影響,那麼執行時間就是它倆的函數。編譯器
那這個函數到是啥樣的呢?io
咱們繼續分析,給定問題規模n以後,優秀的算法可能哐哐哐執行幾回就搞定了,通常的算法可能吭哧吭哧執行不少不少次才搞定;當給定算法時,問題規模n很小時,可能執行幾回就搞定,而n很大時,就得執行不少次了。因此算法優劣和問題規模n改變時,執行次數(基本操做數)將改變,因此執行次數就是算法優劣和問題規模n的函數。編譯
到此爲止,咱們得出一個簡單的結論:算法執行時間能夠用執行次數表示。class
世界豐富多彩,同一個問題有不一樣的解決辦法,好比餓了,能夠吃米粉也能夠吃包子,能夠一我的吃也能夠一我的吃(hh)。對應算法領域,同一個問題也能夠用不一樣的算法解決,既然這樣,那不一樣的算法之間確定有優劣之分,如何評價呢?效率
最簡單的評價方法是把兩個算法拉過來比誰解決問題的速度快,誰的執行時間短,誰的執行次數少。
給定算法時,執行次數變爲問題規模n的函數。好比一個算法是a,一個算法是b,問題規模爲n,那麼執行次數分別爲Ca=f(n),Cb=g(n)。如今將比較兩個算法的執行次數的問題轉換爲比較兩個函數f(n),g(n)的問題。那比較兩個函數的什麼性質呢?固然是比較隨着問題規模n增大,執行次數的增長狀況,也就是f(n),g(n)的增加狀況。比如讓兩我的吃一百個包子,一我的一小時吃完,一我的一分鐘吃完,明顯一分鐘吃完的那我的能力強,效率高,吃法(算法)更先進(hh)。
要比較兩個函數的增加狀況,最好的辦法是比較函數的一階導,這樣最精確,可是考慮到不少時候只須要大致瞭解算法的優劣就能夠了,因此咱們就直接考察對增加速度影響最大的一項,這一項就是函數的最高階數。爲了說明最高階數對函數增加影響最明顯,咱們看兩幅圖。
圖中4條曲線分別表示4種不一樣的執行次數表達式,從圖中能夠看出,只要最高項的階數相同,4種表達式值受其餘項的影響很小,隨着n增大,幾乎能夠忽略不計,甚至能夠忽略與最高項相乘的常數。
既然能夠只考慮最高項的階數,以簡化問題,達到估算的目的,爲什麼不這樣作呢?
那總得給這種狀況一個恰當的表示方式吧?和其餘領域同樣,還得用符號來表示,這個符號就是大名鼎鼎的大O。
T(n)=O(f(n))
其中,T(n)就是算法的時間複雜度;
f(n)表示執行與算法優劣和問題規模有關的執行數;
O()表示一種運算符號,和+-*/相似。做用就是去除其餘項,包括與最高項相乘的常數,只保留最高項,好比f(n)=2n^2+1,O(f(n))=O(n^2)
好了,咱們已經推導出了時間複雜度的大O表示,應該對算法時間複雜度有個不錯的認識了吧。
最後回顧一下推導過程:
算法執行時間->4種因素影響->去除軟硬件因素,考慮算法優劣和問題規模n兩種因素->算法執行次數->簡化:忽略其餘項->大O表示法表示算法時間複雜度