Data Structures

重新複習資料結構 (data structures),這裡暫時不討論演算法 (algorithms)。首先,我們先了解有哪些的資料結構,常用的資料結構有:陣列、堆疊、佇列、鏈結串列、集合、字典、樹、圖形。

陣列 (array)

陣列是最簡單、最基本、最常用的資料結構,多數程式語言本身都支援陣列的資料結構。陣列通常都是存放同一種資料型別,而且陣列的長度通常是固定不能修改的,例如 C, C# 語言的陣列。不過有些陣列的資料結構是可以存放不同資料型別,而且長度可以任意動態調整, 例如 JavaScript 語言的 Array 陣列 。

存取陣列中的元素使用索引,大部分程式語言的陣列索引是從 0 開始,這和記憶體的位置有關,當然也有部分程式語言的第一個元素索引是 1。若要插入或刪除陣列中的元素,將會需要搬移其他相鄰的元素,這一點是操作陣列時的缺點。

有兩種資料結構是陣列的變形:堆疊和佇列,與陣列的差異在於元素的操作方式。

堆疊 (stack)

堆疊是後進先出 (Last In, First Out, LIFO) 的操作方式,堆疊就像是元素從下而上疊起來,將元素推進 (push) 堆疊頂部,從頂部取出 (pop) 元素。因此,沒有元素插入和刪除陣列中,需要搬移元素造成的缺點。

佇列 (queue)

佇列是先進先出 (First In, Last Out, FILO) 的操作方式, 佇列就像是排隊的概念, 將元素排入 (enqueue) 佇列的尾端,從開頭將元素取出 (dequeue)。同樣地,也沒有陣列需要搬移元素造成的缺點。

鏈結串列 (linked list)

鏈結串列的每個元素稱為節點 (node),每個節點包含資料本身和一個指標 (pointer),指標的目的是指向下一個節點。 鏈結串列改善了陣列的缺點,當需要插入或刪除元素時,只需要改變節點的指標而不需要搬移元素。但是鏈結串列的缺點是存取元素時,必須從頭開始迭代串列直到找到元素為止。鏈結串列有不同的類型,如下:

  • 單向鏈結串列 (singly linked list)
    每個節點只有一個指標,這個指標指向下一個節點。
  • 雙向鏈結串列 (doubly linked list)
    每個節點具有兩個指標的,一個指標指向前一個元素,另一個指標指向後一個元素,因此可以對串列往前或往後存取。
  • 環狀鏈結串列 (circular linked list)
    和一般的鏈結串列 (不論單向或雙向) 差別在於最後一個節點的指標指向第一個節點。環狀結構因為沒有起始點,因此從任意節點可以開始迭代存取。

集合 (set)

資料結構的集合相當於數學上的集合。集合相當於沒有順序概念的陣列,而且每個元素不能相同。此外,對於集合有聯集 (union)、交集 (intersection)、差集 (difference)、子集 (subset) 等等的操作方法。

字典 (dictionary)

字典以「鍵 (key) : 值 (value) 」的形式組織資料,新增和刪除都是以整個鍵值對 (key-value pair) 操作。通常 key 必須是可雜湊 (hashable) 的資料,因為字典的資料結構會利用雜湊表 (hash table) 方式實作,利用 key 可以快速取得 value,這是字典的優點。

樹 (tree)

樹的資料結構有父子關係,每個節點都有一個父節點,以及多個子節點。根結點是唯一一個沒有父節點的節點。樹狀結構大多討論二元樹 (binary tree) 與其變形結構,說明如下:

  • 二元樹 (binary tree)
    每個節點最多只能有兩個子節點,一個是左側子節點,另一個是右側子節點 。
  • 二元搜尋樹 (binary search tree)
    二元樹的一種,但子節點有個規則,左側子節點必須小於父節點的值,右側子節點則必須大於或等於父節點的值。

以樹狀的資料結構來看,還有很多種類型,可以參考維基百科 Tree (data structure) 的說明。

圖形 (graph)

資料結構的圖形相當於數學上的圖形。 圖形是由頂點 (vertex) 和邊 (edge) 組成,圖形依據邊有無方向,分為有向圖與無向圖兩種。圖形是個概念,到底應該要如何以資料結構表示呢?有幾種方式可以表示:相鄰矩陣、相鄰串列、關聯矩陣。

總結

前述幾種資料結構,若以資料之間的關係,邏輯的觀點來看,總共有線性結構、集合結構、樹狀結構、圖形結構共四類。若以物理的觀點,也就是資料實際儲存的方式來看,可以分成順序儲存結構和鏈結儲存結構兩類。

提問

資料結構共有多少類型?

這個問題要改成「資料結構有那些基本類型 」比較正確,例如陣列的變形結構就是堆疊和佇列。依據我目前的參考書來看,共有 6 種基本類型:陣列、鏈結串列、集合、字典、樹和圖形。

字典結構是哪一類邏輯結構?

字典結構可以說是雜湊函式 (hash function) 的應用,利用雜湊表實作的資料結構,邏輯上看每個元素是集合結構的關係。元素之間不是一個一個的線性關係,不是一對多的樹狀關係,也不是多對多的圖形關係。

參考書籍

  • Loiane Groner 著,孫曉博等譯,JavaScript資料結構及演算法實作,新北市:博碩文化, 2016年4月。 譯自:Learning JavaScript Data Structures and Algorithms
  • 程杰,大話資料結構,台北市:精誠資訊,2011年6月。

發表留言

使用 WordPress.com 設計專業網站
立即開始使用