algorithm - 将 n 个元素插入空哈希表的运行时间

标签 algorithm hash runtime hashtable hashmap

人们说将 O(1) 分摊到哈希表中。因此,放n个元素一定是O(n)。然而,对于大 n 来说情况并非如此,因为正如一位回答者所说,“满足预期的分摊 O(1) 所需要做的就是扩展表并在发生冲突时使用新的随机散列函数重新散列所有内容。”

那么:将 n 个元素插入哈希表的平均运行时间是多少?我意识到这可能与实现有关,所以请提及您所谈论的实现类型。

例如,如果存在 (log n) 次等距碰撞,并且每次碰撞都需要 O(k) 来解决,其中 k 是哈希表的当前大小,那么您将具有以下递推关系:

T(n) = T(n/2) + n/2 + n/2

(也就是说,你花时间插入n/2个元素,然后你有一个碰撞,用n/2个来解决,然后你在没有碰撞的情况下进行剩余的n/2个插入)。这仍然是 O(n),所以是的。但这合理吗?

最佳答案

这完全取决于您的重新散列效率有多低。具体来说,如果您第二次可以正确估计哈希表的预期大小,您的运行时间仍然接近 O(n)。实际上,在确定预期顺序之前,您必须指定重新哈希大小计算的效率有多低。

关于algorithm - 将 n 个元素插入空哈希表的运行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/826492/

相关文章:

操作逗号分隔的范围列表的 Pythonic 方法 “1-5,10-25,27-30”

python - 复杂度与运行时间的实际增长不匹配? (Python)

c++ - 什么数据结构可以在 O(log n) 时间内找到给定范围内的元素数量?

java - 为什么Java没有类似Comparator的接口(interface),而是用于散列的?

java - 如何在不更改代码的情况下动态拦截 jar 中的方法?

c# - 需要解决方法 : notify a user that exe is missing dependencies from within the application?

c# - 创建一个 "spell check"以合理的运行时间检查数据库

algorithm - T(n) is constant for n < 2 在递归中意味着什么?

C++: bool 值的二进制表示是否有任何保证?

ruby-on-rails - 使用 Oj.dump 序列化时将符号转换为字符串