基本資料結構梳理

Kongdy發表於2017-12-28

一、前文

資料結構這個東西,一般在實際開發過程中,很容易顧不上那麼多效能或者記憶體佔用問題,但往往在大資料操作的情況下這些就是引發效能問題的關鍵。

二、基本的資料結構型別

資料結構從大的概念來說可以分為四大類:

  1. 線性表,結構中所有資料都是按線性排列的,常用的比如陣列、連結串列、棧都屬於線性表的一種,更具體點,比如說java中的ArrayList就屬於線性表的一種
  2. 樹,指結構中所有資料都交錯有著某種關係,都有父節點、子節點,類似一棵樹的結構,主要分為兩大類,比如二叉樹和圖。
  3. 雜湊表,是根據鍵值和雜湊函式對映地址,直接訪問在記憶體中的資料,查詢速度較快
  4. 集合,結構中所有元素之間都沒有聯絡,所有元素都是平等的,集合和集合之間有包括和被包括的關係,類似數學中集合的概念。

三、雜談


### 線性表
線性表有很多種,線性表分為順序表和連結串列,而連結串列又分為單連結串列、雙連結串列和迴圈連結串列等。此外還有靜態連結串列,是集合順序表和連結串列兩者特徵的儲存結構。
#### 順序表 順序表指結構中所有元素在記憶體中都按照順序排列,所以在查詢過程中的效能和在尾部新增、刪除的效能非常高,但是如果再順序表當中進行刪、加操作,就需要把要修改的元素後方所有元素進行前移或者後移,就大大降低了效能,我們所熟知的ArrayList和陣列就是採取類似的儲存結構
![線性表](http://img.blog.csdn.net/20171221230606894?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxNDMwMzAwMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) #### 連結串列
連結串列分為單連結串列、雙連結串列以及迴圈連結串列,單連結串列即每個元素會記錄下一個元素的位置,但是這樣的缺點就是,當遍歷資料的時候,只能從頭開始遍歷,所以就產生了雙連結串列,元素不但會記錄下一個元素的位置,還會記錄上一個元素的位置,所以我們就可以雙向遍歷,不過還有一個問題,就是如果遍歷到最後一個元素,就不能繼續遍歷,所以就產生了迴圈遍歷,最後一個元素會指向第一個元素。
![這裡寫圖片描述](http://img.blog.csdn.net/20171226112720411?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxNDMwMzAwMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

靜態連結串列


而靜態連結串列則是在陣列的前提下,增加遊標指標,我們成為curPos,指向下一個腳標。空的靜態連結串列如下圖所示,每個遊標都會指向下一個腳標,最後一個遊標指向第一個腳標。靜態連結串列由於要實現該特性,所以它往往需要比實際空間更大的記憶體空間來操作。

靜態連結串列空狀態

填入資料後如圖所示
靜態連結串列有資料初始狀態

我們向乙後面插入資料戊,就會變成如下圖所示
靜態連結串列資料增加

紅色為發生更改的變數,我們可以看到乙的遊標指向了5,5的遊標指向了3,這樣就成功插入了戊在乙之後。

樹分為二叉樹和圖,二叉樹一般有一個根節點和兩個子節點,圖則是錯綜複雜的關係連線。

二叉樹

二叉樹也有很多種,分為滿二叉樹和完全二叉樹,而完全二叉樹滿足一定規則就叫做堆。二叉樹也可以根據規則來程式設計紅黑樹。樹的查詢在某些情況很很多優勢。因為樹的存在就衍生出來了廣度優先遍歷演算法和深度優先遍歷演算法。
廣度優先遍歷演算法即從最頂點開始遍歷,隨層級下降,優先遍歷每一層的頂點。
深度優先遍歷演算法即從頂點開始遍歷,一直遍歷左節點,當走到頭之後,再遍歷就進的右節點,依次類推
Java中的TreeSet就是紅黑樹的實現

經典紅黑樹

樹是圖的基礎,樹是一種更簡單意義上的圖。為了方便認識,這裡我把圖分到了樹的一種。圖因為元素之間關係相對複雜,所以開始也需要花些時間才能運用熟練。圖按照有無方向可以分為有向圖和無向圖。按照儲存結構可以分為鄰接矩陣、鄰接表、十字連結串列和鄰接多重表。
有向圖和無向圖

有向圖和無向圖

根據功能的不同,圖經常運用在最短路徑、拓撲排序,也可以用作深度/廣度優先搜尋等實際應用。拓撲排序簡單來說,就相當於遊戲裡面,很多角色的技能樹排序,得要學了前置技能才能學習高階技能的這種排序。
想詳細瞭解鄰接矩陣、鄰接表、十子表和鄰接多重表可以參照 這篇文章 講的比較詳細。

雜湊表

我把雜湊表單獨分出來是因為他的儲存結構與其他基類都是不同的,雜湊表是依靠key-value進行資料儲存的,即通過key直接定址獲得value,在查詢上面有一定的優勢。使用的過程類似於java的HashMap。

集合


集合元素是不能重複的。元素是沒有順序的。所以它不能基於位置訪問元素。Java中很多資料結構都有集合的一些特性。類似於TreeSet、HashSet。


個人github地址: github.com/Kongdy
個人掘金主頁:juejin.im/user/595a64…
csdn主頁:blog.csdn.net/u014303003

相關文章