【发布时间】:2016-12-11 12:41:50
【问题描述】:
我知道ArrayList<> 的搜索速度最快(O(1) 与 O(n)),LinkedList<> 的插入和删除速度最快(O(1) 与 O(n))。
我的问题是,如果将这两者结合使用,检查多个列表 (>2) 是否有共同元素的最佳方法是什么?
当前方法 使用三个列表和一个迭代方法:
out:
for(int a = 0; a < list1.size(); a++) {
for(int b = 0; b < list2.size(); b++) {
for(int c = 0; c < list3.size(); c++) {
if(list1.get(a) == list2.get(b) && list1.get(a) == list3.get(c) ) {
System.out.println(list1.get(a)); // list2.get(b) or list3.get(c) could have been subbed
break out;
}
}
}
}
如何优化效率?
编辑
感谢您提供许多有用的回复 :)
我发现最好的方法是使用 List .retainAll() 函数。
再次,为了找到三个列表中的共同元素,我改进了下面的方法。
list1.retainAll(list2);
list1.retainAll(list3);
for(int i : list1) {
System.out.println(i);
}
【问题讨论】:
-
首先你访问同一个元素 3 次,将 list1.get(a) 存储在一个对象中,你将赢得 2 次列表访问
-
我会使用地图并计算引用。如果你有 n 个列表并且你已经完成了,那么地图中所有计数为 n 的条目都描述了公共元素。这是假设每个列表的元素都是唯一的(没有重复条目)。
-
“我知道
ArrayList<>的搜索速度最快(O(1) vs. O(n))” 这完全取决于您的搜索方式。如果您使用迭代器,LinkedList 不是 O(n)。您正在考虑随机访问,但这是线性遍历。 -
我会复制一份清单(例如,
list1),然后使用listCopy.retainAll(list2); listCopy.retainAll(list3);;listCopy中留下的任何元素都对所有三个列表都是通用的。 -
这样的琐碎代码不应该为了效率而优化,它应该为了清晰而优化。如果那时它成为性能热点,则可以重新评估。
标签: java algorithm performance optimization iteration