【问题标题】:Performance of set vs arrays vs linked list in Java [closed]Java中集合vs数组vs链表的性能[关闭]
【发布时间】:2012-12-07 12:23:52
【问题描述】:

我正在尝试研究 Java 中集合、数组和链表在性能方面的区别,所以我正在研究的示例是
如果我们需要查看两个数组、两个集合和两个链表之间的公共对象, 在数组中我们应用 for 循环和比较,在集合中我们使用 interscet 还是 union? 但是时间上有很大的不同,有什么想法吗?

【问题讨论】:

  • 如果问题是关于 Java 的,你为什么要标记 C++?您是否尝试过测量各种结构在各种场景中的执行时间以了解答案?
  • 一些示例代码怎么样?
  • @assylias:我可以想象 op 想要将结果与用 C++ 编写的相同测试进行比较。但如果是这样,他应该将其包含在他的问题中。
  • 无论如何,这个问题中没有任何特定于 Java 的内容。数据结构在所有语言中都是如此。
  • 我认为数据结构不是特定语言,即使 Objective C 也可以工作

标签: java algorithm data-structures


【解决方案1】:

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

【讨论】:

  • set 的检索时间是 O(1)——我不同意。您必须指定您正在使用的 哪个 集。哈希集?正确的。树集?没有机会。
  • 甚至,我不知道人们在哪里学习并永远坚持哈希提供 O(1) 查找。这不是真的!除非你有一个完美的哈希读取数组,否则你总是会得到冲突并对一个哈希桶的冲突元素进行线性搜索!哈希不会转化为常数时间!!!
  • 在线性时间内保证交集的唯一方法是对两个集合进行排序并同时迭代两者,这是线性的,检查它是如何在 STL set_intersection 中完成的。
  • Java 不提供这个,你必须自己实现它,也许 Apache CollectionUtils 提供了这个......
  • @GiovanniAzua,仅仅因为你有碰撞并不意味着它不是 O(1)。如果当我的哈希表包含 1000 个元素时,我必须搜索 5 个元素的存储桶,它仍然是 O(1)。
【解决方案2】:

我建议您为 microbenchmarking 准备一个测试平台,这样您就可以看到时间上的差异。确保至少重复 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

上面这个是 O(n) 而你提到的所有其他选择都是 O(n^2) 读取更复杂和更慢。

【讨论】:

  • HashSet 在这里给你线性时间 O(n),TreeSet n对数 O(nlog n)。
  • 不是真的,这取决于底层 hashCode() 实现的质量,如果你有很多冲突,你最终会在 O(n^2) 中结束。正确的 O(n) 方法是使用排序集,即使我不确定在这种情况下 retainAll API 是否会采用正确的方法。
  • retainAll 只是在AbstractCollection 中实现,它循环和删除。您正在寻找的算法未在 Java 的 SE 中实现,但 C++ 以std::set_intersection 为特色。同意HashSet 中的最坏情况复杂性,但我们在这里讨论的是摊销复杂性,在平均情况下,插入/查找的性能将优于线性时间。
  • 确实我在寻找 Collections#intersect 但不在那里,我可能正在考虑 STL。由于我们无法对底层元素的类型做出任何假设,所以我会保持安全,使用SortedSet&lt;T&gt; 并自己实现线性交集。
猜你喜欢
  • 1970-01-01
  • 2013-01-28
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多