簡述順序表和連結串列的優缺點和適用範圍

時間 2021-09-15 00:08:58

1樓:使用者時代

順序表

長度固定,必須在分配記憶體之前確定陣列的長度。

儲存空間連續,即允許元素的隨機訪問。

儲存密度大,記憶體中儲存的全部是資料元素。

要訪問特定元素,可以使用索引訪問,時間複雜度為 $o(1)$。

要想在順序表中插入或刪除一個元素,都涉及到之後所有元素的移動,因此時間複雜度為 $o(n)$。

順序表最主要的問題就是要求長度是固定的,可以使用倍增-複製的辦法來支援動態擴容,將順序表變成“可變長度”的。

這個辦法不可避免的會浪費一些記憶體,因為陣列的容量總是倍增的。而且每次擴容的時候,都需要將舊的資料全部複製一份,肯定會影響效率。不過實際上,這樣做還是直接使用連結串列的效率要高。

連結串列

長度不固定,可以任意增刪。

儲存空間不連續,資料元素之間使用指標相連,每個資料元素只能訪問周圍的一個元素(根據單連結串列還是雙連結串列有所不同)。

儲存密度小,因為每個資料元素,都需要額外儲存一個指向下一元素的指標(雙連結串列則需要兩個指標)。

要訪問特定元素,只能從連結串列頭開始,遍歷到該元素,時間複雜度為 $o(n)$。在特定的資料元素之後插入或刪除元素,不涉及到其他元素的移動,因此時間複雜度為 $o(1)$。雙連結串列還允許在特定的資料元素之前插入或刪除元素。

靜態連結串列

為了彌補連結串列在記憶體分配上的不足,出現了靜態連結串列這麼一個折中的辦法。靜態連結串列比較類似於記憶體池,它會預先分配一個足夠長的陣列,之後連結串列節點都會儲存在這個陣列裡,這樣就不需要頻繁的進行記憶體分配了。

當然,這個方法的缺點是需要預先分配一個足夠長的陣列,肯定會導致記憶體的浪費。陣列不夠長到不是什麼大不了的,使用第一節的動態擴容方法就是了。

靜態連結串列一般是由兩個連結串列組成,一個儲存資料的連結串列,一個空閒節點的連結串列,如圖 所示。

塊狀連結串列

塊狀連結串列則是連結串列和順序表的結合體,將多個順序表以連結串列連線起來,如圖 4所示。

這種資料結構的優點是結合了順序表和連結串列的優點,長度可變,而且插入、刪除也比較迅速(不必移動全部元素,只需要移動某一個或幾個塊中的元素),時間複雜度約為 $o(\sqrt n)$,記憶體的佔用也不會像連結串列那麼多。

但是缺點也很明顯,就是實現起來過於複雜,要想讓時間複雜度達到 $o(\sqrt n)$,需要令塊的個數和每塊中儲存的元素個數都接近 $\sqrt n$ 才行,這進一步限制了塊狀連結串列的應用。

stl 中的 deque 結構比較類似於塊狀連結串列,只不過它記錄每一塊使用的仍然是陣列,而不是連結串列。同時 deque 只允許在兩端進行插入和刪除,實現上就容易很多。

參考資料

2樓:逸明鯨人

順序表:記憶體中地址連續

長度不可變更

支援隨機查詢 可以在o(1)內查詢元素

適用於需要大量訪問元素的 而少量增添/刪除元素的程式連結串列 :記憶體中地址非連續

長度可以實時變化

不支援隨機查詢 查詢元素時間複雜度o(n)適用於需要進行大量增添/刪除元素操作 而對訪問元素無要求的程式

簡述沉入樁和灌注樁各有那些優缺點 各自適用於什麼條件

sky不用太多 沉入樁一般為錘擊樁和靜力壓樁和振動壓樁幾種,灌注樁一般為鑽孔灌注樁 機械挖孔灌注樁和人工挖孔樁幾種。由於每一種樁的施工方法與工藝不同,所以決定了它們各自的特點。沉入樁一般適用於地基較軟的軟土層 粘土層以及砂性土層等等,但不適合地基岩層較硬或者有孤石存在的地質條件。而錘擊樁因為是蒸汽擊...

豬的優點和缺點,屬豬的人優缺點

優點 一 樂觀 豬總是對自己的將來充滿了希望,他深信主人養它並不是求在白飯裡加幾塊紅燒豬肉。他知道人類曾經對他們的前輩晚輩都狠下毒手,但豬總能生活在充滿陽光的日子裡,他們相信總有一天人們會被他們感化。二 知足 豬從來不會向你索取更多的東西,你給他的淡茶剩飯它是來著不拒,只要求填飽肚子就好,沒有任何其...

父母的缺點,和年邁父母生活的優缺點

琴絃泛音 父母都是希望自己的孩子出息的,但是往往因為這種想法而做出極端的行為。孩子們在幼兒階段,父母希望孩子即聰明又聽話。這個階段的孩子一般都還好,不會表現出叛逆的行為。在孩子上學後父母的期待就變得更迫切了,總是希望自己的孩子能夠在班上拿到前三名的成績,但是一個班幾十名同學,真正學習好的只有那麼幾個...