順序表和連結串列的優缺點(區別、特點)詳解
通過系統地學習順序表和連結串列我們知道,雖然它們同屬於線性表,但資料的儲存結構有本質的不同:
- 順序表儲存資料,需預先申請一整塊足夠大的儲存空間,然後將資料按照次序逐一儲存,資料之間緊密貼合,不留一絲空隙,如圖 1a) 所示;
- 連結串列的儲存方式與順序表截然相反,什麼時候儲存資料,什麼時候才申請儲存空間,資料之間的邏輯關係依靠每個資料元素攜帶的指標維持,如圖 1b) 所示;
圖 1 順序表和連結串列的儲存結構對比
基於不同的儲存結構,順序表和連結串列有以下幾種不同。
開闢空間的方式
而連結串列則不同,連結串列儲存資料時一次只開闢儲存一個節點的物理空間,如果後期需要還可以再申請。
因此,若只從開闢空間方式的角度去考慮,當儲存資料的個數無法提前確定,又或是物理空間使用緊張以致無法一次性申請到足夠大小的空間時,使用連結串列更有助於問題的解決。
空間利用率
從空間利用率的角度上看,順序表的空間利用率顯然要比連結串列高。這是因為,連結串列在儲存資料時,每次只申請一個節點的空間,且空間的位置是隨機的,如圖 2 所示:
圖 2 連結串列結構易產生碎片
這種申請儲存空間的方式會產生很多空間碎片,一定程式上造成了空間浪費。不僅如此,由於連結串列中每個資料元素都必須攜帶至少一個指標,因此,連結串列對所申請空間的利用率也沒有順序表高。
空間碎片
時間複雜度
解決不同型別的問題,順序表和連結串列對應的時間複雜度也不同。根據順序表和連結串列在儲存結構上的差異,問題型別主要分為以下 2 類:
- 問題中主要涉及訪問元素的操作,元素的插入、刪除和移動操作極少;
- 問題中主要涉及元素的插入、刪除和移動,訪問元素的需求很少;
第 1 類問題適合使用順序表。這是因為,順序表中儲存的元素可以使用陣列下標直接訪問,無需遍歷整個表,因此使用順序表訪問元素的時間複雜度為
O(1)
;而在連結串列中訪問資料元素,需要從表頭依次遍歷,直到找到指定節點,花費的時間複雜度為 O(n)
第 2 類問題則適合使用連結串列。連結串列中資料元素之間的邏輯關係靠的是節點之間的指標,當需要在連結串列中某處插入或刪除節點時,只需改變相應節點的指標指向即可,無需大量移動元素,因此連結串列中插入、刪除或移動資料所耗費的時間複雜度為
O(1)
;而順序表中,插入、刪除和移動資料可能會牽涉到大量元素的整體移動,因此時間複雜度至少為 O(n)
;綜上所述,不同型別的場景,選擇合適的儲存結構會使解決問題效率成倍數地提高。
相關推薦
順序表和連結串列的優缺點(區別、特點)詳解
順序表和連結串列由於儲存結構上的差異,導致它們具有不同的特點,適用於不同的場景。本節就來分析它們的特點,讓讀者明白 "在什麼樣的場景中使用哪種儲存結構" 更能有效解決問題。 通過系統地學習順序表和連結串列我們知道,雖然它們同屬於線性表,但資料的儲存結構有本質的不同: 順序表儲存資料,需預先申請一整塊足夠
順序表和連結串列(Sqlist&LNode)
寫在前面的廢話:這是應某人(不點名)的煽風點火整理來的一篇關於線性表中順序表和連結串列的區別 ——————————————————————————————————————————— 眾所周知,線性表是一個比較靈活的儲存空間,其中有兩種儲存格式:線性表和連結串列,下文儘量詳
C++模板的實現(模板函式和模板類,附帶模板實現順序表和連結串列程式碼)
模板 當我們實現一個交換函式時,我們可以寫成如下。 void Swap(int& x, int& y) { int tmp = x; x = y; y = tmp; } 這裡只能交換兩個整數,當我們
資料結構-------線性表..順序表..連結串列..順序表和連結串列的區別和聯絡(1)
線性表: 線性表是N個具有相同特性的資料元素的有限序列 .線性表是一種在實際中廣泛使用的資料結構,常見的線性表:順序表..連結串列...棧...佇列...字串... 線性表在邏輯上是線性結構,也就說是連續的一條直線,但是在物
資料結構的基本概念 與順序表和連結串列的區別
1.資料:就是符號 輸入到計算機被計算機加工處理的符號的集合 特點:輸入到計算機 可以被計算機加工處理 2.資料結構把資料分為:數值型別和非數值型別 3.資料元素:組成資料基本元素
比較順序表和連結串列的優缺點,說說它們分別在什麼場景下使用?
順序表:記憶體中地址連續,優點是隨機訪問比較便捷快速,建立也比較簡單,隨機查詢比較方便,可以直接給出下標,排序也方便簡單。 缺點是不夠靈活,刪除增加的工作量叫大,比較麻煩,長度不能實時變化 適用場景:適用於需要大量訪問元素的 而少量增
比較順序表和連結串列的優缺點
線性表分為順序表和連結串列,連結串列又分為單鏈表,雙向連結串列和迴圈連結串列。對於連結串列的結構又分為帶頭連結串列和不帶頭連結串列。 一,順序表 定義:將表中元素一個接一個的存入一組連續的儲存單元中,這種儲存結構是順序結構。採用順序儲存結構的線
順序表和連結串列的清空,銷燬,建構函式
一.建構函式 在定義物件時呼叫建構函式,建構函式是用來建立一個空表 1.順序表建構函式 len,size,elem,這仨合起來看作是表的頭目,呼叫建構函式首先為這個“頭目”這仨資料分配空間,表的元素有沒有空間分配要看m的值。 ↓主要是關於空間的分
模板實現順序表和連結串列
順序表的實現:"Seqlist.h" #pragma once template<class T> class Seqlist { private: T* _array; size_t _size; size_t _capacity; public:
資料結構:順序表和連結串列的簡單操作
用陣列正序初始化連結串列 初始定義 #include <cstdlib> #include <iostream> using namespace std; typedef int ElemType; typedef int Status;
順序表和連結串列拷貝構造
簡單一部 #include <iostream> #define DATA int class SXB { int size; int len; DATA* p; public: SXB(const SXB& that) // 拷貝
線性表的兩種實現 -- 順序表和連結串列(C++)
線性表抽象類宣告 #ifndef ADT_H #define ADT_H //線性表ADT template <typename E> class List{ private: v
爬蟲原理與會話保持(cookies、session)詳解--python實現
一、爬蟲原理 我們知道網際網路是由大量計算機和網路構成的複雜系統,我們可以將其形象的比喻成一張蜘蛛網。網路的節點是計算機,計算機中儲存著大量的資料。爬蟲程式就是通過網路去採集指定計算機中資料的工具。一般來說,我們採集的資料大多是網頁上的資料,
JDBC 資料庫連線池(DBCP、C3P0) 詳解
前言 這段時間狀態有一點浮躁,希望自己靜下心來。還有特別多的東西還沒有學懂。需要學習的東西非常的多,加油! 一、JDBC複習 Java Data Base Connectivity,java資料庫連線,在需要儲存一些資料,或者拿到一些資料的時候,就需要往
順序儲存結構與鏈式儲存結構的比較(也可以說的順序表與連結串列的比較)
1、鏈式儲存結構的儲存空間在邏輯上是連續的,但是在物理上是離散的;而順序儲存結構的儲存空間在邏輯上是連續的,在物理上也是連續的。 2、鏈式儲存儲存密度小,但空間利用率較高;順序儲存儲存密度大,但空間利用率較低。 3、順序結構優點是可以隨機讀取元素,缺點是插入和刪除元素要移動大量元素,
josephus環的實現(順序表和連結表)
josephus環問題是資料結構中一個常見的例項:假設有n個人做成一圈,現在要求從第k個人開始報數,報道m的人退出。然後從下一個人繼續從頭報數,並按相同的規則退出, 直到所有的退出。還有就是要按退出的順序打印出出列人的編號。 其實看到這個“一圈”,我第一瞬間就想到了用迴圈連結串列,也
資料結構-第一章,順序表,連結串列,棧結構,佇列結構的關係(個人見解)
首先 順序表 和 連結串列是 兩個儲存結構。分別有自己的儲存特點。 其次 順序表 和 連結串列分別存放在不同的地方,“這個地方”就是 “棧” 或者 “佇列” 了 其實就是按照 FIFO先進先出 和 FILO先進後出 來處理資料所區別。 {{{而對於 FIFO 呢
資料結構(一)之順序表與連結串列
順序表 運用陣列結構來構建的線性表就是順序表。 本例實現了順序表的列印、清空、判斷是否為空、求表長、獲得指定下標的元素、獲得指定元素的下標、插入和刪除操作。 #include<iostream> const int MAXSIZE=100; using
順序表及連結串列
順序表——將表中元素一個接一個的存入一組連續的儲存單元中,這種儲存結構是順序結構。 利用陣列單元的物理位置上的 優點:儲存空間連續,允許元素隨機訪問;缺點:長度固定,在分配記憶體之前要先確定好陣列長度,致使可能造成空間浪費; 單鏈表——用一組任意的儲存單元存放線性表的元素,只包
【資料結構週週練】001順序表與連結串列
目錄 前言 1、題目 2、程式碼 1、題目 2、程式碼 1、題目 2、程式碼 前言 從這周開始,我會不定期發一些資料結構練習題,一方面,提升自己的程式設計能力,給自己考研程式碼題打基礎,雖然邏輯都明白,但是一次性寫對程式碼還是有問題,