Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中调整哈希表的大小?_Python_Hashtable - Fatal编程技术网

如何在python中调整哈希表的大小?

如何在python中调整哈希表的大小?,python,hashtable,Python,Hashtable,我正在尝试用python实现哈希表。我正在努力调整哈希表的大小,以防地址重复或哈希表太小 这是我的构造器 def __init__(self): self.table_size = [11, 23, 47, 97, 197, 397, 797, 1597, 3203, 6421, 12853, 25717, 51437, 102877, 205759, 411527, 823117, 1646237,

我正在尝试用python实现哈希表。我正在努力调整哈希表的大小,以防地址重复或哈希表太小

这是我的构造器

def __init__(self):
    self.table_size = [11, 23, 47, 97, 197, 397, 797, 1597, 3203, 6421,
                      12853,
                  25717, 51437, 102877, 205759, 411527, 823117, 1646237,
                  3292489, 6584983, 13169977, 26339969, 52679969,
                  105359939, 210719881, 421439783, 842879579, 1685759167]
    self.table_size_index = 0
    self.counter = 0
    self.size = self.table_size[self.table_size_index]
    self.slot = [None] * self.size
    self.data = [None] * self.size
table\u size
包含足够的素数来创建大哈希表。
table\u size\u index
指示我使用的表大小

我的
put
功能是

 def put(self, key, val):
        hash_value  = self.hash_function(key, len(self.slot))
        if self.slot[hash_value] == None:
            self.slot[hash_value] = key
            self.data[hash_value] = val
            #self.counter += 1
        else:

            if self.table_size_index < len(self.table_size) -1 :
                self.table_size_index += 1
                new_slot = [None] * self.table_size[self.table_size_index]
                new_data = [None] * self.table_size[self.table_size_index]

                # copying old hash table to new hash table
                for i in self.slot:
                    new_hash_value = self.hash_function(i, len(new_slot))
                    new_slot[new_hash_value] = i
                    temp = self.slot.index(i)
                    new_data[new_hash_value] = self.data[temp]
                self.slot = new_slot
                self.data = new_data
def put(self、key、val):
hash_value=self.hash_函数(key,len(self.slot))
如果self.slot[哈希值]==无:
self.slot[hash_value]=密钥
self.data[hash_value]=val
#self.counter+=1
其他:
如果self.table\u size\u索引
它总是打印出
11
插槽的
长度
数据
。如果密钥已存在,则不会增加其大小。我该怎么修这个?
提前谢谢

这是调试器的问题。你需要自己弄清楚,你从未更新过self.size,但除此之外,我看到了一大堆问题。在没有散列冲突之前,您是否将无限期地增长?通常,您希望实现两种策略中的一种来处理冲突,并且仅当实际条目数超过哈希表大小的某个百分比时才增加表大小。还有其他的bug。另外,请按照帮助链接中的说明提供。
数据
是多余的,并且
else
下的语句永远不会执行,请添加一个打印来测试它。@KennyOstrom您的意思是我必须先通过打开寻址来使用所有插槽,然后再增加其大小吗?@obgnaw我会尝试。谢谢您的检查!所有插槽?不,那太疯狂了。查找哈希表。这是调试器的问题。你需要自己弄清楚,你从未更新过self.size,但除此之外,我看到了一大堆问题。在没有散列冲突之前,您是否将无限期地增长?通常,您希望实现两种策略中的一种来处理冲突,并且仅当实际条目数超过哈希表大小的某个百分比时才增加表大小。还有其他的bug。另外,请按照帮助链接中的说明提供。
数据
是多余的,并且
else
下的语句永远不会执行,请添加一个打印来测试它。@KennyOstrom您的意思是我必须先通过打开寻址来使用所有插槽,然后再增加其大小吗?@obgnaw我会尝试。谢谢您的检查!所有插槽?不,那太疯狂了。查找哈希表。