如何将HashSet操作设为O(n)?

时间:2014-12-26 12:23:53

标签: java hashset

如何将HashSet操作设为O(n)?

它具有标准的集合操作Add,Remove,Contains,但由于它使用基于散列的实现,因此这些操作是O(1)。

但是什么时候是操作O(n)?

谢谢!

4 个答案:

答案 0 :(得分:7)

导致O(n)行为的一种病态情况是所有元素具有相同的哈希码。

答案 1 :(得分:2)

NPE大多是正确的。

但是,我应该补充一点,在Java 8中,HashMapHashSet得到了改进,以便在密钥类型实现Comparable的情况下用二叉树替换长哈希链。 (见JEP-180

这意味着O(N)操作的病态情况仅在所有元素具有相同的哈希码时发生 AND 密钥类型实现{{1 }}。如果密钥类型实现Comparable,那么ComparablegetHashMap的最差情况复杂性为HashSet

答案 2 :(得分:1)

如果你的散列函数(你的散列生成函数本身)将产生O(n)复杂度的散列键,那么你的所有操作都将处于这种复杂性。

答案 3 :(得分:0)

在不覆盖类的情况下实现此目的的简单方法(如NPE所做的)是使用相同的哈希代码创建大量密钥。 e.g。

Set<Long> longs = new HashSet<>();
for (int i = 0; i < 10000; i++) {
    Long element = ((long) i << 32) + (i & 0xFFFFFFFFL);
    assert element.hashCode() == 0;
    longs.add(element);
}