【问题标题】:Relation between the load factor and time complexity in hash tables?哈希表中的负载因子和时间复杂度之间的关系?
【发布时间】:2020-08-13 02:41:51
【问题描述】:

关于哈希表,我们使用负载因子来衡量哈希表的性能。但我需要了解负载因子和哈希表时间复杂度之间的关系。根据我的理解,这种关系是成正比的。这意味着,我们只需要 O(1) 来计算散列函数来找到索引。如果负载因子低,这意味着表中没有足够的元素,因此在其正确索引处找到键值对的机会很高,因此搜索操作最小,但复杂度仍然是一个常数。另一方面,当负载因子很高时,找到键值对到它们确切位置的机会很低,因此我们需要做一些搜索操作,因此复杂度会上升到 O(n) 。插入操作也是如此。是这样吗?

【问题讨论】:

    标签: data-structures big-o hashtable


    【解决方案1】:

    这是一个很好的问题,答案是“这取决于您使用的是哪种哈希表。”

    chained hash table,要存储一个项目,您将其散列到一个存储桶中,然后将该项目存储在该存储桶中。如果多个项目最终位于同一个存储桶中,您只需将最终位于该存储桶中的所有项目的列表存储在存储桶本身中。 (这是最常用的哈希表版本。)在这种哈希表中,假设一个好的哈希函数,桶中的预期元素数量为 O(α),其中负载因子表示为α。这很直观,因为如果您将项目随机分布在存储桶中,您会预计其中大约 α 个最终会出现在每个存储桶中。在这种情况下,随着负载因子的增加,您平均需要做越来越多的工作才能找到一个元素,因为每个存储桶中都会有更多的元素。但是,查找的运行时间不一定会达到 O(n),因为即使没有足够多的存储桶可供使用,您仍然会将项目分布在存储桶中。

    linear probing hash table 的工作原理是拥有一组插槽。每当你散列一个元素时,你都会去它的槽,然后在表中向前走,直到你找到元素或找到一个空闲槽。在这种情况下,随着负载因子接近 1,将填充越来越多的表槽,实际上您会发现自己处于在最坏情况下搜索确实需要时间 O(n) 的情况,因为只有几个免费的插槽来停止您的搜索。 (Don Knuth 有一个漂亮而著名的分析表明,假设散列函数的行为类似于随机选择的函数,不成功的查找或插入散列表的成本将花费时间 O(1 / (1 - α)2)。绘制这个函数并观察运行时如何随着 α 越来越接近 1 而增长是很有趣的。)

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-18
      • 2011-04-26
      • 1970-01-01
      • 2020-11-19
      • 2013-03-14
      • 1970-01-01
      • 2019-12-24
      • 1970-01-01
      相关资源
      最近更新 更多