哈希表如何解决存储桶多义和探测



我正在阅读 C 语言中的数据结构和算法与软件原理,试图了解数据结构的一些内部结构,有两件事确实困扰着我:

(1) 如果哈希表都具有相同的哈希值,则如何处理确定存储桶中的哪个项目是您正在查找的项目?

例如

  1. 获取键、值
  2. 在键上使用哈希算法来查找索引以尝试将值放入
  3. 如果插槽已占用,但没有存储桶(单个条目),请创建一个存储桶并将当前项目放入存储桶中,然后将当前值放入其中。
  4. 现在我有一个包含一堆值的存储桶和一个"丢失和找到的问题",您无法分辨哪个值属于哪个键,因为所有键都映射到同一个哈希,并且存储桶中的项目没有键可以按键搜索存储桶。

如果存储桶保存每个条目的键和值,这将起作用,但我很困惑,因为我找不到一个网站来确认哈希表保存键及其条目的值。

(2) 哈希表如何判断索引处的值是否是键的正确值,或者探测是否发现冲突并将其放在其他地方。

例如。

  1. 获取键、值
  2. 用于查找索引的哈希键(0)
  3. 索引采取,使用执行线性搜索的朴素探测算法,直到找到插槽(插槽 1 为空)。
  4. 现在我搜索我的密钥并找到索引 0。哈希如何知道索引 0 不是此键的正确项,而是已探测到插槽 1 中?
同样,如果表保存了条目

的键和值,这对我来说是有意义的,但我不确定哈希是否将键与条目的值一起保存,或者有另一种方法来确保哈希索引或桶索引中的项目是正确的项目,或者我是否误解了它。

澄清这个问题:哈希表是将键与值一起保存以消除存储桶和探测序列的歧义,还是使用其他东西来避免哈希的歧义?

很抱歉这个问题很粗略,但我不得不问。

提前谢谢。

哈希表保存条目。条目由键和值组成。

如果哈希表都具有相同的哈希值,则如何处理确定存储桶中的哪个项目是您正在查找的项目?

因为查询是通过传递密钥来完成的。

哈希的目的是减少查找索引的时间。对它们进行哈希处理以找到正确的存储桶。然后,当项目从总 N 减少到非常小的 n 时,您甚至可以执行线性搜索,以从具有相同哈希的所有键中找到正确的项目。

哈希表如何判断索引处的值是否是键的正确值,或者探测是否发现冲突并将其放在其他位置。

同样,这是因为哈希表会保存条目而不仅仅是值。如果发生冲突时,哈希表发现在此存储桶中找到的键不是查询的键,则哈希表知道冲突发生得更早,并且该键可能位于下一个存储桶中。请注意,在这种情况下,存储桶存储单个条目,这与第一个答案的情况不同,在第一个答案中,存储桶可能会存储 LinkedList 或条目树。

相关内容

  • 没有找到相关文章

最新更新