繁体   English   中英

ArrayList或Linked List-如果要执行插入/删除和查找操作,则使用哪个集合

[英]ArrayList or Linked List - Which collection to use if both insertion/deletion and look up operation is to be performed

众所周知,链接列表用于快速插入删除,数组列表用于快速查找

我要求将10000条记录保存在列表中。 我将使用哪个集合。 查找和插入/删除操作都可以在该列表上执行。

我使用哪个收藏集,为什么? 还是我会使用自己创建的收藏集?

插入

LinkedList

首先插入-O(1)

最后插入-O(1)

在任何地方插入-O(n)-这是因为需要按索引查找要插入的位置。

ArrayList

首先插入-O(n)

最后插入-O(1)

插入到任何地方-O(n)


因此, LinkedListArrayList在任何位置都具有相同的O(n)插入。

删除

LinkedList

首先删除-O(1)

最后删除-O(1)

删除任何地方-O(n)-再次是因为需要按索引查找要删除的位置。

ArrayList

首先删除-O(n)

最后删除-O(1)

删除任何地方-O(n)

因此, LinkedListArrayList在任何位置都具有相同的O(n)删除。


如您所见,在任何地方插入和删除都是相同的。 如果您总是插入最后一个操作,则可以使用ArrayList,因为如果您知道索引,则对LinkedList的查找为O(1)和O(n)。 我认为您需要找到最适合使用的黄金中间点。

另外,如果您不关心无复制,则可以使用HashSet。 它基于哈希表,并为插入,删除和查找提供合适的性能(在许多情况下为O(1),O(log(n)))。

HashSet Jdoc

该类为基本操作(添加,删除,包含和大小)提供恒定的时间性能,假设哈希函数将元素正确地分散在存储桶中。

每当您需要选择适合您问题的数据结构时,请在下面的链接中查看这些表。
大复杂性

在不查看数据的情况下,除非您的用例涉及使用ListIterator的大量插入和删除操作(=两端都不操作时在LinkedList上获得O(1)插入和删除操作的方式),否则实际性能会由于较低的开销和较少的指针解引用,建议使用ArrayList

在您选择时很重要的因素:

  1. 您的清单中有什么? 如果您的列表是小对象的集合(例如Integer ),则LinkedList开销将更加明显。 LinkedList每个节点至少需要2个额外的指针,每个节点的估计开销约为8个字节。 更多的内存意味着更多的高速缓存未命中和性能降低。
  2. 您将如何精确地插入和删除? 如果仅在列表末尾插入和删除,则使用ArrayListArrayList的方法。 如果您在随机位置插入和删除,则ArrayList可能仍然是可行的方法(因为扫描速度更快)。 仅当您需要在开始时插入和/或始终使用ListIterator时,您才真正从LinkedList看到性能优势。
  3. 您的列表将变得无序,并且需要多长时间执行一次完整扫描? 虽然理论上所有内存访问都花费相同的时间,但遍历RAM中彼此相邻的元素(由于处理器高速缓存)要比遍历所有元素更快。

最后-您是否考虑过使用SetMap来加快搜索和访问速度? O(n)列表访问快速总结,特别是如果您在循环内使用它。 映射和集合可以提供O(log n)O(1)访问(取决于实现),以显着提高性能。

一些参考:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM