对于小集合大小的TreeSet vs HashSet速度,当O(1)vs O(log n)无关紧要

时间:2015-07-23 05:22:42

标签: java hashset treeset overhead

我一直在阅读HashSet vs TreeSet的复杂性,我发现主题在哪里解释:“HashSet更快,因为它是O(1)而不是O(log N)。”当然,我知道这一点。

然而,只有在您使用非常大的套装时才会有效。另一方面,我需要使用数百万个“小”集,每个集最多包含200个对象,而且远远少于20个(低于20个)。对它们的操作非常多样化(创建,添加,删除,成员资格测试,克隆......)因此我对如何最好地测量/模拟差异感到困惑。

对于如此小的设置尺寸,哪两个类的开销最小?无论是速度还是内存开销。那么LinkedHashSet呢?

2 个答案:

答案 0 :(得分:1)

  

因此我对如何最好地衡量/模拟差异感到困惑。

使用分析器。如果Set操作不支配结果(CPU时间,内存占用,分配率),那么由于amdahl's law.,您的选择在实践中不会产生影响。

TreeSet的最大优点是订购。

并且两种实现都没有特别的内存效率,那里有更好的设置,具体取决于您最关心的性能指标。它们是相应Map实现的包装器,而Maps本身也不是特别有效。

它们更具灵活性,提供了大量的API,而不是优化任何特定的性能方面。

答案 1 :(得分:1)

这个问题没有明确的答案,因为这完全取决于。所以这只是评论的散点图。

  1. Hashset比树集快得多。即使是小套装。
  2. 如果计算您的哈希值和等号是非常昂贵的,请考虑将您的项目包装在仅使用特定用于您的用例的标识信息的类中。如果项目是不可变的并且经常在哈希集之间重用,请考虑缓存哈希值。
  3. 使用分析器确定哪种解决方案最适合实际数据。