【发布时间】: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
Java 中对 contains() 运算速度最快的数据结构是什么?
例如我有一组数字 { 1, 7, 12, 14, 20... }
给定另一个任意数字 x,生成 x 是否包含在集合中的布尔值的最快方法(平均而言)是什么? !contains() 的概率大约高出 5 倍。
所有的map结构都提供o(1)操作吗? HashSet 是最快的方法吗?
【问题讨论】:
标签: java data-structures set
查看基于集合 (Hashset, enumset) 和哈希 (HashMap,linkedhash...,idnetityhash..) 的实现。他们有 O(1) for contains()
This cheatsheet 很有帮助。
【讨论】:
唯一比 HashSet 更快的数据结构可能是来自 Trove4J 的 TIntHashSet。这使用原语避免使用整数对象。
如果整数的数量很少,您可以创建一个 boolean[],其中每个存在的值都转换为“true”。这将是 O(1)。注意:HashSet 不保证为 O(1),更有可能为 O(log(log(N)))。
对于理想的散列分布,您只会得到 O(1)。但是,您更有可能会遇到散列存储桶的冲突,并且某些查找需要检查多个值。
【讨论】:
对于密度相对较高的数字的特殊情况,我会使用 BitSet,它会比散列集更快且更小。
【讨论】:
hashing(hash set) 是 O(1) 中最好的一个
【讨论】: