【问题标题】:Fastest Collection Contains Method with 5-10 Integers最快的集合包含 5-10 个整数的方法
【发布时间】:2014-11-11 19:29:50
【问题描述】:

我有一个小问题:我有一个包含 5-10 个整数的集合。它们不会改变或其他任何东西,但它们始终存在。所以我的问题是哪个 Collection 对于 contains 方法应该是最好/最快的:ArrayList、LinkedList、Vector、HashSet 还是...?

【问题讨论】:

  • 只有 5-10 个整数,我认为无论你选择其中任何一个,我都不认为你的表现会受到影响。
  • 您的收藏太小,无法发挥作用。
  • 但如果您想了解自己,这里有一个很好的参考。 bigocheatsheet.com
  • 实际上 IMO(我要逆潮流而行)如果大量使用集合,那么是的,存在(大)差异。例如,让我们想象一下解析器中的一组局部变量(只是为了选择一个教科书示例)。除非一般要求符合您的场景,否则通常不存在这种高度优化的集合(是的,在这种情况下,HashSet 很好,但它不是最佳的)。假设你真的需要它:它是如何搜索的?多常?任何有价值的搜索模式?是否有一个(或多个元素)比其他元素搜索得更频繁?这是动态的还是静态的?

标签: java performance collections


【解决方案1】:

由于计算机加载数据的方式(CPU 优化假设您将使用相邻的内存地址)
使用小数组可能是这里最快的解决方案。

如果实际数字很小,Java 将优化 Integer(非基元),因此使用 ArrayList 应该产生与使用 int[] 相似的结果。
如果您使用更大的数字(不在 -128 到 127 之间),则 int[] 数组将产生更好的结果。

与在 int[] 数组上实际运行 5-10 次比较相比,使用 Hashset 的开销可能会更多。

您可能需要考虑将这些数字放入一系列 IF 条件中。

上述所有内容只有在您每秒运行这些比较至少 100,000 次时才会产生影响。任何低于此的,都没有关系。

总结一下:
代码

【讨论】:

  • 我认为这是一个很好的答案,它符合我的直觉。但是,除非你测量,否则你真的不会知道。
  • @Sjlver 对不起,但我认为这是一个“酒吧”的答案。一般来说这是真的,但是(当然假设 OP 真的需要这个小优化)它太通用了,没有用。数组比 HashSet 快吗?也许,如果搜索最多的元素总是最后一个呢? array/HashSet 是一个不错的选择吗?也许,我们不知道根据哪个标准搜索集合然后我们无法回答。有什么有用的前提条件吗?例如:集合包含从 0 到(相对较小的)N 的整数。在这种情况下,位数组甚至更快。等等(IMO)。
【解决方案2】:

我敢打赌,最好的结果可以通过perfect hashing 获得,假设您想花一些不可忽略的时间来创建集合。有一些计算这种散列的通用方法,但在您的情况下,由于它们的固定开销,它们可能不如简单的数组扫描。

如果创建时间无关紧要,请考虑类似answer of mine 中的算法,其中表单的表达式

TABLE[(MULTIPLIER * c) >> SHIFT] == c

用于测试 c 是否包含在集合中。找到合适的MULTIPLIER 需要一些时间,但测试非常快。

【讨论】:

    猜你喜欢
    • 2016-06-21
    • 2014-04-17
    • 2012-01-24
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    相关资源
    最近更新 更多