Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使HashSet操作成为O(n)?_Java_Hashset - Fatal编程技术网

Java 如何使HashSet操作成为O(n)?

Java 如何使HashSet操作成为O(n)?,java,hashset,Java,Hashset,如何使哈希集操作处于启用状态 它具有标准的集合操作Add、Remove、Contains,但由于它使用基于散列的实现,因此这些操作是O1 但手术什么时候开始 谢谢大家! 导致On行为的一种病态情况是,所有元素都具有相同的哈希代码。如果您使用哈希函数,则哈希生成函数本身将根据复杂性生成一个哈希键,那么您的所有操作都将在此复杂性中 NPE基本正确 然而,我应该补充一点,在Java8中,HashMap和HashSet得到了改进,在密钥类型实现可比性的情况下,用二叉树替换长哈希链。看 这意味着只有当所有

如何使哈希集操作处于启用状态

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

但手术什么时候开始


谢谢大家!

导致On行为的一种病态情况是,所有元素都具有相同的哈希代码。

如果您使用哈希函数,则哈希生成函数本身将根据复杂性生成一个哈希键,那么您的所有操作都将在此复杂性中

NPE基本正确

然而,我应该补充一点,在Java8中,HashMap和HashSet得到了改进,在密钥类型实现可比性的情况下,用二叉树替换长哈希链。看


这意味着只有当所有元素都具有相同的hashcode并且密钥类型没有实现可比性时,才会发生ON操作的病态情况。如果密钥类型实现了Comparable,那么HashMap或HashSet上get的最坏情况复杂性是OlogN。

实现这一点而不需要像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);
}

你为什么想知道?让事情变得比平时慢有什么意义?为什么要让它的性能从O1恶化到On?一般来说,当最坏的情况导致遍历所有现有元素时,操作就开始了。因此,将最大的数字插入到已经升序的列表中。然而,对于一个散列结构来考虑这一点,考虑到它与整个要点相反,是毫无意义的。唯一现实的答案是要么是一个小表,要么是一个蹩脚的哈希函数。我想知道你们为什么要谈论恶化——大O表示法描述了一个上限。因此,对于k>=0:@cel,每个合理实现的HashSet的操作都在^k中,你不同意这个问题来自于一个没有合理实现的HashSet的想法吗?让我来回答吧@重写公共final int hashCode{return 42;/*universal answer,random*/}生成哈希键应该独立于n。关键在于键的唯一性如何影响搜索,进而影响性能。@最重要的是不需要生成哈希键,我认为这个问题本身是一种好奇的想法,所以在这种情况下没有理由使用哈希函数complexity@user2040251-让哈希代码的生成依赖于元素的数量是没有意义的。@lostmind:我认为这个问题是修辞性的: