哈希表的解释

时间:2017-03-09 06:04:34

标签: python database

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))

1 个答案:

答案 0 :(得分:1)

  

如果密钥已存在,为什么要替换数据?

这就是哈希表通常表现的方式,因为人们通常希望它们以这种方式运行。设置已存在的键“覆盖”前一个值。

  

另外,有人可以解释这部分吗? Nextslot将是空槽。

Nextslot不保证是空的,它只是我们要检查的下一个插槽。可以这样想:只要我们检查的插槽是由不同的键获取的,我们就需要继续尝试下一个插槽(通过重新挖掘来挑选)。如果我们找到一个空插槽,那就好了,使用它。如果我们发现插槽已被占用,但它是相同的密钥,则覆盖它。因此,循环一直在重新发送,直到找到一个空的插槽或一个具有相同密钥的插槽(我们可以覆盖它)。