class HashTable:
def __init__(self):
self.size = 11
self.slots = [None] * self.size
self.data = [None] * self.size
def put(self,key,data):
hashvalue = self.hashfunction(key,len(self.slots))
if self.slots[hashvalue] == None:
self.slots[hashvalue] = key
self.data[hashvalue] = data
else:
if self.slots[hashvalue] == key:
self.data[hashvalue] = data #replace
else:
nextslot = self.rehash(hashvalue,len(self.slots))
while self.slots[nextslot] != None and \
self.slots[nextslot] != key:
nextslot = self.rehash(nextslot,len(self.slots))
if self.slots[nextslot] == None:
self.slots[nextslot]=key
self.data[nextslot]=data
else:
self.data[nextslot] = data #replace
我一直在哈希表上阅读这段数据结构,需要在下面的部分进行解释。
如果密钥已存在,为什么要替换数据?
if self.slots[hashvalue] == key:
self.data[hashvalue] = data #replace
另外,有人可以解释这部分吗? Nextslot将是空槽。 我们只是重新进行,如果它不是空的并且密钥不存在,那么重新进行重新扫描?
nextslot = self.rehash(hashvalue,len(self.slots))
while self.slots[nextslot] != None and \
self.slots[nextslot] != key:
nextslot = self.rehash(nextslot,len(self.slots))
答案 0 :(得分:1)
如果密钥已存在,为什么要替换数据?
这就是哈希表通常表现的方式,因为人们通常希望它们以这种方式运行。设置已存在的键“覆盖”前一个值。
另外,有人可以解释这部分吗? Nextslot将是空槽。
Nextslot不保证是空的,它只是我们要检查的下一个插槽。可以这样想:只要我们检查的插槽是由不同的键获取的,我们就需要继续尝试下一个插槽(通过重新挖掘来挑选)。如果我们找到一个空插槽,那就好了,使用它。如果我们发现插槽已被占用,但它是相同的密钥,则覆盖它。因此,循环一直在重新发送,直到找到一个空的插槽或一个具有相同密钥的插槽(我们可以覆盖它)。