当 O(1) 与 O(log n) 无关紧要时,TreeSet 与 HashSet 的小集合速度

TreeSet vs HashSet speed for small set size, when O(1) vs O(log n) doesn't matter

我一直在阅读 HashSetTreeSet 的复杂性,并且到处都能找到解释的主题:“HashSet 更快,因为它是 O(1) 而不是 O (记录 n)。”这个我当然知道。

但是,这仅适用于处理非常大的集合时。另一方面,我需要处理数百万个 "small" 集合,每个集合最多包含 200 个对象,而且最多包含更少(低于 20 个)。对它们的操作非常多样(创建、添加、删除、成员测试、克隆……),因此我对如何最好地 measure/simulate 感到困惑。

对于如此小的集合大小,类 中哪一个的开销最小?在速度和内存开销方面。那么 LinkedHashSet 呢?

and hence I'm puzzled on how to best measure/simulate the difference.

使用分析器。如果 Set 操作不支配结果(CPU 时间、内存占用、分配率),那么由于 amdahl's law..

,您的选择在实践中不会产生影响

TreeSet最大的优点就是排序。

而且这两种实现都不是特别节省内存,还有更好的 Set,具体取决于您最关心的性能指标。它们是相应 Map 实现的包装器,而 Map 本身也不是特别有效。

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

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

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