我有以下情况,我正在寻找"最佳"实现:
java.util.Collection
中以实现接口hashCode
n
(初始化时已知最大capacity
)hashCode
介于0
到n
Set
- 需要属性)contains
的效果非常重要(需要:O(1)
,至少O(log_n)
)我的第一个想法是使用new HashSet<item>(n+1, 1.0)
,但经过一些阅读后我发现它将内部哈希函数应用于项目的hashCode
,因此仍会发生哈希冲突,即使hashCodes
是唯一的hachCode <= n
。
我的第二个想法是使用本机数组(new item[n]
)并使用hashCode
作为索引。这似乎是具有最佳性能的实现,但我的界面需要java.util.Collection
,并且该集合将与contains
和add
一起使用,这与第二个的好处不兼容方法
我是否遗漏了某些内容,或者我是否必须接受HashSet
的开销和冲突才能获得最佳效果?
答案 0 :(得分:4)
使用HashSet
仍然可以提供良好的性能,但考虑到您描述的特定要求(并假设n
它不是太大),您可以创建自己的{ArraySet'实现{{ 1}} interface:
Set
的后备数组来存储数据。n+1
将使用元素的contains
来查找与hashCode
匹配的索引是否具有非空值。hashCode()
将使用添加元素的add
来查找应添加元素的数组的索引。此解决方案可能比hashsCode
稍微更有效,因为它包含更少的开销。但是,如果HashSet
很大,它将在内存使用方面具有广泛性。
答案 1 :(得分:0)
鉴于需求,建议您使用HashSet。它将表现更好。正如您提到的,最大元素数和Set的最大容量都具有相同的大小。此外,每个元素具有唯一的哈希码。在这种情况下,哈希键冲突很少发生变化。因此,不必担心contains函数。使用提到的数据集,包含将在O(1)中执行。同样,添加也将以不变的顺序执行。即O(1)。