2010-07-16 126 views
55

Java中对contains()有最快操作的数据结构是什么?Java中contains()的最快数据结构?

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

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

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

回答

102

查看set(Hashset,enumset)和hash(HashMap,linkedhash ...,idnetityhash ..)的实现。他们有O(1)for contains()

This cheatsheet有很大的帮助。

+7

对于什么是值得的,当散列冲突发生时(通常情况下,如果一次只有很少的情况下它们会发生),散列映射通常不是O(1)查找。最坏的情况是O(n)查找。 – Blindy 2010-07-17 07:27:05

+0

我同意Blindy。基于散列的收集性能受散列函数性能的限制。 – sbidwai 2010-07-17 07:42:33

+0

我最近去的时候,网站已经关闭了。如果发生这种情况,您可以使用此[链接](http://web.archive.org/web/20120105103844/http://www.coderfriendly.com/wp-content/uploads/2009/05/java_collections_v2。 pdf) – EasilyBaffled 2013-04-28 18:17:01

-2

散列(哈希集合)是最好的一个用O(1)

+2

答案与Pangea之间有8分钟的时间。你的增加没有额外的价值,为什么张贴它? – 2010-07-16 18:12:04

+0

@bart真实缓慢的互联网连接 – Will 2010-07-16 18:49:35

+0

@也许会。如果是这样,那么@Satish现在有足够的时间去除他/她多余的答案。然而,他/她选择让它垂涎。也许希望收集一些观点?也许这是开始的意图,谁知道? – 2010-07-16 18:52:55

7

对于数字的你的具体情况具有相对高密度的我会使用一个位集合,它会比一个哈希更快,更小组。

3

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

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

你只会得到一个理想的散列分布的O(1)。但是,您更有可能会碰到散列桶,并且有些查找需要检查多个值。