如何解决实施表加倍处理冲突
我正在尝试实现可处理python中冲突的Hashtable。因此,其背后的逻辑是我们有一个大小为self.MAX = 10
的hash_table,只要发生冲突,我们只需将项目追加到
self.arr[hash_value].append((key,value))
。
但是我也希望它能够调整大小,因为每当我们向具有相同hash_value的表添加新值时,我们可能会有巨大的self.arr[hash_value]
。因此我们将表的大小加倍,并将旧的hash_table的所有元素移至新的hash_table,即具有不同哈希函数的old_hash_table *2
。
我使用的是非常基本的哈希函数,即key % len(hash_table)
。
这是我编写的代码,但我无法弄清楚如何实现表加倍,以及将hash_table的大小加倍以使linked_list的大小变为正确的正确时间是什么(未链接)列表,只是键的元组,精确的值对)。
代码:
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]
我希望我能解释我的问题。任何答案都会有所帮助!谢谢。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。