Python 实现可以处理冲突的表加倍

Python 实现可以处理冲突的表加倍,python,python-3.x,algorithm,data-structures,hash,Python,Python 3.x,Algorithm,Data Structures,Hash,我正在尝试实现能够在python中处理冲突的哈希表。因此,这背后的逻辑是我们有一个大小为self.MAX=10的hash_表,每当发生冲突时,我们只需在 self.arr[hash\u value]。追加((键,值)) 但我也希望它能够调整大小,因为每当我们使用相同的hash\u值向表中追加新值时,我们可能会有巨大的self.arr[hash\u value]。因此,我们将表的大小加倍,并将旧哈希表的所有元素移动到新哈希表,即使用不同的哈希函数的旧哈希表*2 我正在使用一个非常基本的哈希函数,即

我正在尝试实现能够在python中处理冲突的哈希表。因此,这背后的逻辑是我们有一个大小为
self.MAX=10
的hash_表,每当发生冲突时,我们只需在
self.arr[hash\u value]。追加((键,值))

但我也希望它能够调整大小,因为每当我们使用相同的hash\u值向表中追加新值时,我们可能会有巨大的
self.arr[hash\u value]
。因此,我们将表的大小加倍,并将旧哈希表的所有元素移动到新哈希表,即使用不同的哈希函数的
旧哈希表*2

我正在使用一个非常基本的哈希函数,即
键%len(哈希表)

下面是我编写的代码,但我无法弄清楚如何实现表加倍,以及将哈希表的大小加倍的正确时间是什么,以便使链表(不是链表,确切地说,它只是键、值对的元组)的大小最小

代码:

类哈希表:
定义初始化(自):
self.MAX=10
self.arr=[]表示范围内的uu(self.MAX)]
self.length=0
def get_散列(自身,密钥):
“”“此Func将返回要添加哈希表的键的哈希值”“”
h=0
对于键中的字符:
h+=ord(字符)
返回h%self.MAX
定义设置项(自身、键、值):
h=self.get\u散列(键)
发现=错误
#将哈希表加倍:
#如果hash是arr的边,并且边上有elem,那么将self.MAX增加2x
如果h>=self.MAX-1和len(self.arr[h])==1和self.arr[h][0]!=(键、值):
#self.arr=self.arr+self.new\u arr
self.MAX*=2
self.new_arr=[[]用于范围内(self.MAX)]#初始化大小为2x self.MAX的新arr
对于枚举中的i,l(self.arr):
#如果内部列表有值,则:
如果len(self.arr[i])>=1:
对于self.arr[i]中设置的数据:
#关于新hash_func的重新分级
class HashTable:
    def __init__(self):
        self.MAX = 10
        self.arr = [[] for _ in range(self.MAX)]
        self.length = 0

    def get_hash(self, key):
        """This Func will return the hash value of the key to add hashtable"""
        h = 0
        for char in key:
            h += ord(char)
        return h % self.MAX

    def __setitem__(self, key, value):
        h = self.get_hash(key)
        found = False

        # Doubling the Hashtable:
        # if hash is edge of arr and we have elem on the edge then incr self.MAX by 2x
        if h >= self.MAX - 1 and len(self.arr[h]) == 1 and self.arr[h][0] != (key, value):
            # self.arr = self.arr + self.new_arr
            self.MAX *= 2
            self.new_arr = [[] for _ in range(self.MAX)]  # initializing new arr of size 2x self.MAX
            for i, l in enumerate(self.arr):
                # if inner list has values then:
                if len(self.arr[i]) >= 1:
                    for data_set in self.arr[i]:
                        # rehashing with respect to new hash_func <<--- problem
                        self.__setitem__(data_set[0], data_set[1])

                        # self.arr[i].remove(data_set)

        for idx, data in enumerate(self.arr[h]):
            # if the value is already present: then modify it
            if len(data) == 2 and data[0] == key:
                self.arr[h][idx] = (key, value)
                found = True
                break
        if not found:
            self.arr[h].append((key, value))
            self.length += 1

    def __getitem__(self, item):
        h = self.get_hash(item)
        if len(self.arr[h]) > 1:
            for i in range(len(self.arr[h])):
                if self.arr[h][i][0] == item:
                    return self.arr[h][i][1]
            return self.arr[h][0][1]