算法和數據結構(一):數據結構

    前兩天面試阿里,最終死在了算法和數據結構上,痛苦不已。今天下了決心,來擼一把算法和數據結構。

    對於計算機來說,只有0110,它是不會關心什麼算法,什麼數據結構的。那麼,誰關心呢?當然是人啊。計算機是很傻逼的東西,它能做什麼,完全取決於你想讓它做什麼。於是,就有了算法和數據結構。數據結構用於存儲,算法用於計算。

1. 數據結構

   在接觸算法前,你需要先了解數據結構。數據結構分爲三層:

  (1) 邏輯結構(抽象層):

            集合結構:表示數據可以合成一個整體,但彼此間沒有任何聯繫,如數組;

            線性結構:數據間有一對一的關係,如隊列;

            樹形結構:數據間有一對多的關係,如二叉樹;

            網狀結構:數據間有多對多的關係;

  (2)物理結構(結構層(存儲方式)):

           順序結構:元素存在一定的連續空間內,如數組。特點是查詢快,插入和刪除慢,擴容複雜;

           鏈式結構:元素沒有存在連續的空間內,每個節點都持有一段數據和下一個元素的位置。特點是查詢慢,插入刪除快;

  (3)運算結構(實現層):

           創建和銷燬(分配資源、建立結構、釋放資源)、

           插入和刪除、

           查詢和修改(遍歷和迭代、隨機訪問)、

           排序和查找(算法應用)。

2. 堆棧和隊列  

      堆棧特點是:先進後出、後進先出。

      隊列特點是:先進先出。

      堆棧和隊列都可以用數組或二叉樹實現。

  阿里面試的時候問到了隊列相關的問題

(1)怎麼實現一個隊列?

        初始化一個數組(鏈表也可以),用來存儲元素。設定只能從一端插入數據,從另一端取數據,就形成了列表。

 (2)如果(用數組實現的)隊列滿了怎麼辦?

       那就從初始位置繼續存元素(前提是元素已經被取走)。

 (3)怎麼判斷一個隊列是空隊列還是滿隊列?

      無論是數組實現,還是鏈表實現,都需要記錄隊列的頭、尾和指針(記錄下一個元素位置)。當指針所在的位置是頭且不存在任何元素時,就是空的;當指針下一個位置是頭時,就說明隊列滿了(就掛在這了)。

(4)有界隊列和無界隊列(滴滴面試題目)

      用數組實現的隊列,需要指定初始容量,是有界隊列;用鏈表實現的隊列,可以無限的添加元素直到內存崩潰,是無界隊列。

(5)題外話:ArrayList和HashMap的初始容量滿了以後,會發生什麼事?LinkList爲什麼不用擔心容量問題?

     媽的,擴容啊!ArrayList基於數組實現,HashMap基於數組和鏈表實現,容量不夠當然得擴容了。LinkList基於鏈表,理論上來說,直到內存奔潰,它可以無限制的添加元素。

3. 鏈表和二叉樹

    啥是鏈表,啥是二叉樹?

    在計算機中,數據的存儲位置是可以不連續的,只要每個數據塊都能記住下一個數據塊的位置就能完成數據的存儲和查詢了。這樣做的好處是,不需要計算機一次性的分配那麼大的連續空間。這種數據結構就是鏈表了,其中的數據塊就叫做節點。如果每個節點不止記錄下一個節點的位置,還記錄了上一個節點的位置,那它就構成了雙向鏈表。那前邊的自然就是單向鏈表了。

   那二叉樹呢?針對單向鏈表,對每一個節點都進行一次裂變(都能產生兩個子節點),那麼,二叉樹就產生了。

   說到這兩貨,就不得不提到HashMap了。JDK1.7之前HashMap是用數組和鏈表實現的。JDK8默認也是數組加鏈表,當某一個鏈表的元素個數達到8個時(英文註釋中說的是遠大於2),自動切換成紅黑樹(二叉樹的一種)。爲什麼會這樣呢?數組和鏈表逐個遍歷的話,時間複雜度是O(n),但是二叉樹的時間複雜度是O(logN),會發現查詢的時間快了很多。

 

本文參考自:數據結構(1)—— 數據結構的三大結構

     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章