回答
動態數組是根據內容數量調整自身大小的數組。
優勢:
訪問和分配由索引是非常快的O(1)過程中,由於內部索引訪問只是
[address of first member] + [offset]
。追加對象(在數組末尾插入)相對較快的攤銷O(1)。與刪除數組末尾的對象相同的性能特徵。注意:在數組末尾附近添加和移除對象也稱爲推送和彈出。缺點:
插入或者在一個動態數組的隨機位置移除對象是很慢的O(N/2),因爲它必須轉移(平均)的一半數組每次。特別差的是在陣列開始附近插入和移除,因爲它必須複製整個陣列。
- 當插入或去除需要調整大小
有一個位的未使用的空間中,由於動態數組實現通常比需要分配更多的存儲器
不可預知的性能(因爲調整大小是一個非常緩慢的操作)
鏈接列表是一個對象,它的一般結構爲
[head, [tail]]
,head
是數據,而tail
是另一個鏈接列表。鏈表有多種版本:單數LL,雙LL,圓LL等。優勢:
快速O(1)的插入和移除在列表中的任何位置,如插入在鏈表僅打破列表,插入和修復它回到一起(沒有需要複製尾部)
鏈表是一個持久的數據結構,很難用短句解釋,參見:wiki-link。這個優勢允許尾部共享兩個鏈表之間。尾部共享可以很容易地將鏈接列表用作寫時複製數據結構。
缺點:
慢O(n)的索引訪問(隨機存取),因爲通過索引訪問鏈表意味着你必須在列表上遞歸循環。
不好的地方,用於鏈表的內存散亂一團。與在內存中使用連續地址的數組相反。從處理器高速緩存陣列(略)的好處,因爲他們都是互相靠近
其他:
- 由於鏈表的性質,你必須遞歸認爲。不習慣遞歸函數的程序員在爲鏈表編寫算法時可能會遇到一些困難(或者更糟糕的是他們可能會嘗試使用索引)。
簡而言之,當您要使用需要隨機訪問的算法時,請忘記鏈接列表。當你想使用需要大量插入和移除的算法時,忘記數組。
這是從這個question
最好的答案我被這個答案相信服用。
矢量又名動態數組:像普通數組一樣。連續的存儲單元用於存儲矢量。無論何時您需要分配更多內存,並且內存在當前位置不可用,整個陣列都會被複制到另一個位置,並分配額外的內存。
列表:在每個元素中維護一個指針,並且該指針指向下一個元素。
What are the complexity guarantees of the standard containers? 看看這個鏈接瞭解更多信息。
- 1. Unity c#數組vs靜態列表
- 2. 動態表名vs靜態表中的數組列
- 3. Angular的深層鏈接 - 動態鏈接vs靜態鏈接
- 4. 在Java中設置vs數組vs vs鏈表的性能
- 5. C++ std :: map vs動態數組
- 6. 流量控制滑動窗口的實現。哪個更好靜態隊列(數組)vs動態鏈接列表?
- 7. ObjC二維數組:陣列vs線性陣列vs C數組?
- 8. C++數組vs vs向量
- 9. GCC靜態庫鏈接VS動態鏈接
- 10. 接口方法agruments數組vs vs util列表
- 11. Python數組vs列表
- 12. Erlang數組vs列表
- 13. 列表查看HTML靜態VS動態
- 14. 鏈接器錯誤(VS 2005 VS VS 2012)
- 15. Qt中的靜態鏈接 - > VS 2008中的鏈接錯誤
- 16. @import vs鏈接
- 17. 這些性能數字背後的理由:數組vs vs列表C#
- 18. 數組動態列表C#
- 19. 數組c的malloc()VS {}
- 20. C++ deque vs隊列vs棧
- 21. 動態Sql VS臨時表
- 22. 元組VS列表VS Numpy數組用於繪製Python中的Boxplot
- 23. C數組vs Obj-C數組
- 24. 如何在c中創建鏈接列表節點的動態數組?
- 25. C數組鏈接列表,將數組鏈接列表分配給另一個
- 26. IE火狐VS鏈接(哈希VS HTM5)
- 27. 連接表vs外鍵數組?
- 28. C++使用鏈表和動態數組
- 29. 動態構建數據表vs腳本
- 30. 元組vs python中的列表對象
我不是。作者誤用big-O(不存在O(n/2)),稱O(n)「非常緩慢」(我爲超線性複雜性保留「非常」),聲稱陣列的局部性好處是「輕微「(它們非常龐大,以至於在數組中插入數百個便宜到複製的元素甚至更快),並且關於鏈表是持久的(單鏈表*可以是持久的,但標準forward_list不是,雙鏈表永遠不會持久)。他還聲稱你必須考慮鏈表的遞歸。 –