數組和鏈表是兩種基本的數據結構,他們在內存存儲上的表現不一樣,所以也有各自的特點
數組
一、數組的特點
1.在內存中,數組是一塊連續的區域
2.數組需要預留空間
在使用前需要提前申請所佔內存的大小,這樣不知道需要多大的空間,就預先申請可能會浪費內存空間,即數組空間利用率低
ps:數組的空間在編譯階段就需要進行確定,所以需要提前給出數組空間的大小(在運行階段是不允許改變的)
3.在數組起始位置處,插入數據和刪除數據效率低。
插入數據時,待插入位置的的元素和它後面的所有元素都需要向後搬移
刪除數據時,待刪除位置後面的所有元素都需要向前搬移
4.隨機訪問效率很高,時間複雜度可以達到O(1)
因爲數組的內存是連續的,想要訪問那個元素,直接從數組的首地址處向後偏移就可以訪問到了
5.數組開闢的空間,在不夠使用的時候需要擴容,擴容的話,就會涉及到需要把舊數組中的所有元素向新數組中搬移
6.數組的空間是從棧分配的
二、數組的優點
隨機訪問性強,查找速度快,時間複雜度爲O(1)
三、數組的缺點
1.頭插和頭刪的效率低,時間複雜度爲O(N)
2.空間利用率不高
3.內存空間要求高,必須有足夠的連續的內存空間
4.數組空間的大小固定,不能動態拓展
鏈表
一、鏈表的特點
1.在內存中,元素的空間可以在任意地方,空間是分散的,不需要連續
2.鏈表中的元素都會有兩個屬性,一個是元素的值,另一個是指針,此指針標記了下一個元素的地址
每一個數據都會保存下一個數據的內存的地址,通過此地址可以找到下一個數據
3.查找數據時效率低,時間複雜度爲O(N)
因爲鏈表的空間是分散的,所以不具有隨機訪問性,如要需要訪問某個位置的數據,需要從第一個數據開始找起,依次往後遍歷,直到找到待查詢的位置,故可能在查找某個元素時,時間複雜度達到O(N)
4.空間不需要提前指定大小,是動態申請的,根據需求動態的申請和刪除內存空間,擴展方便,故空間的利用率較高
5.任意位置插入元素和刪除元素效率較高,時間複雜度爲O(1)
6.鏈表的空間是從堆中分配的
二、鏈表的優點
1.任意位置插入元素和刪除元素的速度快,時間複雜度爲O(1)
2.內存利用率高,不會浪費內存
3.鏈表的空間大小不固定,可以動態拓展
三、鏈表的缺點
隨機訪問效率低,時間複雜度爲0(N)
數組和鏈表操作空間複雜度表格對比圖
綜上:
對於想要快速訪問數據,不經常有插入和刪除元素的時候,選擇數組。
對於需要經常的插入和刪除元素,而對訪問元素時的效率沒有很高要求的話,選擇鏈表。
參考鏈接:https://blog.csdn.net/dangzhangjing97/article/details/81699050