Data structures 哈希表中负载因子和时间复杂度之间的关系?

Data structures 哈希表中负载因子和时间复杂度之间的关系?,data-structures,big-o,hashtable,Data Structures,Big O,Hashtable,关于哈希表,我们使用负载因子来度量哈希表的性能。但是我需要理解负载因子和哈希表的时间复杂度之间的关系。根据我的理解,这种关系是成正比的。也就是说,我们只取O(1)来计算散列函数以找到索引。如果负载因子较低,这意味着表中没有足够的元素,因此在其正确索引处找到键值对的机会较高,因此搜索操作最小,复杂性仍然是一个常数。另一方面,当负载因子较高时,将键值对找到其精确位置的机会较低,因此我们需要执行一些搜索操作,因此复杂性将上升到O(n)。插入操作也是如此。这是对的吗?这是一个很好的问题,答案是“这取决于

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

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

其中,要存储项目,您将其散列到一个桶中,然后将项目存储在该桶中。如果多个项目在同一个bucket中结束,您只需将该bucket中结束的所有项目的列表存储在bucket本身中。(这是散列表最常用的教学版本。)在这种散列表中,假定一个良好的散列函数,bucket中的预期元素数为O(α),其中负载因子用α表示。这是很直观的,因为如果你把你的物品随机分配到各个桶中,你会发现每个桶中都有大约α个物品。在这种情况下,随着负载系数的增加,您平均需要做越来越多的工作才能找到一个元素,因为每个bucket中会有更多的元素。不过,查找的运行时不一定达到O(n),因为即使没有足够的存储桶,您仍然可以将项目分布在各个存储桶中

A通过具有插槽阵列来工作。每当散列一个元素时,都会转到它的插槽,然后在表中向前走,直到找到该元素或找到一个空闲插槽。在这种情况下,当负载系数接近1时,将填充越来越多的表槽,实际上,您会发现在最坏的情况下搜索确实需要时间O(n),因为只有几个空闲槽来停止搜索。(Don Knuth的一个漂亮而著名的分析表明,假设哈希函数的行为类似于随机选择的函数,查找或插入哈希表失败的代价将花费时间O(1/(1-α)2)。绘制此函数并查看随着α越来越接近,运行时如何增长是很有趣的。)


希望这有帮助

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

其中,要存储项目,您将其散列到一个桶中,然后将项目存储在该桶中。如果多个项目在同一个bucket中结束,您只需将该bucket中结束的所有项目的列表存储在bucket本身中。(这是散列表最常用的教学版本。)在这种散列表中,假定一个良好的散列函数,bucket中的预期元素数为O(α),其中负载因子用α表示。这是很直观的,因为如果你把你的物品随机分配到各个桶中,你会发现每个桶中都有大约α个物品。在这种情况下,随着负载系数的增加,您平均需要做越来越多的工作才能找到一个元素,因为每个bucket中会有更多的元素。不过,查找的运行时不一定达到O(n),因为即使没有足够的存储桶,您仍然可以将项目分布在各个存储桶中

A通过具有插槽阵列来工作。每当散列一个元素时,都会转到它的插槽,然后在表中向前走,直到找到该元素或找到一个空闲插槽。在这种情况下,当负载系数接近1时,将填充越来越多的表槽,实际上,您会发现在最坏的情况下搜索确实需要时间O(n),因为只有几个空闲槽来停止搜索。(Don Knuth的一个漂亮而著名的分析表明,假设哈希函数的行为类似于随机选择的函数,查找或插入哈希表失败的代价将花费时间O(1/(1-α)2)。绘制此函数并查看随着α越来越接近,运行时如何增长是很有趣的。)

希望这有帮助