java linkedlist排序,java – 在维护有序列表时,LinkedList与ArrayList的性能

您可以在排序列表中使用Collections#binarySearch查找正确的插入点. ArrayList可能会比LinkedList更好,特别是对于large-ish大小,但这很容易测试.

我运行了各种方法的基准测试:在每次插入后使用排序或binarySearch插入到正确的位置,包括ArrayList(AL)和LinkedList(LL).我还添加了Commons TreeList和番石榴的TreeMultiset.

结论

>测试中最好的算法是使用TreeMultiset,但它不是严格的列表 – 下一个最佳选择是使用ArrayList binarySearch

> ArrayList在所有情况下都比LinkedList更好,后者花费了几分钟时间完成了100,000个元素(ArrayList花费了不到1秒).

最佳表演者代码,供参考:

@Benchmark public ArrayList binarySearchAL() {

ArrayList 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;

}

全部结果

“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

对于100k项目:

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值