双哈希作业-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]