Data structures 为了平均节省O(1)的时间复杂度,我必须散列整个密钥吗?

Data structures 为了平均节省O(1)的时间复杂度,我必须散列整个密钥吗?,data-structures,hash,time-complexity,hashtable,Data Structures,Hash,Time Complexity,Hashtable,假设我有一个散列表和一个均匀分布的散列函数,它使用单独的链表链接 表中保存的键是a、b对无限数,我根据hasha将它们插入表中,我忽略了b 查找、插入和删除操作平均仍在O1时间内吗?或者我必须散列整个密钥,包括b?不,这不能保证您期望O1查找。例如,假设您散列0,0,0,1,0,2,0,3,…,0,n-1。由于忽略了第二个组件,因此所有n个值都将散列到表中的同一位置,因此无论散列函数如何散列第一个组件0,最终都会在一个散列表中的同一位置包含n个元素,在最坏的情况下,会使查找退化为花费时间Θn 一

假设我有一个散列表和一个均匀分布的散列函数,它使用单独的链表链接

表中保存的键是a、b对无限数,我根据hasha将它们插入表中,我忽略了b


查找、插入和删除操作平均仍在O1时间内吗?或者我必须散列整个密钥,包括b?

不,这不能保证您期望O1查找。例如,假设您散列0,0,0,1,0,2,0,3,…,0,n-1。由于忽略了第二个组件,因此所有n个值都将散列到表中的同一位置,因此无论散列函数如何散列第一个组件0,最终都会在一个散列表中的同一位置包含n个元素,在最坏的情况下,会使查找退化为花费时间Θn


一般来说,使用哈希表时需要对整个键进行哈希。否则,通过保持密钥的一部分不变并更改其他部分,很容易导致哈希冲突。

否,这不能保证您期望O1查找。例如,假设您散列0,0,0,1,0,2,0,3,…,0,n-1。由于忽略了第二个组件,因此所有n个值都将散列到表中的同一位置,因此无论散列函数如何散列第一个组件0,最终都会在一个散列表中的同一位置包含n个元素,在最坏的情况下,会使查找退化为花费时间Θn


一般来说,使用哈希表时需要对整个键进行哈希。否则,通过保持密钥的一部分不变并更改其他部分,很容易导致哈希冲突。

如果使用a、b作为密钥,但仅基于哈希a进行存储,则每当有多个具有相同a值的对象时,都会发生冲突。例如,1、2和1、3都将散列到同一个bucket,因此您必须遍历链表。对性能的实际影响取决于您的数据集,但平均而言,您不会仍然具有O1性能。

如果您使用a、b作为键,但仅基于hasha进行存储,则当您有多个具有相同值a的对象时,您将发生冲突。例如,1、2和1、3都将散列到同一个bucket,因此您必须遍历链表。对性能的实际影响取决于您的数据集,但平均而言,您不会仍然拥有O1性能。

您是否事先了解a和b?如果否,则需要将两者都散列。如果你知道它们都是相当随机的,那么单独基于a的散列就足够了,尽管散列2个整数的计算量不应该比单个整数更大。

你事先知道a和b吗?如果否,则需要将两者都散列。如果您知道它们都是相当随机的,那么基于a的散列应该足够好了,尽管散列2个整数不应该比单个整数更需要计算。

无论如何,这是最坏的情况。一般情况如何?它是如何毁掉它的?@XtremeJoe每当你听到“平均”时,你都应该思考“平均”是什么?传统的哈希表分析假设数据是非随机选择的,并且哈希函数提供了随机性,一个好的哈希表实现应该提供良好的保证,而不管提供什么数据。为了按照你的建议提供一个平均案例分析,你需要提供一个关于可能输入的概率分布的数学上严格的描述。但是在我所介绍的案例中,当我对b一无所知时,是否有可能实现O1平均input@XtremeJoe在不知道输入分布的情况下,你不能说平均情况是O1,因为你不能说你的平均值是多少。@XtremeJoe只对a而不是b进行散列运算,实际上是将碰撞次数增加了b的一个因子,因此碰撞不再依赖于常数,但是,相反,b,因此它不可能是恒定的,不管怎样,这都是最坏的情况。一般情况如何?它是如何毁掉它的?@XtremeJoe每当你听到“平均”时,你都应该思考“平均”是什么?传统的哈希表分析假设数据是非随机选择的,并且哈希函数提供了随机性,一个好的哈希表实现应该提供良好的保证,而不管提供什么数据。为了按照你的建议提供一个平均案例分析,你需要提供一个关于可能输入的概率分布的数学上严格的描述。但是在我所介绍的案例中,当我对b一无所知时,是否有可能实现O1平均input@XtremeJoe在不知道输入分布的情况下,你不能说平均值是O1,因为你不能说你平均值是多少。@Xtre
meJoe如果只对a而不是b进行散列,那么实际上是将碰撞的数量增加了b的一个因子,因此碰撞不再依赖于常数,而是b,因此它不能是常数查找知道它们都是相当随机的是一个重要的见解,虽然关键的问题是a值的取值范围是否也明显超过了被散列的对数——如果是这样,那么冲突就不太可能了。这与假设a在0到10之间,而b在0到10亿之间形成对比:值可能是非常随机的,但是如果你对一百万对进行散列,你会遇到冲突。知道它们都是相当随机的是一个重要的见解,虽然关键的问题是a值的取值范围是否也明显超过了被散列的对数——如果是这样,那么冲突就不太可能了。这与假设a在0到10之间,而b在0到10亿之间形成了对比:这些值可能是非常随机的,但如果你对一百万对进行散列运算,就会产生冲突。@TonyD它们可能是anything@TonyD它们可能是任何东西