哈希表,非空槽已包含密钥,奇数数据值被新数据值替换

时间:2016-09-28 01:00:14

标签: python data-structures hash hashmap hashtable

我在python中学习哈希表,这里有一个问题。

当哈希函数开始时,我应该在列表中生成一个空的“map”哈希。但是为什么“非空槽已经包含密钥,奇数数据值被新数据值替换”,是不是应该找到下一个空槽并存储在那里,为什么要替换?

https://interactivepython.org/runestone/static/pythonds/SortSearch/Hashing.html

  

hashfunction实现简单的余数方法。冲突解决技术是线性探测,具有“加1”重新散列功能。 put函数(参见清单3)假定最终将有一个空槽,除非self.slots中已存在该键。它计算原始哈希值,如果该槽不为空,则迭代rehash函数,直到出现空槽。如果非空槽已包含密钥,则旧数据值将替换为新数据值。处理没有空位的情况是一项练习。

2 个答案:

答案 0 :(得分:1)

首先,我们需要区分hash valuekeyvalue

Hash value是哈希表中槽的ID,它由哈希函数生成。

Key是您要映射的数据。

value是您要映射到的数据。

因此,Mapping意味着您有一个引用某个值的唯一键,并且这些值不一定是不同的。

当您尝试使用keyvalue添加新广告位时,put功能会执行以下操作:

它散列获取列表中插槽ID的密钥,如果具有此ID的插槽为空,则插入成功完成,否则有两条路径:

1-找到的插槽不是空的,但是它的键不等于新键,这意味着2个不同的键具有相同的hash value,因此这被认为是碰撞,并且它由您发送的链接中提到的方式。

2-找到的广告位不是空的,但其密钥等于新密钥,这意味着您正在更新此广告位,因此它将用新广告替换旧value

实施例: 如果哈希包含这些插槽:

"foo": 5
"bar": 7

然后你试图插入hash["foo"] = 10,这将散列密钥(foo)并在散列表(列表)中找到它的插槽ID,并且它还会发现存在一个插槽键foo,因此它将替换值,哈希表将变为如下:

"foo": 10
"bar": 7

但是,如果您尝试插入hash["abc"] = 7,则会对密钥abc进行哈希处理,如果hash value映射到非空插槽且密钥不同于{{1}在这种情况下,put函数会认为这是一个碰撞,并试图找到另一个空槽。

答案 1 :(得分:0)

将哈希表视为python字典。 假设我们创建了字典

dictionary = {
    "a":10,
    "b":20,
}

这里“ a”是键,而它的值是10。因此,如果我们更新

dictionary['a'] = 15

而不是将其放入新的插槽中,而是更新该位置“ a”。

python字典是哈希表的实现。所以我举了这个例子。 因此,对于相同的密钥(如果已经存在),我们将对其进行更新。

要了解有关python词典如何实现的更多信息,请查看此Print on Android Studio