我正在课堂上做哈希。 我需要创建一个双哈希函数,它接受一个列表并使用双哈希并返回一个新列表。
我理解列表如何使用双重哈希,但我无法为其写下代码。
hashkey = key % len(list)
steps = q - (key % q)
new_hashkey = steps + hashkey
#q = double_hash_value
这是我在课堂上学到的双哈希函数。我在代码中实现它时遇到了麻烦。
这是我到目前为止的尝试:
def double_hashing(keys, hashtable_size, double_hash_value):
hashtable_list = [None] * hashtable_size
for i in range(len(keys)):
hashkey = keys[i] % hashtable_size
if hashtable_list[hashkey] is None:
hashtable_list[hashkey] = keys[i]
else:
new_hashkey = hashkey
while hashtable_list[new_hashkey] is not None:
steps = double_hash_value - (keys[i] % double_hash_value)
new_hashkey = hashkey + steps
hashtable_list[new_hashkey] = keys[i]
return hashtable_list
values = [26, 54, 94, 17, 31, 77, 44, 51]
double = double_hashing(values, 13, 5)
print('Double =', double)
我很确定这接近正确,但我只是犯了一个愚蠢的错误。我理解双哈希是如何工作的,但上面的代码不起作用。
此输出应为:
[26, None, 54, 94, 17, 31, 44, 51, None, None, None, None, 77]
但我的输出是:
[26, None, 54, 94, 17, 31, 44, None, None, None, None, None, 77]
未添加索引位置的值51。
感谢任何帮助。谢谢。
答案 0 :(得分:2)
据我所知,你的功能有两个问题:
问题1是在while
循环中,您使用hashkey
来更新new_hashkey
的值,这意味着如果您的函数无法为给定值找到合适的索引在while循环的第一次迭代中,它永远不会找到它,因为new_hashkey
的值永远不会改变。另外,只需将steps
添加到new_hashkey
,您就有可能拥有大于new_hashkey
的{{1}},最终会引发hashtable_size
。您可以通过将该值设为IndexError
的模数来解决此问题。
其次,你的功能太早了。在您的示例中,它在遇到hashtable_size
后(即第一次进入44
块时)返回,这就是为什么您没有将else
添加到输出列表中的原因。你的return语句应该在for循环完成之后,这样你就可以确保将51
列表中的所有值都添加到输出列表中。
请参阅下面的更新代码(已更改的行已注释):
keys