关于Double Hashing的家庭作业 - 蟒蛇

时间:2017-02-16 02:38:20

标签: python hash

我正在课堂上做哈希。 我需要创建一个双哈希函数,它接受一个列表并使用双哈希并返回一个新列表。

我理解列表如何使用双重哈希,但我无法为其写下代码。

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 个答案:

答案 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