1.順序表和鏈表的優缺點(區別、特點)
概述:
通過系統地學習順序表和鏈表我們知道,雖然它們同屬於線性表,
但數據的存儲結構有本質的不同:
(1)順序表存儲數據,需預先申請一整塊足夠大的存儲空間,
然后將數據按照次序逐一存儲,數據之間緊密貼合,
不留一絲空隙,如圖 1a) 所示;
(2)鏈表的存儲方式與順序表截然相反,什么時候存儲數據,
什么時候才申請存儲空間,數據之間的邏輯關系依靠
每個數據元素攜帶的指針維持,如圖 1b) 所示;
基於不同的存儲結構,順序表和鏈表有以下幾種不同:
(1)開辟空間的方式
順序表存儲數據實行的是 "一次開辟,永久使用",
即存儲數據之前先開辟好足夠的存儲空間,
空間一旦開辟后期無法改變大小(使用動態數組的情況除外)。
而鏈表則不同,鏈表存儲數據時一次只開辟存儲一個節點的物理空間,
如果后期需要還可以再申請。
因此,若只從開辟空間方式的角度去考慮,當存儲數據的個數無法提前確定,
又或是物理空間使用緊張以致無法一次性申請到足夠大小的空間時,
使用鏈表更有助於問題的解決。
(2)空間利用率
從空間利用率的角度上看,順序表的空間利用率顯然要比鏈表高。
這是因為,鏈表在存儲數據時,每次只申請一個節點的空間,
且空間的位置是隨機的,如圖2所示:
這種申請存儲空間的方式會產生很多空間碎片,一定程序上造成了空間浪費。
不僅如此,由於鏈表中每個數據元素都必須攜帶至少一個指針,
因此,鏈表對所申請空間的利用率也沒有順序表高。
ps:空間碎片,指的是某些容量很小(1KB 甚至更小)以致無法得到有效利用的物理空間。
解決不同類型的問題,順序表和鏈表對應的時間復雜度也不同。
根據順序表和鏈表在存儲結構上的差異,問題類型主要分為以下 2 類:
(1)問題中主要涉及訪問元素的操作,元素的插入、刪除和移動操作極少;
(2)問題中主要涉及元素的插入、刪除和移動,訪問元素的需求很少;
概括:第1類問題適合使用順序表。
這是因為,順序表中存儲的元素可以使用數組下標直接訪問,
無需遍歷整個表,因此使用順序表訪問元素的時間復雜度為 O(1)
;
而在鏈表中訪問數據元素,需要從表頭依次遍歷,
直到找到指定節點,花費的時間復雜度為 O(n)
;
第2類問題則適合使用鏈表。
鏈表中數據元素之間的邏輯關系靠的是節點之間的指針,
當需要在鏈表中某處插入或刪除節點時,
只需改變相應節點的指針指向即可,
無需大量移動元素,因此鏈表中插入、
刪除或移動數據所耗費的時間復雜度為 O(1)
;
而順序表中,插入、刪除和移動數據可能會牽涉到大量元素的整體移動,
因此時間復雜度至少為 O(n)
;
總結:綜上所述,不同類型的場景,選擇合適的存儲結構會使解決問題效率成倍數地提高。
2.存儲結構和存取結構的區別
1.一個是數據的存儲狀態一種是數據的存儲方式:
所謂存儲結構,指的是數據在內存中真實的存儲狀態,
具體可分為2類,即順序存儲結構和鏈式存儲結構。
而存取結構,指的是存取數據的方式,
具體也可以分為2類,分別為順序存取結構和隨機存取結構。
2.例子:
描述:
線性表的順序存儲結構是隨機存取結構,而不是順序存取結構;
線性表的鏈式存儲結構,又可以稱為順序存取結構,而不是隨機存取結構。
分析:
我們知道,線性表的順序存儲結構,
本質就是采用一塊連續的存儲空間將所有數據集中存儲起來。
不僅僅是C語言,很多種編程語言中,
都在使用數組這種數據類型來表示順序存儲結構。
順序存儲結構最大的特點是,我們可以隨機存或者取數據。
例如,現有一個數組a,其初始存儲狀態為:

在此基礎上,如果想取出元素1,由於其位於數組下標為1的位置
(數組下標通常由0開始計數),因此借助a[1],就可以輕松實現目的;
反之,如果想將元素2改存為元素5,可以這樣實現:
a[2] = 5;
顯然借助順序存儲結構的特點,我們可以隨機存或者取存儲的各個元素。
這也就解釋了“線性表的順序存儲結構,又可以稱為隨機存取結構”。
和隨機存取結構相對的,是順序存取結構。
通過前面的學習我們知道,采用鏈表存儲的數據,它們所在的物理空間並不緊挨着,
而是分散在內存中的各個位置。仍以存儲 0、1、2、和3這4個元素為例,
如果采用鏈式存儲結構,則各個元素的存儲狀態可能為:
如圖2所示,如果我們想在鏈表中存或者取數據,
就只能從鏈表頭H開始,逐個遍歷鏈表中的每個元素,
直至找到目標元素。也就是說,從鏈表中存和取數據,
必須從遵循各個元素在鏈表中存儲的邏輯順序,無法隨機存取。
總之,線性表的順序存儲結構,又可以稱為隨機存取結構;
而線性表的鏈式存儲結構(以及棧結構和隊列結構),又可以稱為順序存取結構。
學習來源:
https://blog.csdn.net/weixin_42437172/article/details/85345263
http://c.biancheng.net/view/8107.html
http://data.biancheng.net/view/279.html