這是我架構師系列第一篇文章,也是個人開山之做吧,因此在從此的文章中,我以爲仍是要以通俗的比較容易理解的話來闡述問題。想要後續系列的文章,關注我,我會持續發佈(但願你不是那個只收藏不看的人)。算法
廢話很少說,若是咱們想要學好數據結構與算法,首先腦海中要時刻記住兩個關鍵詞彙,時間效率和空間效率。這個兩個詞彙貫穿了整個架構師知識體系。那什麼是時間效率和空間效率呢?通俗的理解就是:咱們使用兩個不一樣的程序去解決同一個問題,時間短的說明時間效率高,消耗空間小的說明空間效率高。如今回到咱們的數據結構題目上。數據結構
咱們在研究數據結構與算法的時候,其實就是在使用不一樣的數據結構和不一樣的算法去優化計算機的時間效率和空間效率。那麼有什麼數據機構還有算法有這麼好的性能呢?先對這些數據結構分個類。架構
1、數據結構的分類app
從上圖能夠看到,整個數據結構與算法研究的知識體系也就這麼多。還記得剛剛提到的時間效率與空間效率嘛?邏輯結構與存儲結構都是爲其服務的。而數據的運算是時間效率和空間效率的表現形式。
ide
2、數據結構的分析函數
數據之間的相互關係稱之爲邏輯結構。好比集合、線性結構(一對一)、樹形結構(一對多)、圖形結構(多對多)。性能
數據在計算機中的存儲形式稱之爲存儲結構。優化
順序存儲:他是用數據元素在存儲器中的相對位置來表示數據元素之間的邏輯關係spa
鏈式存儲:在每個數據元素中增長一個存放地址的指針,用指針表示元素之間的邏輯關係。指針
3、時間複雜度與空間複雜度
在文章一開始就描述了時間效率和空間效率,那麼他們兩個該怎麼使用數據去量化呢?或者說是咱們該怎麼去衡量時間效率和空間效率呢?這就用到了時間複雜度和空間複雜度。
一、首先看時間複雜度:
想要了解時間複雜度,就須要先了解時間頻度。一個算法花費的時間與算法中語句的執行次數成正比例,哪一個算法中語句執行次數多,它花費時間就多。一個算法中的語句執行次數稱爲語句頻度或時間頻度。記爲T(n)。
接下來就引入了時間複雜度的概念。看一下比較官方的定義吧:通常狀況下,算法中基本操做重複執行的次數是問題規模n的某個函數,用T(n)表示,如有某個輔助函數f(n),使得當n趨近於無窮大時,T(n)/f(n)的極限值爲不等於零的常數,則稱f(n)是T(n)的同數量級函數。記做T(n)=O(f(n)),稱O(f(n)) 爲算法的漸進時間複雜度,簡稱時間複雜度。是否是比較難以理解,說白了時間複雜度就是描述時間的規模,好比說時間頻度是T(n),時間複雜度就是O(n)。時間頻度是T(n+n)的時候,時間複雜度仍是O(n)。也就是他的時間規模就是n這個層次了。
常見的算法的時間 複雜度之間的關係爲:
O(1)<O(logn)<O(n)<O(nlog n)<O(n2)<O(2n)<O(n!)<O(nn)
舉個例子吧:
a=0; //(1)
for(i=1;i<=n;i++) //(2)
for(j=1;j<=n;j++) //(3)
a++; //(4)
語句(1)執行1次,
語句(2)執行n次
語句(3)執行n2次
語句(4)執行n2次
T(n) = 1+n+2n2= O(n2)
二、空間複雜度
空間複雜度就比較容易理解了,空間複雜度是對一個算法在運行過程當中臨時佔用存儲空間大小的一個量度,一樣反映的是一個空間規模,咱們用 S(n) 來定義。
空間複雜度比較經常使用的有:O(1)、O(n)、O(n²),