Python 哈希表模拟

Python 哈希表模拟,python,python-3.x,hash,hashtable,Python,Python 3.x,Hash,Hashtable,我正在编写一个函数,它模拟正在插入的键列表,顺序为哈希表中给定的顺序。输出应该是哈希表的列表表示(值None用于表示未使用的位置) 例如:list\u of_value=[26,54,94,17,31,77,44,51] 我已经写了一个代码,但不断得到错误和问题,谢谢你的帮助 def hash_probe(size, key,): hash_key = key % len(size) if size[hash_key] != None: size[hash

我正在编写一个函数,它模拟正在插入的键列表,顺序为哈希表中给定的顺序。输出应该是哈希表的列表表示(值
None
用于表示未使用的位置)

例如:
list\u of_value=[26,54,94,17,31,77,44,51]

我已经写了一个代码,但不断得到错误和问题,谢谢你的帮助

def hash_probe(size, key,):
    hash_key = key % len(size)   
    if size[hash_key] != None: 
        size[hash_key] = key 
    else: 
        while size[hash_key] == None: 
            if hash_key != len(size)- 1: 
                hash_key += 1 
            else:
                hash_key = 0 
        size[hash_key] = key
    return size

除了一些小的输入错误和错误命名变量外,代码中的主要问题是您试图将每个值都放在已占用的位置。循环
而size[hash\u key]==None:
将搜索占用的单元格,因为当找到
size[hash\u key]==None
时,它跳过索引

我重构了您的代码,为您提供了一个想法:

def hash_probe(table, key):
    size = len(table)
    hash_key = key % size
    while table[hash_key] is not None:
        hash_key = (hash_key + 1) % size
    table[hash_key] = key
    return table

list_of_values = [26, 54, 94, 17, 31, 77, 44, 51]
expected = [26, 51, 54, 94, 17, 31, 44, None, None, None, None, None, 77]
actual = [None] * 13
for v in list_of_values:
    hash_probe(actual, v)

print(list_of_values)
print(expected)
print(actual)

请注意,这仍然不是一个真正的解决方案,因为当数组变满时,它将进入无限循环。

我假设您希望在给定代码的哈希表中添加一个新项,并使用解决冲突。
在这种情况下,它有几个问题:

  • 在本部分中-
    如果大小[哈希键]!=无:大小[哈希键]=键
    , 您可能正在旧值上覆盖新值
  • 在对列表进行第一次添加时,代码将进入 无限循环
  • 虽然与代码的功能无关,但列表的名称
    size
    似乎有点奇怪
正确的代码应为:

def hash_probe(keys, size):
    hash_table = [None] * size

    for key in keys:
        hash_key = key % size
        # If we find an empty position, insert it there
        if hash_table[hash_key] is None:
            hash_table[hash_key] = key
        else:
            i = (hash_key + 1) % size

            # Find an unused position
            count = 0
            while count < size and hash_table[i] is not None:
                i = (i + 1) % size
                count += 1

            # If it is an empty position, insert it
            if hash_table[i] is None:
                hash_table[i] = key
            else:
                print("No more space in the hash table!!")

    return hash_table


keys = [26, 54, 94, 17, 31, 77, 44, 51]
hash_table = hash_probe(keys, 13)
print(hash_table)
def hash_探针(键,大小):
哈希表=[None]*大小
对于键入键:
hash_key=密钥%size
#如果我们找到一个空位置,就把它插入那里
如果哈希表[哈希键]为无:
哈希表[哈希键]=键
其他:
i=(散列键+1)%size
#找到一个未使用的位置
计数=0
而count
请显示代码。当然,我会编辑我的问题它似乎运行正常,但它不会在列表末尾打印任何一个,是的,我正在尝试进行线性探测:)现在只打印出这个[26,54,94,17,31,13,44,51]仍然给出相同的输出:/@deans7这很奇怪!我还在答案的末尾添加了一个演示。它在那里显示正确的输出。