如何在python中实现哈希表并使其使用链接而不是开放寻址?

2024-07-01 08:28:29 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我得到的使用开放地址的代码:

import math

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

def hashfunction(self,key,size):
    return key%size

def rehash(self,oldhash,size):
    return (oldhash+1)%size

def get(self,key):
  startslot = self.hashfunction(key,len(self.slots))

  data = None
  stop = False
  found = False
  position = startslot
  while self.slots[position] != None and  \
                       not found and not stop:
     if self.slots[position] == key:
       found = True
       data = self.data[position]
     else:
       position=self.rehash(position,len(self.slots))
       if position == startslot:
           stop = True
  return data

def __getitem__(self,key):
    return self.get(key)

def __setitem__(self,key,data):
    self.put(key,data)

def hash(astring, tablesize):
    sum = 0
    for pos in range(len(astring)):
        sum = sum + ord(astring[pos])

    return sum%tablesize

我愿意使用字典或链表来进行链接,因为这很简单。在

我不确定是否需要将列表中的所有内容都设置为linkedlist,还是只需要将其链接起来,同时也不确定如何从链接位置获取数据。谁能帮我提些主意吗?在


Tags: keyselfnonedatasizelenreturnif

热门问题