【问题标题】:Fastest data structure for contains() in Java?Java中包含()的最快数据结构?
【发布时间】:2011-03-17 02:30:25
【问题描述】:

Java 中对 contains() 运算速度最快的数据结构是什么?

例如我有一组数字 { 1, 7, 12, 14, 20... }

给定另一个任意数字 x,生成 x 是否包含在集合中的布尔值的最快方法(平均而言)是什么? !contains() 的概率大约高出 5 倍。

所有的map结构都提供o(1)操作吗? HashSet 是最快的方法吗?

【问题讨论】:

    标签: java data-structures set


    【解决方案1】:

    查看基于集合 (Hashset, enumset) 和哈希 (HashMap,linkedhash...,idnetityhash..) 的实现。他们有 O(1) for contains()

    This cheatsheet 很有帮助。

    【讨论】:

    • 对于它的价值,当哈希冲突发生时,哈希映射通常不是 O(1) 的查找(而且它们可能经常发生,如果一次很少发生)。最坏的情况是查找中的 O(n)。
    • 我同意 Blindy 的观点。基于散列的集合的性能受到散列函数性能的限制。
    • 我最近去的时候,网站宕机了。如果你遇到这种情况,你可以使用这个link
    • 由于 robots.txt 无法抓取或显示页面(请更正链接)
    【解决方案2】:

    唯一比 HashSet 更快的数据结构可能是来自 Trove4J 的 TIntHashSet。这使用原语避免使用整数对象。

    如果整数的数量很少,您可以创建一个 boolean[],其中每个存在的值都转换为“true”。这将是 O(1)。注意:HashSet 不保证为 O(1),更有可能为 O(log(log(N)))。

    对于理想的散列分布,您只会得到 O(1)。但是,您更有可能会遇到散列存储桶的冲突,并且某些查找需要检查多个值。

    【讨论】:

      【解决方案3】:

      对于密度相对较高的数字的特殊情况,我会使用 BitSet,它会比散列集更快且更小。

      【讨论】:

        【解决方案4】:

        hashing(hash set) 是 O(1) 中最好的一个

        【讨论】:

        • 您的答案与 Pangea 的答案之间有 8 分钟的时间。你的没有增加额外的价值,那为什么要发布呢?
        • @bart 网速真的很慢
        • @Will,也许吧。如果是这样,那么现在@Satish 有足够的时间来删除他/她的多余答案。然而她/他选择让它悬空。也许是希望收集一些积分?也许这就是开始的意图,谁知道呢?
        • @Bart:您的赞成/反对投票比率表明您对人有点苛刻。放松^_^
        • @Po,供您参考,我不是对人们很难,而是对人们给出的我认为错误的答案或不添加任何新信息。在我对这些答案投反对票之前,我通常会先发表评论,为什么我认为答案是错误/不合适的。如果 OP 不采取行动或解释他/她自己,我投下反对票。毕竟,这就是 SO 的全部意义所在!如果 OP 会在他/她的答案中添加一些额外的信息或只是将其删除,那么在这种情况下我不会投反对票。再一次,我不是投票反对(或反对)人们,而是他们给出的答案。很大的不同。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-19
        • 2012-04-10
        • 2012-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多