python - 哈希表解释

标签 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

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

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

if self.slots[hashvalue] == key:
  self.data[hashvalue] = data  #replace

此外,有人可以解释一下这部分吗? Nextslot 将是空槽。 我们只是重新散列,如果它不为空且 key 不存在,再次重新散列?

  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 key is already present, why is data being replaced?

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

Also, can someone explain this part? Nextslot would be empty slot.

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

关于python - 哈希表解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42687910/

相关文章:

python - 如何检查python对象列表中是否存在值

javascript - Django:防止重复对象创建的策略

database - 假设自动递增的主键是按时间排序的是不是糟糕的设计?

java - 如何针对两个条件执行 RealmQuery

php - 在 php 中只命中一次数据库连接

python - 这个cython代码可以优化吗?

python - 我如何将python与bash中的py文件相关联

python - 在 Bokeh 中使用 x 轴上的月份

mysql - 左连接的主键

mysql - 哪个数据库是面向性能的,MySQL 还是 MariaDB?