为什么在拥有动态数组列表时需要链表?
我研究过静态列表和链表。我有动态数组列表的知识。但我无法找出它之间的确切区别 有人请帮我解答一下
答案 0 :(得分:6)
动态数组是一个根据内容数量向上或向下调整自身大小的数组。
优势:
按索引访问和分配是非常快速的O(1)过程,因为内部索引访问只是
[address of first member] + [offset]
。追加对象(在数组末尾插入)是相对快速摊销的O(1)。与在数组末尾删除对象相同的性能特征。注意:在数组末尾附近追加和删除对象也称为push和pop。
缺点:
在动态数组中随机插入或移除对象是非常慢的O(n / 2),因为它必须每次移动(平均)一半的数组。特别差的是在阵列开始附近插入和移除,因为它必须复制整个阵列。
插入或移除时不可预测的性能需要调整大小
有一些未使用的空间,因为动态数组实现通常会分配超过必要的内存(因为调整大小是非常慢的操作)
Linked List是一个对象,其一般结构为
[head, [tail]]
,head
为数据,tail
为另一个链接列表。有许多版本的链表:单数LL,双LL,圆形LL等。<强>优势:强>
快速O(1)在列表中的任何位置插入和删除,因为链接列表中的插入只会破坏列表,插入并修复它(不需要复制尾部)
链接列表是一个持久的数据结构,很难用简短的句子来解释,请参阅:wiki-link。此优点允许两个链表之间的尾部共享。尾部共享使链接列表易于使用作为写时复制数据结构。
缺点:
慢速O(n)索引访问(随机访问),因为通过索引访问链表意味着您必须以递归方式遍历列表。
地方性差,用于链表的内存散乱一团糟。与之相反,在内存中使用连续地址的数组。数组(稍微)受益于处理器缓存,因为它们彼此接近
其他人:
- 由于链表的性质,你必须递归思考。不习惯递归函数的程序员在编写链表的算法时会遇到一些困难(或者更糟糕的是他们可能会尝试使用索引)。
简单地说,当您想要使用需要随机访问的算法时,请忘记链接列表。如果您想使用需要大量插入和删除的算法,请忘记数组。
这取自question
的最佳答案我对这个答案深信不疑。
答案 1 :(得分:2)
Vector aka Dynamic Array :与常规数组一样。连续存储器位置用于存储矢量。无论何时需要分配更多内存,并且当前位置都没有内存,整个阵列都会被复制到另一个位置并分配额外的内存。
列表:在每个元素中保持一个指针,该指针指向下一个元素。
What are the complexity guarantees of the standard containers? 请查看此链接以获取更多信息。