Java中集合、数组和链表的性能

Java中集合、数组和链表的性能,java,algorithm,data-structures,Java,Algorithm,Data Structures,我试图研究Java中集合、数组和链表在性能方面的差异,因此我正在研究的示例是 如果我们需要看到两个数组、两个集合和两个链表之间的公共对象, 在数组中我们应用for循环和compare,在集合中我们使用interscet或union? 但是在时间上有很大的不同,有什么想法吗?相交的集合和相交的列表或数组之间有区别。 当两个集合相交时,需要迭代其中一个集合,并查看另一个集合中是否有相应的成员。集合的检索时间为O(1),因此交点为O(n)。 当与列表或数组相交时,相交点为O(n^2),因为对于一个列表

我试图研究Java中集合、数组和链表在性能方面的差异,因此我正在研究的示例是
如果我们需要看到两个数组、两个集合和两个链表之间的公共对象, 在数组中我们应用for循环和compare,在集合中我们使用interscet或union?
但是在时间上有很大的不同,有什么想法吗?

相交的集合和相交的列表或数组之间有区别。 当两个集合相交时,需要迭代其中一个集合,并查看另一个集合中是否有相应的成员。集合的检索时间为O(1),因此交点为O(n)。
当与列表或数组相交时,相交点为O(n^2),因为对于一个列表/数组中的每个成员,您需要迭代整个其他列表/数组

我建议您为微基准标记准备一个测试台,以便您可以看到时间上的差异。确保至少重复10次,并在测量之外进行热身。然后计算均值和标准差。如果我没记错的话,有一个漂亮的谷歌项目提供了这个

首先你应该清楚的是渐近复杂性或大O。例如,如果你想做一个集合相交,最好的方法是

 SortedSet<String> set1 = new TreeSet<String>(); // and populate
 SortedSet<String> set2 = new TreeSet<String>(); // and populate
 // intersect of two sorted sets can be done in linear time
SortedSet set1=new TreeSet();//并填充
SortedSet set2=新树集();//并填充
//两个排序集的相交可以在线性时间内完成

<>这是O(n),而你提到的所有其他选择都是O(n ^ 2),读起来更复杂,速度也慢。

如果问题是关于java的,为什么你要标记C++?你是否尝试过在各种场景中测量各种结构的执行时间来得到答案的答案?关于一些示例代码?@ AssiLaa:我可以想象OP想要将结果与C++编写的相同测试进行比较。但如果是这样的话,他应该把它包括在他的问题中。数据结构就是所有语言中的数据结构。我认为数据结构不是特定的语言,甚至目标C工作集的检索时间是O(1)——我不同意。必须指定要使用的集合。散列集?对的树集?不可能。甚至,我也不知道人们在哪里学习并永远坚持哈希提供O(1)查找。这不是真的!除非您有一个完美的哈希读取数组,否则您将始终获得冲突,并对一个哈希桶的冲突元素进行线性搜索!散列不会转换为常数时间!!!在线性时间内保证交集的唯一方法是对两个集合进行排序并同时迭代这两个集合,这是线性的,检查它在STL集合中是如何完成的。Java不提供这一点,您必须自己实现它,也许Apache CollectionUtils提供了这一点…@GiovanniAzua,仅仅因为有碰撞并不意味着它不是O(1)。当我的哈希表包含1000个元素时,如果我必须搜索一个包含5个元素的桶,它仍然是O(1)。
HashSet
在这里给你线性时间O(n),
TreeSet
nlogarithmic O(nlog n)。这不是真的,它取决于底层hashCode()实现的质量,如果你有很多冲突,你将在这里结束O(n^2). 正确的O(n)方法是使用排序集,尽管我不确定Retainal API在这种情况下是否会使用正确的方法。Retainal只是在
AbstractCollection
中实现的,它循环并删除。您所寻找的算法不是在java的SE中实现的,C++的特点是代码< STD::SETIONGRON/<代码>。同意
HashSet
中最坏情况下的复杂度,但我们这里讨论的是摊销复杂度,在平均情况下,插入/查找的性能将优于线性时间。事实上,我一直在寻找集合#intersect,但不在那里,我可能在考虑STL。因为我们不能对底层元素的类型做任何假设,所以我只想站在安全的角度,使用
SortedSet
并自己实现线性交集。