Hash Table中CRUD操作的碰撞和复杂度之间有什么联系?
What is connection between collision and complexity of CRUD operations in Hash Table?
我读过 Aditya Bhargava 的书 "Grokking Algorithms: An illustrated guide for programmers and other curious people" 如果我们避免碰撞,可以避免最坏情况下的复杂性。
据我了解,冲突 - 是哈希函数 returns 在不同键的情况下具有相同的值。
它如何影响 CRUD 操作中的 Hash Table 复杂性?
谢谢
在散列 table 实现中,具有良好的散列函数,并且负载因子(条目数除以总容量)为 70% 或更少,冲突次数相当低,散列查找是 O(1).
如果你的散列函数很差或者你的负载因子开始增加,那么冲突的数量就会增加。如果你的散列函数很差,那么一些散列码会有很多冲突,而另一些则很少。您的平均查找率可能仍然接近 O(1),但某些查找将花费更长的时间,因为冲突解决需要很长时间。例如,如果哈希码值 11792
有 10 个键映射到它,那么您可能必须检查 10 个不同的键才能 return 匹配键。
如果散列 table 过载,每个散列码都有大约相同数量的键映射到它,那么您的平均查找率将为 O(k),其中 k 是平均数每个哈希码的冲突。
i read than worst case complexity can be avoided, if we avoid collision.
这是正确的 - 当存储在散列 table 中的元素的所有散列值映射到同一存储桶并在同一存储桶中发生冲突时,会发生最坏情况的复杂性。
As i understand, collision - is when hash function returns same value in case of different keys.
最终使用散列函数将值映射到散列中的桶 table。也就是说,通常将整体概念哈希函数实现为产生巨大数值范围内的值的哈希函数(例如 0 和 2^32-1 之间的 32 位哈希,或 0 之间的 64 位哈希和 2^64-1),然后使用 %
运算符根据当前散列 table 桶计数将该值映射到特定桶。因此,假设您的散列 table 有 137 个桶,您可能会生成 139 的哈希值,然后说 139 % 137 == 2 并使用第三个(桶数组中的 [2]
)。无论 table 的大小如何,这种两步法都可以轻松使用相同的哈希函数(生成 32 位或 64 位哈希)。如果您改为创建一个直接生成 0 到 136 之间的数字的哈希函数,那么对于稍微小一点或大一点的桶计数,它根本无法正常工作。
回到你的问题...
As i understand, collision - is when hash function returns same value in case of different keys.
...对于我上面描述的“32 位或 64 位哈希函数后跟 %”方法,有两种不同类型的冲突:32 位或 64 位哈希函数本身可能产生完全相同的 32 位或 64 位值用于被散列的不同值,或者它们可能产生不同的值 - 在 % 操作之后 - 永远不会映射到散列中的同一个桶 table.
How it is affects Hash Table complexity in CRUD operations?
哈希 tables 的工作原理是将值分布到桶中。当许多值在同一个桶中发生冲突时,必须采用辅助搜索机制来处理所有冲突值(如果您使用开放寻址尝试散列中的一系列桶,则可能还有其他混合值 table,而不是将碰撞元素的链表或二叉树挂在每个桶上)。所以基本上,冲突率越差,您获得的理想化 O(1) 复杂度就越远,尽管如果您有一个 特别是 坏散列,您实际上只会开始显着影响 big-O 复杂度函数,根据存储的值集。
我读过 Aditya Bhargava 的书 "Grokking Algorithms: An illustrated guide for programmers and other curious people" 如果我们避免碰撞,可以避免最坏情况下的复杂性。 据我了解,冲突 - 是哈希函数 returns 在不同键的情况下具有相同的值。 它如何影响 CRUD 操作中的 Hash Table 复杂性? 谢谢
在散列 table 实现中,具有良好的散列函数,并且负载因子(条目数除以总容量)为 70% 或更少,冲突次数相当低,散列查找是 O(1).
如果你的散列函数很差或者你的负载因子开始增加,那么冲突的数量就会增加。如果你的散列函数很差,那么一些散列码会有很多冲突,而另一些则很少。您的平均查找率可能仍然接近 O(1),但某些查找将花费更长的时间,因为冲突解决需要很长时间。例如,如果哈希码值 11792
有 10 个键映射到它,那么您可能必须检查 10 个不同的键才能 return 匹配键。
如果散列 table 过载,每个散列码都有大约相同数量的键映射到它,那么您的平均查找率将为 O(k),其中 k 是平均数每个哈希码的冲突。
i read than worst case complexity can be avoided, if we avoid collision.
这是正确的 - 当存储在散列 table 中的元素的所有散列值映射到同一存储桶并在同一存储桶中发生冲突时,会发生最坏情况的复杂性。
As i understand, collision - is when hash function returns same value in case of different keys.
最终使用散列函数将值映射到散列中的桶 table。也就是说,通常将整体概念哈希函数实现为产生巨大数值范围内的值的哈希函数(例如 0 和 2^32-1 之间的 32 位哈希,或 0 之间的 64 位哈希和 2^64-1),然后使用 %
运算符根据当前散列 table 桶计数将该值映射到特定桶。因此,假设您的散列 table 有 137 个桶,您可能会生成 139 的哈希值,然后说 139 % 137 == 2 并使用第三个(桶数组中的 [2]
)。无论 table 的大小如何,这种两步法都可以轻松使用相同的哈希函数(生成 32 位或 64 位哈希)。如果您改为创建一个直接生成 0 到 136 之间的数字的哈希函数,那么对于稍微小一点或大一点的桶计数,它根本无法正常工作。
回到你的问题...
As i understand, collision - is when hash function returns same value in case of different keys.
...对于我上面描述的“32 位或 64 位哈希函数后跟 %”方法,有两种不同类型的冲突:32 位或 64 位哈希函数本身可能产生完全相同的 32 位或 64 位值用于被散列的不同值,或者它们可能产生不同的值 - 在 % 操作之后 - 永远不会映射到散列中的同一个桶 table.
How it is affects Hash Table complexity in CRUD operations?
哈希 tables 的工作原理是将值分布到桶中。当许多值在同一个桶中发生冲突时,必须采用辅助搜索机制来处理所有冲突值(如果您使用开放寻址尝试散列中的一系列桶,则可能还有其他混合值 table,而不是将碰撞元素的链表或二叉树挂在每个桶上)。所以基本上,冲突率越差,您获得的理想化 O(1) 复杂度就越远,尽管如果您有一个 特别是 坏散列,您实际上只会开始显着影响 big-O 复杂度函数,根据存储的值集。