双哈希作业-python
我现在在班上做散列运算。 我需要创建一个双哈希函数,它接受一个列表,使用双哈希并返回一个新列表 我知道列表是如何使用双哈希的,但是我在写下它的代码时遇到了麻烦双哈希作业-python,python,hash,Python,Hash,我现在在班上做散列运算。 我需要创建一个双哈希函数,它接受一个列表,使用双哈希并返回一个新列表 我知道列表是如何使用双哈希的,但是我在写下它的代码时遇到了麻烦 hashkey = key % len(list) steps = q - (key % q) new_hashkey = steps + hashkey #q = double_hash_value 这是我在课堂上学习的双哈希函数。我只是无法在代码中实现它 这是我迄今为止的尝试: def double_hashing(keys, ha
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
感谢您的帮助。谢谢。据我所知,您的函数有两个问题: 问题1是,在
while
循环中,您使用hashkey
更新new\u hashkey
的值,这意味着如果函数在while循环的第一次迭代中未能找到给定值的适当索引,它永远不会找到它,因为new\u hashkey
的值永远不会更改。另外,只需将步骤添加到新的\u hashkey
中,您就可能会遇到新的\u hashkey
大于哈希表大小的风险,这将最终抛出一个索引器。您可以通过将该值与哈希表大小
进行模运算来修复此问题。
其次,您的函数返回得太早。在您的示例中,它在遇到44
(即它第一次进入else
块)后返回,这就是您没有将51
添加到输出列表的原因。return语句实际上应该在for循环完成之后,以便确保将keys
列表中的所有值添加到输出列表中
请参阅下面更新的代码(已注释更改的行):
据我所知,您的函数有两个问题:
问题1是,在while
循环中,您使用hashkey
更新new\u hashkey
的值,这意味着如果函数在while循环的第一次迭代中未能找到给定值的适当索引,它永远不会找到它,因为new\u hashkey
的值永远不会更改。另外,只需将步骤添加到新的\u hashkey
中,您就可能会遇到新的\u hashkey
大于哈希表大小的风险,这将最终抛出一个索引器。您可以通过将该值与哈希表大小
进行模运算来修复此问题。
其次,您的函数返回得太早。在您的示例中,它在遇到44
(即它第一次进入else
块)后返回,这就是您没有将51
添加到输出列表的原因。return语句实际上应该在for循环完成之后,以便确保将keys
列表中的所有值添加到输出列表中
请参阅下面更新的代码(已注释更改的行):
谢谢你帮我,伙计。也谢谢你指出我的错误。我知道我在做傻事。谢谢你帮我摆脱困境。也谢谢你指出我的错误。我知道我在做傻事。
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 = (new_hashkey + steps) % hashtable_size ## problem 1 is here
hashtable_list[new_hashkey] = keys[i]
return hashtable_list ## problem 2 is here
values = [26, 54, 94, 17, 31, 77, 44, 51]
print( double_hashing(values, 13, 5) )
[26, None, 54, 94, 17, 31, 44, 51, None, None, None, None, 77]