1. 程式人生 > >資料結構(概述、線性表)

資料結構(概述、線性表)

資料結構

本文大部分內容整理自程傑老師的《大話資料結構》

一、資料結構概述

分類: ①邏輯結構:面向問題的結構,主要是思維上的認知 1.集合結構 唯一的關係是大家都在一個集合內 2.線性結構 一對一 3.樹形結構 一對多 4.圖形結構 多對多

②物理結構:面向計算機,資料的邏輯結構在計算機中的儲存形式 1.順序儲存結構:把資料元素存放在地址連續的儲存單元中 這裡寫圖片描述 資料物件:僅儲存資料

2.連結儲存結構:對資料元素存放在任意儲存單元中 這裡寫圖片描述 資料物件:儲存資料+後繼元素地址資訊

二、線性表(List)

圖示: 這裡寫圖片描述 補充兩個概念: 1.前驅元素:Ai-1為Ai的前驅元素 2.後繼元素:Ai+1為Ai的後繼元素

線性表是邏輯結構上的概念,它在計算機內部是如何儲存的呢?這時候就要涉及物理儲存結構(順序儲存結構、連結串列儲存結構)

順序儲存結構:用陣列來實現順序儲存結構 順序儲存結構有3個要素需要注意: 1.儲存空間起始位置 2.線性表的最大儲存容量 3.線性表當前長度 這裡寫圖片描述 此處注意: 1.陣列長度是固定的,一開始分配空間時就必須指定陣列長度 2.線性表長度是可變的,但是“線性表長度≤陣列長度”恆成立

查詢操作:時間複雜度為O(1),快 ①獲取第一個元素的地址 ②因為地址是連續的,A1地址假設為LOC(A1),A1佔據了c個儲存單位,那麼A2的地址就是LOC(A2)+c,所以可以直接根據該函式算出第i個元素的地址

刪除操作:時間複雜度為O(n),慢 ①找到要刪除的資料元素,刪除,後面所有的資料元素往前挪一位

增加操作:時間複雜度為O(n),慢 ②找到要增加元素的位置,插入的資料元素,後面所有的資料元素往後挪一位

連結儲存結構 順序儲存結構有1個要素需要注意: 1.儲存空間起始位置 這裡寫圖片描述 解讀:對記憶體空間無要求,資料物件儲存的資訊包括 這裡寫圖片描述 只需要知道第一個元素位置,通過它的指標域(裡頭儲存了下一個元素的地址資訊),就可以知道第二個元素位置,通過第二個元素的指標域就可以知道第三個元素位置,以此類推,直到遍歷完所有元素物件。

查詢操作:時間複雜度為O(n),慢 ①獲取第一個資料元素 ②通過第一個資料元素的指標域找到第二個元素 ③一次類推進行遍歷,直到最後一個元素,如果都找不到,說明資料不存在 ④否則查詢成功,返回結點資料

刪除操作:時間複雜度為O(1),快 ①找到要刪除的資料元素,將其前驅結點的指標域修改為目標資料元素後置結點的地址

增加操作:時間複雜度為O(1),快 ②找到要增加元素的位置,將前置元素的指標域修改為目標資料元素的地址,將目標資料元素的指標域修改為後置元素的地址 圖示: 這裡寫圖片描述

此外,再介紹幾個概念

①節點(Node):我們一般把資料域+指標域組成的的資料元素的儲存映像,成為節點 1.頭指標:連結串列中第一個結點的儲存位置 2.頭結點:單鏈表中第一個結點,頭結點的資料域可以不存任何資訊或存連結串列長度資訊

比較 頭指標 頭節點
概念 連結串列第一個結點的指標,若連結串列存在頭結點,則是指向頭結點的指標 放在第一元素結點之前,資料域一般無意義(也可存放連結串列長度)
作用 標識作用,長用頭指標冠以連結串列名字 有了頭結點,對第一元素的插入和刪除和其他結點就一致了
必要性 必要元素,即便連結串列為空 非必要元素

圖示如下: 情況一:存在頭節點 這裡寫圖片描述 情況二:無頭節點 這裡寫圖片描述 情況三:空連結串列 這裡寫圖片描述

②迴圈連結串列:尾指標指向頭結點(沒有頭結點則指向第一個結點)

③雙向連結串列:結點存在兩個指標,一個指向前驅元素地址,一個指向後繼元素地址(java中所有的連結串列都是雙向連結串列) 這裡寫圖片描述

上述討論是針對線性表在計算機中的儲存結構進行討 下面是針對線性表在邏輯上的增刪規定引出的兩種邏輯結構

棧——先進後出LIFO ①順序儲存結構 進棧:陣列的最後新增元素 彈棧:陣列的最後一個元素刪除 缺點:需要事先確定棧的大小,會浪費空間 改進方法:兩棧共享(感興趣可以自己搜以下,此處不做解釋)

②鏈式儲存結構——鏈棧

佇列——先進先出FIFO ①順序儲存結構 新增:在陣列最後新增元素 刪除:在陣列最前刪除元素,後續元素全部往前移 缺點:時間複雜度O(n)

改進刪除:在陣列最前的元素刪除,後續元素不動 優點:時間複雜度O(1) 缺點:前面騰出來的空間無法利用

再改進:陣列最後一個位置被佔用後,從第一個元素開始繼續新增元素→迴圈佇列

②鏈式儲存結構——鏈佇列