陣列和連結串列
陣列和連結串列
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- day1-陣列和連結串列陣列
- 陣列與連結串列陣列
- 面試-陣列和連結串列的區別面試陣列
- 陣列模擬單連結串列陣列
- 可變陣列——連結串列前言陣列
- 資料結構--陣列、單向連結串列、雙向連結串列資料結構陣列
- 線性結構 陣列與連結串列陣列
- 聊聊陣列與連結串列,棧與佇列陣列佇列
- L2-022 重排連結串列【陣列】陣列
- 歸併排序:陣列和連結串列的多種實現排序陣列
- 線性表(陣列、連結串列、佇列、棧)詳細總結陣列佇列
- L2-002 連結串列去重【陣列】陣列
- 資料結構-棧(通過陣列和單向連結串列實現)資料結構陣列
- 重溫四大基礎資料結構:陣列、連結串列、佇列和棧資料結構陣列佇列
- 關於多項式的加和、乘積可用連結串列和陣列陣列
- 陣列模擬雙連結串列,你get到了嗎?陣列
- 陣列模擬單連結串列你會了嗎?陣列
- 資料結構--單連結串列(通過陣列實現)資料結構陣列
- 為什麼陣列查詢比連結串列要快?而插入刪除比連結串列效率低陣列
- 資料結構與演算法整理總結---陣列,連結串列資料結構演算法陣列
- C/C++ 陣列連結串列表示式計算C++陣列
- Android技能樹 — 陣列,連結串列,雜湊表基礎小結Android陣列
- 重學資料結構和演算法(一)之複雜度、陣列、連結串列、棧、佇列、圖資料結構演算法複雜度陣列佇列
- 佇列_單向連結串列佇列
- 連結串列&鏈棧&佇列佇列
- 連結串列!比陣列更適合做增刪操作的資料結構陣列資料結構
- Java集合原始碼分析之基礎(一):陣列與連結串列Java原始碼陣列
- 《演算法圖解》NOTE 2 陣列、連結串列及選擇排序演算法圖解陣列排序
- [redis]SDS和連結串列Redis
- 資料結構與演算法知識點總結(1)陣列與連結串列資料結構演算法陣列
- 連結串列 - 單向連結串列
- 連結串列-迴圈連結串列
- 連結串列-雙向連結串列
- 連結串列4: 迴圈連結串列
- 連結串列-雙向通用連結串列
- 連結串列-單連結串列實現
- 結構與演算法(03):單向連結串列和雙向連結串列演算法
- 連結串列-雙向非通用連結串列