Python Hash:用于确定最长探测序列的函数

时间:2015-10-21 09:52:12

标签: python hash

我正在尝试编写一个函数,该函数返回特定大小的哈希表的最差索引/索引的列表。它应该类似于:

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]

因此,如果您要在哈希表中添加另一个值,那么在这些“最差索引”中添加一个值会导致最右移,因为它会探测下一个开放点。   关于如何做到这一点的任何帮助或提示都会很棒。 感谢。

1 个答案:

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

希望这有帮助。