【发布时间】:2021-10-05 03:15:47
【问题描述】:
我有一个作业(CS50 - 拼写器),我必须在其中实现一个带有链表的哈希表。
然而,对于额外的挑战,我们也被要求实现散列算法,我对散列表和散列完全陌生,并且对密码学了解 0;在阅读了一段时间后,我找到了djb2 hash,我认为它可以很好地与我的数据集(一个包含 143k 小写单词的字典(有些带有'))配合使用,我将不得不使用它来检查其他数据集.
分析数据集后,我最初的想法是将其拆分为前三个字母,然后有一个(我的数据集元素上共有 3 个字母变体)包含 3 个字符的数组,其中包含每个单词的二进制三个链表的头部. (我不能这样做,因为练习已经包含了一个 sllist 的结构和一个散列函数的原型)
这当然是在学习哈希表被称为因为它们使用哈希之前。我完全被蒙住了眼睛。
我看到人们经常使用 mod % 将其映射到他们的列表,但这让我感到困惑,因为您如何保证不会有更多的冲突,以及将它们最小化的最佳数组大小是多少?
如何将 djb2 函数的结果映射到哈希表?我的情况有更好的方法吗?
【问题讨论】:
-
有效散列函数唯一需要的是它为所有输入和
X==Y => h(X)==h(Y)生成一个数字。即使是所有冲突(例如h(X)=0),您的代码也应该正确运行(尽管速度很慢)。作为第二步,一个好的散列函数应该尽量减少冲突。如果您有一个特定的数据集,您可以测量不同哈希函数和存储桶数量发生了多少次冲突。 -
但是是的,如果你有 N 个桶和一个返回任意整数的哈希函数,
%N是常用的方法。 “你怎么能保证……?”我们不可以。没有哈希函数可以完美地处理所有可能的数据。测量。
标签: c hash hashmap hashtable cs50