【问题标题】:Hashtable explanation哈希表解释
【发布时间】:2017-03-09 06:04:33
【问题描述】:
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

我一直在阅读哈希表上的这一点数据结构,下面需要对此部分进行解释。

如果key已经存在,为什么要替换数据?

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

【问题讨论】:

  • 请描述预期行为和观察到的行为之间的差异。最好给出示例输入和输出。

标签: python database


【解决方案1】:

如果key已经存在,为什么要替换数据?

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

另外,有人能解释一下这部分吗? Nextslot 将是空槽。

下一个插槽不能保证为空,它只是我们要检查的下一个插槽。可以这样想:只要我们检查的插槽被 不同的 键占用,我们就需要继续尝试下一个插槽(通过重新散列选择)。如果我们找到一个空槽,很好,使用它。如果我们发现插槽被占用但它是相同的密钥,则覆盖它。因此,该循环会不断重新散列,直到找到一个空槽或一个具有相同键的槽(我们可以覆盖)。

【讨论】:

  • 好的。假设您找到了相同的密钥,然后覆盖了数据。您刚刚替换的密钥(和数据)会发生什么变化?
  • @user5977290 该密钥的旧数据刚刚丢失。关键......好吧,你没有改变它,所以它保持不变。
  • 这不是碰撞吗?如果密钥相同,那就是。这不是搜索下一个空槽的原因吗?
  • @user5977290 如果密钥相同,则不认为是冲突。来自 Wikipedia:“理想情况下,散列函数会将每个键分配给一个唯一的桶,但大多数散列表设计采用不完美的散列函数,这可能会导致散列冲突,其中散列函数为多个键生成相同的索引。”冲突意味着两个不同的键散列到同一个索引。如果您查看循环,它只会在密钥 不同 时继续搜索。如果相同,则停止搜索并覆盖数据。
猜你喜欢
  • 1970-01-01
  • 2013-05-28
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多