【问题标题】:Confusion about finding information in a hash table when there is a collision发生冲突时在哈希表中查找信息的困惑
【发布时间】:2015-09-15 23:18:10
【问题描述】:

我了解,如果哈希表中存在冲突,您可以通过多种方式存储数据。您可以使用一些素数线性遍历数组,直到找到一个空闲点。您还可以将整个表重新散列成一个更大的数组。我敢肯定还有其他方法。我不明白的是,如果首先发生冲突,您如何知道哪一行数据是您要查找的数据?我会不允许使用重复的键吗?

【问题讨论】:

    标签: hashtable collision concept


    【解决方案1】:

    哈希和键之间有很大的不同(尽管它们有时可能相同)。

    键可能是一个非常大的数字,一个由许多字段组成的复杂对象或任何东西。
    您将散列函数应用于此键以获取散列。

    因此,即使您禁止重复键,您仍然可能有重复的哈希。

    您通常不能直接将您的密钥用作哈希,因为数组索引是从 0 开始的连续整数,因此如果您的密钥太大、负数或不是整数,它将不起作用,您必须应用某种哈希函数。


    如果您想存储 1 到 10000 之间的数字,您可以让键为数字本身,并且可以将哈希值设为数字除以 1000 的余数(因此您将有一个大小为 1000 的数组用于哈希表)。

    插入 1001 会将其放在索引 1。如果您尝试插入 2001,它也会尝试转到索引 1,并且会发生冲突。

    * 键可以是您要存储的整个值,也可以只是它的标识符。

    【讨论】:

    • 所以我不允许重复键,使用键散列到表中的某个位置,存储唯一键,如果发生冲突我会解决它,如果我使用键来检索信息当我在桌子上找到我散列到的位置时,我会检查键是否相同以确定我是否有正确的信息?
    • @CrinkleyCrewms 是的,这听起来很对。请注意,如果您正在寻找一个元素,您需要执行类似于您的冲突解决步骤的操作,以找到与该哈希对应的所有可能元素 - 例如,对于 linear probing,您需要从与哈希相对应的索引并遍历数组,直到找到一个空点,因为该点之后的任何内容都不能具有相同的哈希(删除元素很重要),并将每个键与您要查找的键进行比较如果它存在于表中。
    猜你喜欢
    • 2012-05-24
    • 2015-06-29
    • 1970-01-01
    • 2011-01-21
    • 2017-04-26
    • 1970-01-01
    • 2017-06-01
    • 2017-01-30
    • 1970-01-01
    相关资源
    最近更新 更多