我知道你可以通过键来访问你的集合。然而,哈希函数本身在幕后执行了许多操作,是吗?
假设你有一个非常有效的好哈希函数,它仍然可能需要执行许多操作。
这可否解释一下?
我知道你可以通过键来访问你的集合。然而,哈希函数本身在幕后执行了许多操作,是吗?
假设你有一个非常有效的好哈希函数,它仍然可能需要执行许多操作。
这可否解释一下?
O(1)
并不意味着瞬间完成。 O(1)
意味着在数据规模变化的情况下仍然保持常数级别的复杂度。哈希函数需要一定的时间,但这段时间不会随着集合大小的增加而变长。
GetHashCode()
方法以某种方式组合项的哈希码。如果我要实现这样一个类,对于初始实现,我会完全按照这种方式实现 GetHashCode()
。当然,我以后也会进行更改。 - user743382如果a.equals(b)则hash(a)==hash(b)
。将集合作为哈希函数的一部分将导致整个字典停止工作,如果这导致集合更改,则哈希值也会更改。 - Martin C.
HashFunc
本身在幕后执行了很多操作。
这是确实的。然而,这些操作的数量取决于密钥的大小,而不是它被插入的哈希表的大小:计算哈希函数的操作数量对于在有十个或一万个条目的表中的密钥来说是相同的。
这就是为什么调用哈希函数通常被认为是O(1)的原因。对于固定大小的键(整数值和固定长度字符串),这种方法效果良好。对于变长键,它也提供了一个可行的上限。
尽管如此,哈希表的访问时间通常是O(k),其中k
是哈希密钥的上限。
log(n)
个比特表示,否则无法拥有 n
个不同项的哈希表。 - Owenk
不需要是一个上限。查找时间与键的大小成线性关系,因此它确实是 O(k)
,其中 k
是键的大小。如果将 k
理解为上限,则实际上是 O(1)
。 - usrHashMap
实现字典/映射,它的最佳情况时间复杂度为O(1)
,因为在最佳情况下,只需要计算键元素的哈希码即可检索,如果没有键冲突。O(n)
,因为此时它会退化为扫描包含数据的整个数组的线性扫描。O(1)
并不意味着瞬间完成,而是指具有常数量级。因此,选择正确的字典实现也可能取决于集合中元素的数量,因为如果条目很少,函数的常数成本非常高,这将更糟糕。HashMap
在检测到多个冲突时会采用平衡树。 - acelent来自文档:
通过使用其键检索值非常快,接近O(1),因为T:System.Collections.Generic.Dictionary`2类实现为哈希表。
因此它可以是O(1),但可能会更慢。 在这里,您可以找到关于哈希表性能的另一个线程:哈希表-为什么比数组更快?
我们知道哈希函数通过键访问值需要O(1)的时间...所以这并不意味着只需一步即可获取该值,它意味着常数时间“t”,其中“t”不取决于数据结构的大小(例如:Python字典())。