我最近被问到'你将如何实施一个可憎的'。我知道散列算法是关键的,因为较少的冲突会带来更好的WRT性能,但是应该使用什么算法/数据结构来为插入/删除/查找提供分摊的常量时间{O(1)}?
答案 0 :(得分:7)
哈希表有两种主要可能性:
关于散列表[在两个解决方案中]的重要部分,为了允许机动化的O(1)插入/ del /查找 - 分配更大的表并在达到预定义的load factor时重新散列。 / p>
编辑:复杂性分析:
假设某些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
。 [看看Sigma(i * p^(i-1)) < 1/(p-1)^2 in wolfram alpha]的正确性。因此平均导致对阵列的恒定访问次数。另外:在达到加载因子后,您可能需要重新运行所有元素,从而导致O(n)
访问数组。这导致n * O(1)
操作[添加n个元素]和1 * O(n)
操作[重新散列],因此您获得:(n * O(1) + 1 * O(n)) / n = O(1)
机械化时间。