1. 程式人生 > 實用技巧 >資料結構[總結筆記]

資料結構[總結筆記]

目錄

資料結構

資料結構的儲存方式

資料結構的基本操作

1、陣列

2、棧(FILO)

3、佇列(FIFO)

4、連結串列

5、樹

6、散列表

7、堆

8、圖

一、資料結構的儲存方式

陣列(順序儲存)和連結串列(鏈式儲存) ,其他資料結構基本是在這兩種結構上的特殊操作

二、資料結構的基本操作

線性的訪問和非線性訪問, 線性就是 for/while 迭代為代表,非線性就是遞迴為代表

//1.線性訪問
for (int i = 0; i < arr.length; i++) {
     // 迭代訪問 arr[i]
}
​
//2.非線性訪問
/* 基本的單鏈表節點 */
class ListNode {
    
int val; ListNode next; } ​ void traverse(ListNode head) { for (ListNode p = head; p != null; p = p.next) { // 迭代訪問 p.val } } void traverse(ListNode head) { // 遞迴訪問 head.val traverse(head.next) }

1、陣列

陣列是可以再記憶體中連續儲存多個元素的結構,在記憶體中的分配也是連續的,陣列中的元素通過陣列下標進行訪問,陣列下標從0開始

優點: 1、按照索引查詢元素速度快 2、按照索引遍歷陣列方便

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

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

2、棧(FILO)

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

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

3、佇列(FIFO)

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

使用場景:因為佇列先進先出的特點,在多執行緒阻塞佇列管理中非常適用。

4、連結串列

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

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

缺點: 因為含有大量的指標域,佔用空間較大; 查詢元素需要遍歷連結串列來查詢,非常耗時。

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

5、樹

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

    1. 每個節點有零個或多個子節點;

    2. 沒有父節點的節點稱為根節點;

    3. 每一個非根節點有且只有一個父節點;

    4. 除了根節點外,每個子節點可以分為多個不相交的子樹;

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

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、堆

8、圖

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

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