最近有人问我“如何实现哈希表”。我知道哈希算法对性能至关重要,因为冲突越少,性能就越好。但是,为了实现插入/删除/查找的平摊常数时间{O(1)},应该使用什么算法/数据结构呢?
最近有人问我“如何实现哈希表”。我知道哈希算法对性能至关重要,因为冲突越少,性能就越好。但是,为了实现插入/删除/查找的平摊常数时间{O(1)},应该使用什么算法/数据结构呢?
哈希表有两个主要的可能性:
哈希表[在两种解决方案中]的重要部分,为了允许自动化的O(1)插入/删除/查找 - 是分配一个更大的表并在达到预定义的负载因子时重新哈希。
编辑: 复杂度分析:
假设负载因子为p
,其中p < 1
。
p
,因此数组访问的平均值为:Sigma(i * p^(i-1) * (1-p)) for each i in [1,n]
。这给出了:Sigma(i * p^(i-1) * (1-p)) = (1-p) * Sigma(i * p^(i-1)) <= (1-p) * 1/(p-1)^2 = 1-p = CONST
。[请查看在wolfram alpha中验证Sigma(i * p^(i-1)) < 1/(p-1)^2的正确性]。因此,平均情况下对数组进行恒定数量的访问。另外:当负载因子达到后,您可能需要重新散列所有元素,导致对数组进行O(n)
次访问。这将导致n * O(1)
个操作[添加n个元素]和1 * O(n)
个操作[重新散列],因此您得到:(n * O(1) + 1 * O(n)) / n = O(1)
的机械化时间。