我正在尝试编写一个函数,该函数返回特定大小的哈希表的最差索引/索引的列表。它应该类似于:
def worst_indices(size_of_hashtable, list_of_keys):
....
其中list_of_keys是基于散列函数输入到散列表中的键列表:h(键)=键%大小。
我的函数没有,但是需要输出哈希表,如果你想在其中输入另一个键,它只需要输出需要最多移位/探测的索引。
例如,以下代码
values = [25, 32, 88, 10, 35, 11]
worst = worst_indices(11, values)
print(worst)
应该产生输出:
[10]
另一个例子是代码:
values = [4, 9, 12, 3, 7, 26, 16, 20, 11]
worst = worst_indices(13, values)
print(worst)
应该产生输出:
[3, 7, 11]
因此,如果您要在哈希表中添加另一个值,那么在这些“最差索引”中添加一个值会导致最右移,因为它会探测下一个开放点。 关于如何做到这一点的任何帮助或提示都会很棒。 感谢。
答案 0 :(得分:2)
假设我理解你的意图,这应该可以解决你的问题。请注意,添加key_list中的值的顺序不应影响结果(当然,它会影响实际哈希表中的存储分配):
def worst_indices(hash_size, key_list):
# require at least one empty hash bucket
assert(len(key_list) < hash_size)
buckets = [False] * hash_size
for key in key_list:
index = key % hash_size
index2 = index
while buckets[index2]:
index2 += 1
if index2 == hash_size:
index2 = 0
buckets[index2] = True
# find some empty bucket
ix0 = buckets.index(False)
# count the chain lengths
lengths = [None] * hash_size
ix = ix0
length = 0
while True:
length = length + 1 if buckets[ix] else 0
lengths[ix] = length
ix = hash_size - 1 if ix == 0 else ix - 1
if ix == ix0:
break
max_length = max(lengths)
return [ix for ix in xrange(hash_size)
if lengths[ix] == max_length]
这是输出:
>>> worst_indices(11, [25, 32, 88, 10, 35, 11])
[10]
>>> worst_indices(13, [4, 9, 12, 3, 7, 26, 16, 20, 11])
[3, 7, 11]
>>>
希望这有帮助。