【问题标题】:Worst Case Hash Function最坏情况哈希函数
【发布时间】:2017-10-01 03:38:11
【问题描述】:

在课堂上提到了“最坏情况的哈希函数,h(x) = 1”

(我的教练出城了几个星期;我显然会问他是否可以)。

我的问题:“最坏情况哈希函数”到底是什么意思?是每个元素都被赋予相同的值 1(或 1 % tableSize),还是 elementOne 被赋予哈希值 1、elementTwo 2、elementThree 3 等等?

可能是一个菜鸟问题,但我想我还是会问。

【问题讨论】:

标签: java hash hashtable


【解决方案1】:

最差的哈希函数是返回一个常数值的函数。 在基于散列的集合中,对象根据其散列值进行存储。
因此,如果对于任何对象,您得到相同的哈希值,则意味着所有对象最终都存储在同一个地方。
因此,集合需要始终迭代并且始终与此哈希值关联的存储桶/槽相同以检索对象。

你失去了使用哈希函数的兴趣。

【讨论】:

    【解决方案2】:

    无论 x 是什么,您定义的哈希函数h(x)=1 都会生成相同的值。一个理想的散列函数会为 x 的每个值生成一个唯一的键。常量散列函数最终将为 x 的每个值生成相同的散列值。因此,如果您以哈希表为例,它将是一个带有巨大链表的单元素表

    【讨论】:

      【解决方案3】:

      在最坏的情况下,每个对象都有相同的哈希值(例如 1)。这与 equals 是一致的,在某种程度上,两个相等的对象将始终具有相同的哈希,所以它会起作用;但它不会给您带来良好哈希所带来的任何查找好处,因为每次您尝试查找对象时,您都必须查看集合中的每个对象(因为它们都具有相同的哈希)。

      【讨论】:

        【解决方案4】:

        哈希函数的质量取决于与多个不同对象发生冲突的概率。完美的散列函数将所有对象映射到完全没有冲突的数字,保证项目在桶之间的均匀分布。

        相比之下,最坏的哈希函数通过为所有对象返回相同的值来保证冲突,无论您传递什么对象。这将基于散列的查找转换为冲突解决查找,从一开始就消除了使用基于散列的容器的任何优势。

        【讨论】:

          【解决方案5】:

          最差的哈希函数是返回一个常数值的函数。 IE。该类型的所有对象都具有相同的哈希值,从而导致大量冲突。

          虽然通常无法完全避免冲突,但尽量减少冲突对于使用哈希的任何操作的性能都很重要。

          应该注意,虽然它是一个糟糕的哈希函数,但它在技术上是正确的,因为哈希函数的要求只是为被认为相等的对象返回相同的值(这很简单,因为它返回相同的一切的价值)。

          【讨论】:

            猜你喜欢
            • 2021-12-19
            • 2012-06-20
            • 1970-01-01
            • 1970-01-01
            • 2013-12-25
            • 2021-08-10
            • 2021-07-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多