1. 程式人生 > 其它 >資料結構簡介

資料結構簡介

資料結構前言

資料結構是為實現對計算機資料有效使用的各種資料組織形式,服務於各類計算機操作。不同的資料結構具有各自對應的適用場景,旨在降低各種演算法計算的時間與空間複雜度,達到最佳的任務執行效率。

如下圖所示,常見的資料結構可分為「線性資料結構」與「非線性資料結構」,具體為:「陣列」、「連結串列」、「棧」、「佇列」、「樹」、「圖」、「散列表」、「堆」。

陣列

陣列是將相同型別的元素儲存於連續記憶體空間的資料結構,其長度不可變。

「可變陣列」是經常使用的資料結構,其基於陣列和擴容機制實現,相比普通陣列更加靈活。常用操作有:訪問元素、新增元素、刪除元素。

連結串列

連結串列以節點為單位,每個元素都是一個獨立物件,在記憶體空間的儲存是非連續的。連結串列的節點物件具有兩個成員變數:「值val

」,「後繼節點引用next」 。

棧是一種具有 「先入後出」 特點的抽象資料結構,可使用陣列或連結串列實現。

佇列

佇列是一種具有 「先入先出」 特點的抽象資料結構,可使用連結串列實現。


樹是一種非線性資料結構,根據子節點數量可分為 「二叉樹」 和 「多叉樹」,最頂層的節點稱為「根節點 root」。以二叉樹為例,每個節點包含三個成員變數:「值 val」、「左子節點 left」、「右子節點 right」 。


圖是一種非線性資料結構,由「節點(頂點)vertex」和「邊 edge」組成,每條邊連線一對頂點。根據邊的方向有無,圖可分為「有向圖」和「無向圖」。本文 以無向圖為例 開展介紹。

表示圖的方法通常有兩種:

鄰接矩陣: 使用陣列 vertices儲存頂點,鄰接矩陣 edges 儲存邊; edges[i][j] 代表節點 i + 1 和 節點 j + 1 之間是否有邊。

鄰接表: 使用陣列 vertices 儲存頂點,鄰接表 edges 儲存邊。edges 為一個二維容器,第一維i 代表頂點索引,第二維edges[i] 儲存此頂點對應的邊集和;例如 edges[0]=[1,2,3,4] 代表 vertices[0] 的邊集合為 [1, 2, 3, 4]。

鄰接矩陣 VS 鄰接表 :

鄰接矩陣的大小隻與節點數量有關,即 N^2,其中 N為節點數量。因此,當邊數量明顯少於節點數量時,使用鄰接矩陣儲存圖會造成較大的記憶體浪費。

因此,鄰接表 適合儲存稀疏圖(頂點較多、邊較少); 鄰接矩陣 適合儲存稠密圖(頂點較少、邊較多)。

散列表

散列表是一種非線性資料結構,通過利用 Hash 函式將指定的「鍵key」對映至對應的「值value」,以實現高效的元素查詢。

以上設計只適用於此示例,實際的 Hash 函式需保證低碰撞率、 高魯棒性等,以適用於各類資料和場景。

堆:
堆是一種基於「完全二叉樹」的資料結構,可使用陣列實現。以堆為原理的排序演算法稱為「堆排序」,

基於堆實現的資料結構為「優先佇列」。堆分為「大頂堆」和「小頂堆」,大(小)頂堆:任意節點的

值不大於(小於)其父節點的值

完全二叉樹定義: 設二叉樹深度為 k ,若二叉樹除第 kk 層外的其它各層(第 1 至 k-1層)的節點

達到最大個數,且處於第 k 層的節點都連續集中在最左邊,則稱此二叉樹為完全二叉樹。