鍊錶為什麼刪除插入快!陣列為什麼查詢快!

2021-10-02 19:16:59 字數 2227 閱讀 7011

1、它是具有相同資料型的資料,並且有一定的順序,陣列在記憶體中的位址是連續相鄰的。而鍊錶在記憶體中是雜湊存放的。

2、cup快取會把一片連續的記憶體空間讀入。因為陣列結構是連續的內村位址,所以陣列全部或者部分元素被連續被存在cpu快取裡面,而鍊錶的節點是分散在堆空間裡面的,這時候cpu快取幫不上忙,只能是去讀取記憶體,而快取的速率要比記憶體快。

3、cpu --》暫存器--》快取 --》記憶體

cpu 取資料,處理資料,都要放到暫存器中處理(存放指令),快取就是吧記憶體中提取的資料暫時儲存在裡面。

如果暫存器要獲取記憶體中同一位置的資料,就從快取中獲取,如果暫存器獲取的不是同乙個記憶體位址的數

據(或者獲取的記憶體位址快取中不存在),就從記憶體中查詢獲取 

從上述比較中,我們可以看出陣列的查詢,要比鍊錶的快

1.陣列的中間插入(或刪除)乙個元素,那麼這個元素後的所有元素的記憶體位址都要往後(前)移動(陣列的記憶體位址是連續的),對最後乙個元素插入(或刪除)時才比較快,而鍊錶不需要改變記憶體的位址,只需要修改節點的資訊即可(包括指標指向,節點值)。

2.鍊錶的擴充套件性較好,定義陣列時所占用的空間大小都是固定的,如果儲存滿了,無法擴充套件,只能新建乙個更大空間的陣列。

綜上所述我們可以得出:

陣列大小固定,不適合動態儲存,動態新增,記憶體為一連續的位址,可隨機訪問,查詢較快,

而鍊錶大小可變,擴充套件性強,只能順著指標的方向查詢,速度較慢。

所謂陣列,就是相同資料型別的元素按一定順序排列的集合;陣列的儲存區間是連續的,占用記憶體比較大,故空間複雜的很大。但陣列的二分查詢時間複雜度小,都是o(1);陣列的特點是:查詢簡單,增加和刪除困難;

1.1 在記憶體中,陣列是一塊連續的區域

1.2 陣列需要預留空間

在使用前需要提前申請所佔記憶體的大小,如果提前不知道需要的空間大小時,預先申請就可能會浪費記憶體空間,即陣列的空間利用率較低。注:陣列的空間在編譯階段就需要進行確定,所以需要提前給出陣列空間的大小(在執行階段是不允許改變的)

1.3 在陣列起始位置處,插入資料和刪除資料效率低。

插入資料時,待插入位置的元素和他後面的所有元素都需要向後搬移

刪除資料時,待刪除位置後面的所有元素都需要向前搬移。

1.4 隨機訪問效率很高,時間複雜度可以達到o(1)

因為陣列的記憶體是連續的,想要訪問那個元素,直接從陣列的首位址向後偏移就可以訪問到了。

1.5 陣列開闢的空間,在不夠使用的時候需要進行擴容;擴容的話,就涉及到需要把舊陣列中的所有元素向新陣列中搬移。

1.6 陣列的空間是從棧分配的。(棧:先進後出)

二、陣列的優點:

隨機訪問性強,查詢速度快,時間複雜度是0(1)

三、陣列的缺點:

3.1 從頭部刪除、從頭部插入的效率低,時間複雜度是o(n),因為需要相應的向前搬移和向後搬移。

3.2 空間利用率不高

3.3 記憶體空間要求高,必須要有足夠的連續的記憶體空間。

3.4 陣列的空間大小是固定的,不能進行動態擴充套件。

所謂鍊錶,鍊錶是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的。鍊錶由一系列結點(鍊錶中每乙個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:乙個是儲存資料元素的資料域,另乙個是儲存下乙個結點位址的指標域。 相比於線性表順序結構,操作複雜。由於不必須按順序儲存,鍊錶在插入的時候可以達到o(1)的複雜度,比另一種線性表順序表快得多,但是查詢乙個節點或者訪問特定編號的節點則需要o(n)的時間,而線性表和順序表相應的時間複雜度分別是o(logn)和o(1)。

鍊錶:鍊錶儲存區間離散,占用記憶體比較寬鬆,故空間複雜度很小,但時間複雜度很大,達o(n)。鍊錶的特點是:查詢相對於陣列困難,增加和刪除容易。

1.1 在記憶體中,元素的空間可以在任意地方,空間是分散的,不需要連續。

1.3 查詢資料時間效率低,時間複雜度是o(n)

因為鍊錶的空間是分散的,所以不具有隨機訪問性,如果需要訪問某個位置的資料,需要從第乙個數開始找起,依次往後遍歷,知道找到待查詢的位置,故可能在查詢某個元素時,時間複雜度是o(n)

1.4 空間不需要提前指定大小,是動態申請的,根據需求動態的申請和刪除記憶體空間,擴充套件方便,故空間的利用率較高

1.5 任意位置插入元素和刪除元素時間效率較高,時間複雜度是o(1)

1.6 鍊錶的空間是從堆中分配的。(堆:先進先出,後進後出)

二、鍊錶的優點

2.1 任意位置插入元素和刪除元素的速度快,時間複雜度是o(1)

2.2 記憶體利用率高,不會浪費記憶體

2.3 鍊錶的空間大小不固定,可以動態拓展。

效能優化 陣列查詢為什麼比煉表快?

1 定址操作次數鍊錶要多一些。陣列只需對 基位址 元素大小 k 就能找到第k個元素的位址,對其取位址就能獲得該元素。鍊錶要獲得第k個元素,首先要在其第k 1個元素尋找到其next指標偏移,再將next指標作為位址獲得值,這樣就要從第乙個元素找起,多了多步定址操作,當資料量大且其它操作較少時,這就有差...

epoll為什麼快

epoll是linux下的一種i o多路復用的操作方式,是event poll的意思 i o多路復用,舉個栗子,在酒吧,乙個服務員,10個顧客在喝酒,服務員有這麼幾種服務方式 服務員從第乙個顧客開始問,你要酒嗎,再問第二個,你要酒嗎,依次問下去,問完一圈,再從頭開始,服務員就是不停的在bbb,要酒嗎...

kafka 為什麼快

一般的 mq 每個訊息都有乙個狀態,這樣每個訊息狀態改變都要更新,增加了很多隨機讀寫。kafka 對每個 partition 只有乙個指標,而不是儲存每個訊息的狀態,所有在指標後面的訊息都是被消費過的訊息。這就去掉了很多 確認訊息 動作的隨機讀寫,通過一次移動指標,來確認多個訊息。很多訊息中介軟體,...