常用數據結構梳理

前言

什麼是數據結構?

  1. 數據結構表達的是:用什麼樣的結構,組織一類數據。

  2. 分爲邏輯結構和物理結構:

    • 基本的邏輯結構有:集合、線性結構、樹形結構、圖;
    • 物理結構:順序存儲、鏈式存儲;

工作多年,發現自己對數據結構的理解還是不夠,決定再次梳理一下數據結構的基礎知識,便於日後回顧

1、介紹常見的數據結構:Array(數組)、LinkedList(鏈表)、queue(隊列)、Stack(棧)、散列表(Hash table)、(Tree)、Heap(堆)、graph(圖)

2、說明每個數據結構的特徵/優缺點

八大基礎數據結構

1、Array(數組)

數組是在內存中開闢一段連續的空間,並在此空間存放元素。

數組需要預留空間,在使用前需要先申請佔內存的大小

特徵:是有序的元素序列,

類比:就像是一排出租屋,有100個房間,從001到100每個房間都有固定編號,通過編號就可以快速找到租房子的人

優點:查找快,隨機讀取效率很高

缺點:增刪修改慢,內存空間要求高,必須有足夠的連續內存空間

2、LinkedList(鏈表)

鏈表是線性表的一種,最基本、最簡單,也是最常用的數據結構
特徵:元素之間的關係是一對一的關係(除了第一個和最後一個元素,其他元素都是首尾相接)、

類比:像一條鐵鎖鏈(一環套一環,首尾相連)

優點:增刪快

缺點:查找慢,不能隨機查找(只能從頭遍歷)

doubly-linked-list(雙向鏈表)

特徵:相比於單向鏈表,雙向鏈表有兩個指針,一個指向前一個節點,一個後一個節點

優點:可以找到前驅和後繼,可進可退;

缺點:增加刪除節點複雜,需要多分配一個指針存儲空間。

適用於需要雙向查找節點值的情況。

下圖演示了雙向循環鏈表(即頭尾相連的雙向鏈表)

3、queue(隊列)

是一種運算受限的線性表,其限制是僅允許在表的一端進行插入,而在表的另一端進行刪除。

特徵:先進先出(FIFO)、併發中使用、可以安全將對象從一個任務傳給另一個任務

類比:安檢場景,一個單向通道,只能一個個的往前走,先進先出
 

4、Stack(棧)

和隊列相似,stack,又稱堆棧,它也是運算受限的線性表,其限制是僅允許在標的一端進行插入和刪除操作,不允許在其他任何位置進行添加、查找、刪除等操作。
特徵:存儲數據是先進後出的、棧只有一個出口,只能從棧頂部增加和移除元素,類似箱子(取東西只能在上面取)

在這裏插入圖片描述

5、HashTable(散列表/哈希表)

散列表也叫哈希表,是一種通過鍵值對直接訪問數據的機構。在初中,我們就學過一種能夠將一個x值通過一個函數獲得對應的一個y值的操作,叫做映射。散列表的實現原理正是映射的原理,通過設定的一個關鍵字和一個映射函數,就可以直接獲得訪問數據的地址,實現O(1)的數據訪問效率。在映射的過程中,事先設定的函數就是一個映射表,也可以稱作散列函數或者哈希函數

特徵:以鍵-值(key-indexed) 存儲數據的結構,我們只要輸入待查找的值即key,即可查找到其對應的值。

散列表用的是數組支持按照下標隨機訪問數據的特性,所以散列表其實就是數組的一種擴展,由數組演化而來,可以說,如果沒有數組,就沒有散列表

優點: 插入/查詢/刪除效率非常高,幾乎可以看成是常數時間O(1);而代價僅僅是消耗比較多的內存(空間換時間)

缺點:

    1、元素是無序的,數據遍歷麻煩

 2、空間利用率不高,底層使用的是數組,並且使用的某些單元是沒有被利用的

 3、不能快速的找出哈希表中的最大值或者最小值

典型應用: Java HashMap

 

6、(Tree)

 

樹結構是一種非線性存儲結構,存儲的是具有“一對多”關係的數據元素的集合。

類比:看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下

特徵:
(1)每一個節點有零個或者多個子節點沒有父節點的節點稱之爲根節點,
(2)一個樹最多有一個根節點。
(3)每一個非根節點有且只有一個父節點

樹的遍歷

樹遍歷有4種方法:先序遍歷、中序遍歷、後序遍歷、層次遍歷
如下圖:


其先序遍歷(又稱先根遍歷)爲ABDECF(根-左-右)
其中序遍歷(又稱中根遍歷)爲DBEAFC(左-根-右)(僅二叉樹有中序遍歷)
其後序遍歷(又稱後根遍歷)爲DEBFCA(左-右-根)
其層次遍歷爲ABCDEF(同廣度優先搜索)

不同類型的樹

樹的類型有很多,這裏先介紹常見的,如二叉樹,其它的用到了再慢慢介紹(平衡樹、紅黑樹、B+樹

二叉樹

 二叉樹是數據結構中一種重要的數據結構,也是樹表家族最爲基礎的結構。

特徵:每個節點最多含有兩個子樹的樹稱爲二叉樹。(我們一般在書中試題中見到的樹是二叉樹,但並不意味着所有的樹都是二叉樹。)

完全二叉樹

 除了最後一層結點,其它層的結點數都達到了最大值;同時最後一層的結點都是按照從左到右依次排布。

滿二叉樹

除了最後一層,其它層的結點都有兩個子結點。

 

7、Heap(堆)

堆=數組+樹(排序好的樹)

一般情況下,堆叫二叉堆,近似完全二叉樹的數據結構,一個父節點下面兩個子節點,子節點下又分別兩個子節點

堆的具體實現一般不通過指針域,而是通過構建一個一維數組與二叉樹的父子結點進行對應,因此堆總是一顆完全二叉樹。
特徵堆中某個節點的值總是不大於或不小於其父節點的值。將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。 

堆常用來實現優先隊列,在面試中經常考的問題都是與排序有關,比如堆排序、topK問題等。由於堆的根節點是序列中最大或者最小值,因而可以在建堆以及重建堆的過程中,篩選出數據序列中的極值,從而達到排序或者挑選topK值的目的。 

8、graph(圖)

圖結構一般包括頂點和邊,頂點通常用圓圈來表示,邊就是這些圓圈之間的連線。邊還可以根據頂點之間的關係設置不同的權重,默認權重相同皆爲1。此外根據邊的方向性,還可將圖分爲有向圖和無向圖。

特徵:通常使用鄰接矩陣和鄰接表表示、前者易實現但是對於稀疏矩陣會浪費較多空間、後者使用鏈表的方式存儲信息但是對於圖搜索時間複雜度較高

 

TODO: 後續在實踐中陸續補充圖的表示方法(鄰接矩陣、鄰接表、十字鏈表等)

 

 

最後放一張總的快速圖解吧

 

參考鏈接

九大常見數據結構

【數據結構與算法】之散列表(Java實現)

 

 

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