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

时间:2016-07-15 23:52:59

标签: algorithm hash disambiguation

我正在阅读数据结构和算法& C中的软件原则试图围绕数据结构的一些内部包围,有两件事真的困扰我:

(1)哈希表如何处理决定桶中哪个项目是你正在查找的项目(如果它们都具有相同的哈希值)?

e.g。

  1. 获取密钥,值
  2. 在密钥上使用哈希算法来查找索引以尝试将值放入
  3. 如果使用了插槽,但没有存储桶(单个条目),请创建一个存储桶并将当前项目抛出到存储桶中,然后将当前值输入其中。
  4. 现在我有一个带有一堆价值观和一个"丢失并找到问题的存储桶"在哪里你无法分辨哪个值属于哪个键,因为所有键都映射到相同的哈希值,而桶中的项目没有按键搜索桶的键。
  5. 如果存储桶保存密钥以及每个条目的值,这将有效,但我很困惑,因为我找不到确认哈希表保存密钥及其条目值的网站。

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

    例如

    1. 获取密钥,值
    2. 查找索引(0)
    3. 的哈希键
    4. 索引,使用天真探针算法执行线性搜索,直到找到插槽(插槽1为空)。
    5. 现在我搜索我的密钥并找到索引0.哈希怎么知道索引0不是这个密钥的正确项目,但它已被探测到插槽1?
    6. 同样,如果表保存了一个键以及该条目的值,这对我来说是有意义的,但我不确定哈希是否保存键以及条目的值,或者有另一种方法来确保项目在哈希索引或桶索引是正确的项目,或者如果我误解它。

      澄清问题:哈希表是否保存密钥以及值以消除桶和探测序列的歧义,还是使用其他东西来避免哈希歧义?

      对于粗略提出的问题,我很抱歉。

      提前致谢。

1 个答案:

答案 0 :(得分:1)

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

  

哈希表如何处理决定桶中哪个项目是您正在查找的项目(如果它们都具有相同的哈希值)?

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

散列的目的是减少查找索引的时间。他们的关键是哈希找到合适的桶。然后,当项目从总N减少到非常小的n时,您甚至可以执行线性搜索,从具有相同哈希的所有键中找到正确的项目。

  

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

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