[資料結構] - 線性表

樑天發表於2019-05-09
什麼是線性表
線性表是其組成元素間具有線性關係的一種線性結構,對線性表的基本操作主要有獲得元素,設定元素值,遍歷,插入,刪除,查詢,替換,和排序等,線上性表任意位置都可以插入和刪除,可以採用順序儲存結構和鏈式儲存結構表示線性表。
儲存類別
順序儲存結構
單連結串列
儲存分配方式
用一段連續的儲存單元依次儲存線性表的資料元素
採用鏈式儲存結構,用一組任意的儲存單元存放線性表的元素
時間效能
查詢O(1)、插入和刪除O(n)
查詢O(n)、插入和刪除O(1)
空間效能
需要預分配儲存空間,分大了浪費,小了容易發生上溢
不需要分配儲存空間,只要有就可以分配,元素個數不受限制
通過上面的對比,可以得出一些經驗性的結論:
  • 若線性表需要頻繁查詢,很少進行插入和刪除操作時,宜採用順序儲存結構。若需要頻繁插入和刪除時,宜採用單連結串列結構。
  • 當線性表中的元素個數變化較大或者根本不知道有多大時,最好用單連結串列結構,這樣可以不需要考慮儲存空間的大小問題。而如果事先知道線性表的大致長度,用順序儲存結構效率會高很多.

線性表抽象資料型別
線性表(Linear List) 是由 n(n>=0) 個型別相同的資料元素組成的有限序列,(a0,a1,a2,an-1) 其中 ,元素ai 的資料型別可以是整數,浮點,字串等,n是線性表元素個數,稱為線性表長度(Length).若n=0,則為空表,若n>0,則ai(0<i<n-1)有且僅有一個前驅元素ai-1,和一個後繼元素ai+1. a0沒有前驅元素,an-1沒有後繼元素。
線上性表邏輯結構中,使用序號約定資料元素線上性表中的位置,即表示元素之間具有的順序關係。
 
線性表的順序儲存
陣列:
陣列是實現順序儲存結構的基礎,儲存具有相同資料型別的元素集合,一位陣列佔用一塊記憶體,陣列的儲存單元個數稱為陣列容量,也是陣列長度,每個儲存單元地址是連續的,每個元素連續儲存,計算i個元素地址所需要的時間是個常量,時間複雜度是O(1),存取任何一個元素的時間複雜度是O(1)的資料結構是隨機存取結構,因此陣列是隨機存取結構
陣列通過下表識別元素,元素的下表是其儲存單元序號,表示元素在陣列中的位置,一位陣列使用一個喜愛博愛唯一確定一個元素,二維陣列使用兩個下表唯一確定一個元素。
陣列一旦佔用一片儲存空間,其地址和容量就是確定的,不能更改,一次,陣列只能進行賦值,取值兩種隨機操作。不能插入,刪除。當容量不夠時不能就地擴容。
陣列取值公式:
設loc(a0)表示第0個儲存地址。每個元素佔用c個位元組 則 aI儲存地址 Loc(ai) = Loc(a0) +i * c.
當陣列容量不夠,解決辦法就是申請個容量更大的陣列,然後把資料複製進去。
微信公眾號 (胡說程式碼) 輸入:陣列原始碼 即可獲得原始碼
鏈式:
線性表的鏈式儲存結構是用若干地址分散的儲存單元儲存資料元素,邏輯上相鄰的資料元素在物理位置不一定相鄰,因此,必須採用附加資訊表上資料元素之間的順序關係,儲存一個資料元素的儲存單元稱為節點(Node)一個節點至少包含兩個部分:
節點(資料域,地址域)
其中,資料域儲存元素資料,地址域(也成為鏈)儲存前驅或後繼元素地址。
一個節點表示一個元素資料,通過節點中的地址域將節點連線起來,節點間的連結關係體現了線性表資料元素之間的順序關係,採用鏈式儲存結構的線性表稱為線性連結串列(Linked List)一條線性連結串列必須使用一個頭指標記住元素a0的節點位置。
每個節點只有一個地址域的的線性表稱為單連結串列(Singly Linked list)
單連結串列節點(data 資料域,next 地址域 指向後置節點)
空單連結串列的頭指標是 head = null ,最後一個節點的地址域也是null
單連結串列中的儲存空間是插入刪除中動態申請和釋放的,不需要給單連結串列預先分配儲存空間,這樣就可以避免順序表因為空間不足,需要拷貝複製擴大空間,提高了運動效率和儲存空間利用率。對單連結串列插入和刪除操作只需要改變少量幾個節點,不需要移動元素資料。
在c/c++中使用指標儲存地址實現鏈式儲存結構,java中沒有指標使用引用來儲存,引用是比指標更安全的一種連線方式,有指標的全部功能,而且避免了指標使用不當產生的安全性問題。
單連結串列:
單連結串列是由一個一個節點連線成的。
頭節點:
單連結串列的儲存結構通常是帶頭結點的,在單連結串列最前增加一個特殊的節點,稱為頭節點,忽略其資料域,單連結串列的頭指標head指向頭結點,頭節點 next域 指向單連結串列第0個元素, 空單連結串列只有一個頭節點,head.next == null.遍歷起始位置是 p=head.next 頭插入和頭刪除不會改變head.有了頭節點 單連結串列 插入和刪除就不需要分開操作
微信公眾號 (胡說程式碼) 輸入:單連結串列原始碼 即可獲得原始碼
雙連結串列(Doubly Linked Link)
在單連結串列中,每個節點只有一個指向後置節點的鏈,若要查詢前驅節點,必須從單連結串列頭指標開始沿著連結串列方向逐漸檢索,操作效率很低,此時需要採用雙連結串列。
雙連結串列節點(data資料域,prev前驅節點,next後繼節點)
雙連結串列比單連結串列增加了一個前驅節點,給連結串列操作帶來了很大的方便,能沿著向前,向後對雙連結串列進行遍歷
 
迴圈雙連結串列(Circular Doubly Linked Link)
如果雙連結串列的最後一個節點的next指向頭節點,頭結點的prev指向最後一個節點,則構成迴圈雙連結串列
微信公眾號 (胡說程式碼) 輸入:迴圈雙連結串列原始碼 即可獲得原始碼
注:
隨機存取儲存器概述
隨機存取儲存器(RAM)是計算機儲存器中最為人熟知的一種。之所以RAM被稱為“隨機儲存”,是因為您可以直接訪問任一個儲存單元,只要您知道該單元所在記憶行和記憶列的地址即可。
與RAM形成鮮明對比的是順序存取儲存器(SAM)。SAM中的資料儲存單元按照線性順序排列,因而只能依順序訪問(類似於盒式錄音帶)。如果當前位置不能找到所需資料,就必須依次查詢下一個儲存單元,直至找到所需資料為止。SAM非常適合作緩衝儲存器之用,一般情況下,快取中資料的儲存順序與呼叫順序相同(顯示卡中的質素快取就是個很好的例子)。而RAM則能以任意的順序存取資料。

相關文章