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

标签 java hashset treeset overhead

我一直在研究 HashSetTreeSet 的复杂性,并且到处都发现主题解释:“HashSet 更快,因为它O(1) 而不是 O(log n)。”我当然知道这一点。

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

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

最佳答案

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

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

TreeSet 最大的优点是排序。

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

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

关于java - 当 O(1) 与 O(log n) 无关紧要时,TreeSet 与 HashSet 对于小集合大小的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31578766/

相关文章:

java - 如何在 Junit (Java) 中测试集合

java - 如何在二叉树中找到下一个顺序后继者?

java - 如何访问Database类实例?

java - 我们应该使用 HashSet 吗?

java - 如何使用并发执行器 future 在java中的固定时间后使方法超时?

java - 在 java swing 中获取 java.util.ConcurrentModificationException

Java TreeMap : Retrieving multiple values from a single key

带有长度比较器错误的 Java TreeSet?

java - 在MapReduceBase中的configure方法中初始化多输出实例

Java 泛型树遍历