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