gpt4 book ai didi

java - LinkedList 与 ArrayList 在维护有序列表方面的性能

转载 作者:太空狗 更新时间:2023-10-29 23:03:09 25 4
gpt4 key购买 nike

我想维护一个有序的 List<Integer>大小 <= 10^6。每次添加新元素时,我都会调用 Collections.sort()方法对列表中的新元素进行排序。据我所知ArrayListLinkedList 表现更好.但是因为我会调用sort()方法很常见,我开始理解linkedList在对列表进行排序时会表现得更好,并且是比 ArrayList 更好的选择,因为没有像 ArrayList 那样的元素移动(使用 array 作为基础数据结构)。任何更有效的建议。

最佳答案

您可以在排序列表上使用 Collections#binarySearch 来找到正确的插入点。 ArrayList 可能会比 LinkedList 表现更好,尤其是对于较大的尺寸,但这很容易测试。

我对各种方法进行了微基准测试:在每次插入后使用排序或使用 binarySearch 将其插入到正确的位置,这两种方法均使用 ArrayList (AL) 和 LinkedList (LL)。我还添加了 Commons TreeList 和 guava 的 TreeMultiset。

结论

  • 测试中最好的算法是使用 TreeMultiset,但严格来说它不是列表 - 次佳选择是使用 ArrayList + binarySearch
  • ArrayList 在所有情况下都比 LinkedList 表现更好,后者需要几分钟才能完成 100,000 个元素(ArrayList 花费不到一秒)。

最佳执行者代码,供引用:

@Benchmark public ArrayList<Integer> binarySearchAL() {
ArrayList<Integer> list = new ArrayList<> ();

Random r = new Random();
for (int i = 0; i < n; i++) {
int num = r.nextInt();
int index = Collections.binarySearch(list, num);
if (index >= 0) list.add(index, num);
else list.add(-index - 1, num);
current = list.get(0); //O(1), to make sure the sort is not optimised away
}
return list;
}

bitbucket 上的完整代码.

完整结果

“Benchmark”列包含被测方法的名称(baseLine 只是填充一个列表而不对其进行排序,其他方法有明确的名称:AL=ArrayList、LL=LinkedList、TL=Commons TreeList、treeMultiSet=guava) , (n) 是列表的大小,Score 是花费的时间,以毫秒为单位。

Benchmark                            (n)  Mode  Samples     Score     Error  Units
c.a.p.SO28164665.baseLine 100 avgt 10 0.002 ± 0.000 ms/op
c.a.p.SO28164665.baseLine 1000 avgt 10 0.017 ± 0.001 ms/op
c.a.p.SO28164665.baseLine 5000 avgt 10 0.086 ± 0.002 ms/op
c.a.p.SO28164665.baseLine 10000 avgt 10 0.175 ± 0.007 ms/op
c.a.p.SO28164665.binarySearchAL 100 avgt 10 0.014 ± 0.001 ms/op
c.a.p.SO28164665.binarySearchAL 1000 avgt 10 0.226 ± 0.006 ms/op
c.a.p.SO28164665.binarySearchAL 5000 avgt 10 2.413 ± 0.125 ms/op
c.a.p.SO28164665.binarySearchAL 10000 avgt 10 8.478 ± 0.523 ms/op
c.a.p.SO28164665.binarySearchLL 100 avgt 10 0.031 ± 0.000 ms/op
c.a.p.SO28164665.binarySearchLL 1000 avgt 10 3.876 ± 0.100 ms/op
c.a.p.SO28164665.binarySearchLL 5000 avgt 10 263.717 ± 6.852 ms/op
c.a.p.SO28164665.binarySearchLL 10000 avgt 10 843.436 ± 33.265 ms/op
c.a.p.SO28164665.sortAL 100 avgt 10 0.051 ± 0.002 ms/op
c.a.p.SO28164665.sortAL 1000 avgt 10 3.381 ± 0.189 ms/op
c.a.p.SO28164665.sortAL 5000 avgt 10 118.882 ± 22.030 ms/op
c.a.p.SO28164665.sortAL 10000 avgt 10 511.668 ± 171.453 ms/op
c.a.p.SO28164665.sortLL 100 avgt 10 0.082 ± 0.002 ms/op
c.a.p.SO28164665.sortLL 1000 avgt 10 13.045 ± 0.460 ms/op
c.a.p.SO28164665.sortLL 5000 avgt 10 642.593 ± 188.044 ms/op
c.a.p.SO28164665.sortLL 10000 avgt 10 1182.698 ± 159.468 ms/op
c.a.p.SO28164665.binarySearchTL 100 avgt 10 0.056 ± 0.002 ms/op
c.a.p.SO28164665.binarySearchTL 1000 avgt 10 1.083 ± 0.052 ms/op
c.a.p.SO28164665.binarySearchTL 5000 avgt 10 8.246 ± 0.329 ms/op
c.a.p.SO28164665.binarySearchTL 10000 avgt 10 735.192 ± 56.071 ms/op
c.a.p.SO28164665.treeMultiSet 100 avgt 10 0.021 ± 0.001 ms/op
c.a.p.SO28164665.treeMultiSet 1000 avgt 10 0.288 ± 0.008 ms/op
c.a.p.SO28164665.treeMultiSet 5000 avgt 10 1.809 ± 0.061 ms/op
c.a.p.SO28164665.treeMultiSet 10000 avgt 10 4.283 ± 0.214 ms/op

对于 10 万个项目:

c.a.p.SO28164665.binarySearchAL    100000  avgt        6  890.585 ± 68.730  ms/op
c.a.p.SO28164665.treeMultiSet 100000 avgt 6 105.273 ± 9.309 ms/op

关于java - LinkedList 与 ArrayList 在维护有序列表方面的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28164665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com