陣列和連結串列

airland發表於2021-09-09

陣列和連結串列

1.  記憶體的工作原理

計算機將記憶體會分為很多格子(類似書櫃),每個格子都會對應自己地址,就是記憶體地址

每當計算機接收到儲存命令時,計算機會告訴你一個記憶體地址,表示你的東西存在這個地址。

當需要儲存多個資料時,有兩種基本儲存方式:陣列和連結串列

2. 陣列和連結串列的差異

1. 儲存方式

1.1 陣列儲存方式

利用陣列進行儲存多項資料時,會需要計算機提供一排連續的位置,即是陣列在儲存的時候,必須保證記憶體地址是依次相鄰的,且在新增資料時也必須保證有相鄰的位置提供,附近沒有相鄰的位置,則必須整體遷移(類似和朋友看電影,必須要是相鄰的位置,如果中途有其他朋友來,那麼又要重新尋找有足夠多空餘並且相鄰的位置)。為了避免這種中途新增資料會導致全部資料整體遷移的問題,可以提前請求多個相鄰的位置,但是如果中途沒有資料再次新增,那麼就會導致資源的浪費。或者請求多個位置用完了,那麼又要整天重新遷移位置。

所以在使用陣列進行儲存資料時,速度相對緩慢,且容易浪費資源

1.2 連結串列的儲存方式

連結串列進行儲存時,只需要有足夠的記憶體空間即可進行儲存。連結串列中的每個元素都會攜帶下一個元素的記憶體地址,因此在儲存資料時,只需要修改上一個元素指向的記憶體地址即可。

連結串列在儲存資料時,速度相對較快,且只需要有足夠的記憶體空間即可進行儲存。

2.  查詢方式

2.1 陣列的查詢方式

由於陣列在儲存時記憶體地址都是相鄰的,因此你知道所有元素的記憶體地址,所以可以透過索引的方式進行查詢,而一般陣列的第一個元素的索引為0,即是從0開始依次累加順序。

陣列支援順序查詢和隨機查詢。

陣列在進行查詢時的速度較快(O(1)),因為可以透過簡單的數學運算可以馬上知道你要查詢元素位置.

2.2 連結串列的查詢方式

由於連結串列在儲存時是任意位置儲存的,所以你要知道某個元素的地址,就必須先知道上一個元素的位置,依次類推,則你必須先知道第一個元素的位置,所以連結串列在查詢時只支援順序查詢。

連結串列在查詢時速度較慢(O(n)),因為無法透過簡單的數學運算計算出某個元素的位置,必須要先知道上一個元素的位置

3. 刪除方式

3.1 陣列的刪除方式

陣列在刪除某個元素時,後面的元素必須依次向前移動。因此陣列在刪除元素時的速度較慢(O(n))。

3.2 連結串列的刪除方式

連結串列在刪除某個元素時,只需要修改上一個元素指向的地址即可。因此連結串列在刪除元素時速度較快(O(1))

4. 插入方式

4.1 陣列的插入方式

陣列在插入時必須要保證有足夠的空間,如果沒有足夠的空間,那麼需要整個陣列複製到其他地方。因此在插入元素時陣列速度較慢(O(n)).

4.2 連結串列的插入方式

連結串列在插入時,只需要修改上一個元素指向的位置即可。因此連結串列在插入時速度較快(O(1))。

3. 總結

下面是陣列和連結串列常見的操作執行時間。(注意:有且僅當能夠立即訪問要刪除的元素時,執行時間方為O(1)


陣列 連結串列
查詢 O(1) O(n)
插入 O(n) O(1)
刪除 O(n) O(1)

從表格可以看出,陣列和連結串列都有各自不同的優缺點。所以在使用時需要根據實際情況出發,來判斷使用什麼方式更加便捷。

陣列和連結串列是可以進行混合使用的。

即在陣列中存放一個連結串列的位置。這樣混合後的儲存方式,在查詢時雖然不如陣列,但是比連結串列塊,且在插入和刪除時不必連結串列慢。



作者:python_LiuYi
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/964/viewspace-2819221/,如需轉載,請註明出處,否則將追究法律責任。

相關文章