數據存儲方式學習七(順序表和鏈表的比較以及存儲結構和存取結構的區別)


1.順序表和鏈表的優缺點(區別、特點)

概述:
通過系統地學習順序表和鏈表我們知道,雖然它們同屬於線性表
但數據的存儲結構有本質的不同:

    (1)順序表存儲數據,需預先申請一整塊足夠大的存儲空間,

       然后將數據按照次序逐一存儲,數據之間緊密貼合,

       不留一絲空隙,如圖 1a) 所示;

    (2)鏈表的存儲方式與順序表截然相反,什么時候存儲數據,

       什么時候才申請存儲空間,數據之間的邏輯關系依靠

       每個數據元素攜帶的指針維持,如圖 1b) 所示;

     

 

 

 基於不同的存儲結構,順序表和鏈表有以下幾種不同:

   (1)開辟空間的方式

       順序表存儲數據實行的是 "一次開辟,永久使用",

       即存儲數據之前先開辟好足夠的存儲空間,

       空間一旦開辟后期無法改變大小(使用動態數組的情況除外)。

 

       而鏈表則不同,鏈表存儲數據時一次只開辟存儲一個節點的物理空間,

       如果后期需要還可以再申請。

 

       因此,若只從開辟空間方式的角度去考慮,當存儲數據的個數無法提前確定,

       又或是物理空間使用緊張以致無法一次性申請到足夠大小的空間時,

       使用鏈表更有助於問題的解決。

 

    (2)空間利用率

        從空間利用率的角度上看,順序表的空間利用率顯然要比鏈表高。

        這是因為,鏈表在存儲數據時,每次只申請一個節點的空間,

        且空間的位置是隨機的,如圖2所示:

        

 

        這種申請存儲空間的方式會產生很多空間碎片,一定程序上造成了空間浪費。

        不僅如此,由於鏈表中每個數據元素都必須攜帶至少一個指針,

        因此,鏈表對所申請空間的利用率也沒有順序表高。

        ps:空間碎片,指的是某些容量很小(1KB 甚至更小)以致無法得到有效利用的物理空間。

 

   (3)時間復雜度

      解決不同類型的問題,順序表和鏈表對應的時間復雜度也不同。

      根據順序表和鏈表在存儲結構上的差異,問題類型主要分為以下 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM