資料結構:八大資料結構分類

來源:互聯網
上載者:User

標籤:alt   結構圖   不同的   直接   key   最大的   分類   處理   單元   

目錄

  • 資料結構分類
  • 1、數組
  • 2、棧
  • 3、隊列
  • 4、鏈表
  • 5、樹
  • 6、散列表
  • 7、堆
  • 8、圖

@

資料結構分類

資料結構是指相互之間存在著一種或多種關係的資料元素的集合和該集合中資料元素之間的關係組成 。
常用的資料結構有:數組,棧,鏈表,隊列,樹,圖,堆,散列表等,:

1、數組

數組是可以再記憶體中連續儲存多個元素的結構,在記憶體中的分配也是連續的,數組中的元素通過數組下標進行訪問,數組下標從0開始。例如下面這段代碼就是將數組的第一個元素賦值為 1。

int[] data = new int[100];data[0]  = 1;

優點:
1、按照索引查詢元素速度快
2、按照索引遍曆數組方便

缺點:
1、數組的大小固定後就無法擴容了
2、數組只能儲存一種類型的資料
3、添加,刪除的操作慢,因為要移動其他的元素。

適用情境:
頻繁查詢,對儲存空間要求不大,很少增加和刪除的情況。

2、棧

棧是一種特殊的線性表,僅能線上性表的一端操作,棧頂允許操作,棧底不允許操作。 棧的特點是:先進後出,或者說是後進先出,從棧頂放入元素的操作叫入棧,取出元素叫出棧。

棧的結構就像一個集裝箱,越先放進去的東西越晚才能拿出來,所以,棧常應用於實現遞迴功能方面的情境,例如斐波那契數列。

3、隊列

隊列與棧一樣,也是一種線性表,不同的是,隊列可以在一端添加元素,在另一端取出元素,也就是:先進先出。從一端放入元素的操作稱為入隊,取出元素為出隊,樣本圖如下:

使用情境:因為隊列先進先出的特點,在多線程阻塞隊列管理中非常適用。

4、鏈表

鏈表是實體儲存體單元上非連續的、非順序的儲存結構,資料元素的邏輯順序是通過鏈表的指標地址實現,每個元素包含兩個結點,一個是儲存元素的資料域 (記憶體空間),另一個是指向下一個結點地址的指標域。根據指標的指向,鏈表能形成不同的結構,例如單鏈表,雙向鏈表,迴圈鏈表等。

鏈表的優點:
鏈表是很常用的一種資料結構,不需要初始化容量,可以任意加減元素;
添加或者刪除元素時只需要改變前後兩個元素結點的指標域指向地址即可,所以添加,刪除很快;

缺點:
因為含有大量的指標域,佔用空間較大;
尋找元素需要遍曆鏈表來尋找,非常耗時。

適用情境:
資料量較小,需要頻繁增加,刪除操作的情境

5、樹

是一種資料結構,它是由n(n>=1)個有限節點群組成一個具有層次關係的集合。把它叫做 “樹” 是因為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。它具有以下的特點:

  • 每個節點有零個或多個子節點;
  • 沒有父節點的節點稱為根節點;
  • 每一個非根節點有且只有一個父節點;
  • 除了根節點外,每個子節點可以分為多個不相交的子樹;

在日常的應用中,我們討論和用的更多的是樹的其中一種結構,就是二叉樹

二叉樹是樹的特殊一種,具有如下特點:

1、每個結點最多有兩顆子樹,結點的度最大為2。
2、左子樹和右子樹是有順序的,次序不能顛倒。
3、即使某結點只有一個子樹,也要區分左右子樹。

二叉樹是一種比較有用的折中方案,它添加,刪除元素都很快,並且在尋找方面也有很多的演算法最佳化,所以,二叉樹既有鏈表的好處,也有數組的好處,是兩者的最佳化方案,在處理大批量的動態資料方面非常有用。

擴充:
二叉樹有很多擴充的資料結構,包括平衡二叉樹、紅/黑樹狀結構、B+樹等,這些資料結構二叉樹的基礎上衍生了很多的功能,在實際應用中廣泛用到,例如mysql的資料庫索引結構用的就是B+樹,還有HashMap的底層源碼中用到了紅/黑樹狀結構。這些二叉樹的功能強大,但演算法上比較複雜,想學習的話還是需要花時間去深入的。

6、散列表

散列表,也叫雜湊表,是根據關鍵碼和值 (key和value) 直接進行訪問的資料結構,通過key和value來映射到集合中的一個位置,這樣就可以很快找到集合中的對應元素。

記錄的儲存位置=f(key)

這裡的對應關係 f 成為散列函數,又稱為雜湊 (hash函數),而散列表就是把Key通過一個固定的演算法函數既所謂的雜湊函數轉換成一個整型數字,然後就將該數字對數組長度進行取餘,取餘結果就當作數組的下標,將value儲存在以該數字為下標的數組空間裡,這種儲存空間可以充分利用數組的尋找優勢來尋找元素,所以尋找的速度很快。

雜湊表在應用中也是比較常見的,就如Java中有些集合類就是借鑒了雜湊原理構造的,例如HashMap,HashTable等,利用hash表的優勢,對於集合的尋找元素時非常方便的,然而,因為雜湊表是基於數組衍生的資料結構,在添加刪除元素方面是比較慢的,所以很多時候需要用到一種數組鏈表來做,也就是拉鏈法。拉鏈法是數組結合鏈表的一種結構,較早前的hashMap底層的儲存就是採用這種結構,直到jdk1.8之後才換成了數組加紅/黑樹狀結構的結構,其樣本圖如下:

可以看出,左邊很明顯是個數組,數組的每個成員包括一個指標,指向一個鏈表的頭,當然這個鏈表可能為空白,也可能元素很多。我們根據元素的一些特徵把元素分配到不同的鏈表中去,也是根據這些特徵,找到正確的鏈表,再從鏈表中找出這個元素。

雜湊表的應用情境很多,當然也有很多問題要考慮,比如雜湊衝突的問題,如果處理的不好會浪費大量的時間,導致應用崩潰。

7、堆

堆是一種比較特殊的資料結構,可以被看做一棵樹的數組對象,具有以下的性質:

  • 堆中某個節點的值總是不大於或不小於其父節點的值;

  • 堆總是一棵完全二叉樹。

將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。常見的堆有二元堆積、斐波那契堆等。

堆的定義如下:n個元素的序列{k1,k2,ki,…,kn}若且唯若滿足下關係時,稱之為堆。
(ki <= k2i,ki <= k2i+1)或者(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4...n/2),滿足前者的運算式的成為小頂堆,滿足後者運算式的為大頂堆,這兩者的結構圖可以用完全二叉樹排列出來,樣本圖如下:

因為堆有序的特點,一般用來做數組中的排序,稱為堆排序。

8、圖

圖是由結點的有窮集合V和邊的集合E組成。其中,為了與樹形結構加以區別,在圖結構中常常將結點稱為頂點,邊是頂點的有序偶對,若兩個頂點之間存在一條邊,就表示這兩個頂點具有相鄰關係。

按照頂點指向的方向可分為無向圖和有向圖:

圖是一種比較複雜的資料結構,在儲存資料上有著比較複雜和高效的演算法,分別有鄰接矩陣 、鄰接表、十字鏈表、鄰接多重表、邊集數組等儲存結構,這裡不做展開,讀者有興趣可以自己學習深入。

資料結構:八大資料結構分類

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.