我在python中学习哈希表,这里有一个问题。
当哈希函数开始时,我应该在列表中生成一个空的“map”哈希。但是为什么“非空槽已经包含密钥,奇数数据值被新数据值替换”,是不是应该找到下一个空槽并存储在那里,为什么要替换?
https://interactivepython.org/runestone/static/pythonds/SortSearch/Hashing.html
hashfunction实现简单的余数方法。冲突解决技术是线性探测,具有“加1”重新散列功能。 put函数(参见清单3)假定最终将有一个空槽,除非self.slots中已存在该键。它计算原始哈希值,如果该槽不为空,则迭代rehash函数,直到出现空槽。如果非空槽已包含密钥,则旧数据值将替换为新数据值。处理没有空位的情况是一项练习。
答案 0 :(得分:1)
首先,我们需要区分hash value
,key
和value
。
Hash value
是哈希表中槽的ID,它由哈希函数生成。
Key
是您要映射的数据。
value
是您要映射到的数据。
因此,Mapping意味着您有一个引用某个值的唯一键,并且这些值不一定是不同的。
当您尝试使用key
和value
添加新广告位时,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