【发布时间】:2024-01-23 17:51:01
【问题描述】:
我正在阅读 C 语言中的数据结构、算法和软件原理,试图深入了解数据结构的一些内部结构,有两件事让我非常困扰:
(1) 哈希表如何处理决定桶中的哪一项是您正在查找的项,如果它们都具有相同的哈希?
例如
- 获取键、值
- 在key上使用Hash算法找到索引尝试把值放入
- 如果slot被占用了,但是没有bucket(单入口),创建一个bucket,把当前item扔到bucket里面,然后把当前值扔进去。
- 现在我有一个包含一堆值的存储桶和一个“失物招领问题”,您无法分辨哪个值属于哪个键,因为所有键都映射到相同的散列并且存储桶中的项目没有key 键来搜索桶。
如果存储桶保存每个条目的键和值,这将起作用,但我很困惑,因为我找不到确认哈希表保存键及其条目的值的站点。
(2) 哈希表如何判断索引处的值是否是键的正确值,或者探测是否发现冲突并将其放在其他位置。
例如。
- 获取键、值
- 哈希键查找索引(0)
- 获取索引,使用简单的探测算法执行线性搜索,直到找到槽(槽 1 为空)。
- 现在我搜索我的键并找到索引 0。哈希如何知道索引 0 不是该键的正确项,但它已被探测到插槽 1?
同样,如果表保存了条目的键和值,这对我来说是有意义的,但我不确定哈希是否将键与条目的值一起保存,或者有另一种方法来确保项目位于哈希索引或桶索引是正确的项目,或者我误解了它。
为了澄清这个问题:哈希表是保存键和值以消除桶和探测序列的歧义,还是使用其他东西来避免哈希的歧义?
很抱歉这个粗略的问题,但我不得不问。
提前谢谢。
【问题讨论】:
-
“bucket中的item没有key可以通过key搜索bucket”——为什么你的hash表没有存储key?
-
@user2357112 我不确定是否有必要。我需要确认,我怀疑他们是否这样做。
-
@Dmitry:取决于用例。通常,存储条目。否则,冲突将需要返回给用户而不保存或覆盖之前的条目。
标签: algorithm hash disambiguation