算法 – 哈希表真的可以是O(1)吗?

哈希表可以实现O(1)似乎是常识,但这对我来说从来没有意义.有人可以解释一下吗?以下是两种情况:

答:该值是一个小于哈希表大小的int.因此,该值是它自己的哈希值,因此没有哈希表.但如果有,那将是O(1)并且仍然是低效的.

B.您必须计算值的哈希值.在这种情况下,查找数据大小的顺序为O(n).在你做O(n)工作之后,查找可能是O(1),但在我眼中仍然是O(n).

除非你有一个完美的哈希表或一个大的哈希表,否则每个桶可能有几个项目.因此,无论如何,它在某个时刻转变为一个小的线性搜索.

我认为哈希表很棒,但我没有得到O(1)的名称,除非它只是理论上的.

维基百科的article for hash tables始终引用常量查找时间,完全忽略了哈希函数的成本.这真是一个公平的衡量标准吗?

编辑:总结我学到的东西:

>技术上是正确的,因为哈希函数不需要使用密钥中的所有信息,因此可以是恒定时间,并且因为足够大的表可以将冲突降低到接近恒定的时间.
>在实践中确实如此,因为只要选择散列函数和表大小来最小化冲突,它就会随着时间的推移而发挥作用,即使这通常意味着不使用常量时间散列函数.

最佳答案
这里有两个变量,m和n,其中m是输入的长度,n是散列中的项目数.

O(1)查找性能声明至少做出两个假设:

>在O(1)时间内,您的对象可以相等.
>几乎没有哈希冲突.

如果您的对象是可变大小并且相等检查需要查看所有位,那么性能将变为O(m).然而,散列函数不必是O(m) – 它可以是O(1).与加密散列不同,在字典中使用的散列函数不必查看输入中的每个位以计算散列.实现可以自由查看固定数量的位.

对于足够多的项目,项目的数量将大于可能的哈希值,然后您将获得冲突,导致性能上升到O(1)以上,例如对于简单的链表遍历(或O(n)的O(n) * m)如果两个假设都是假的).

在实践中,尽管O(1)声称在技术上是错误的,但对于许多现实世界的情况,特别是那些上述假设成立的情况,情况大致如此.

转载注明原文:算法 – 哈希表真的可以是O(1)吗? - 代码日志