Java中contains()的最快数据结构?


68

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

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

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

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

Answers:


127

看一下基于集合(哈希集,枚举集)和哈希(HashMap,linkedhash ...,idnetityhash ..)的实现。他们对contains()有O(1)

该备忘单有很大帮助。


7
值得一提的是,散列冲突发生时,散列映射通常在查找中不是O(1)(而且一次发生的次数非常少,它们可能会经常发生)。最糟糕的情况是查找中的O(n)。
布林迪

我同意布林迪。基于哈希的集合的性能受哈希函数的性能限制。
sbidwai

我最近去的时候,该网站已经关闭。如果您遇到这种情况,可以使用此链接
EasilyBaffled

由于robots.txt而无法抓取或显示页面(更正了链接plz)
iluvatar_GR 2013年

9

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


5

Trove4J的TIntHashSet可能是唯一比HashSet快的数据结构。这使用原语,避免了使用整​​数对象的需要。

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

对于理想的哈希分布,您只会得到O(1)。但是,您很可能会遇到哈希桶的冲突,并且某些查找将需要检查多个值。


-2

hashing(hash set)是O(1)最好的


7
答案和Pangea的答案之间有8分钟的路程。您的没有增加任何额外的价值,为什么要发布它?
巴特·基尔斯

1
@bart真正的慢速互联网连接

@Will,也许。如果是这样,那么@Satish现在有足够的时间删除他/她的多余答案。然而,他/他选择让它悬挂。也许希望收集一些观点?也许那是开始的意图,谁知道呢?
巴特·基尔斯

8
@Bart:您的上/下投票率表明您对人有点困难。放松^ _ ^
Phil

1
@Po,为您提供信息,我对人们并不难,但对人们给出的答案(我认为是错误的或未添加任何新信息)并不难。在我否决此类答案之前,我通常通常先发表评论,说明为什么我认为答案错误/不合适。如果OP不采取任何行动或对他/她自己进行解释,我投了反对票。那就是SO的全部意义所在!如果OP会在他/她的答案中添加一些额外的信息,或者只是删除它,那么在这种情况下,我就不会拒绝投票。再说一次,我不是在投票赞成或拒绝别人,而是要他们给出答案。很大的不同。
巴特·基尔斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.