【问题标题】:Hash table simulation哈希表模拟
【发布时间】:2016-05-21 22:37:00
【问题描述】:

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

例如:list_of_values = [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

【问题讨论】:

  • 请出示代码。
  • 肯定会编辑我的问题

标签: python python-3.x hash hashtable


【解决方案1】:

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

  • 在这部分 - if size[hash_key] != None: size[hash_key] = key, 您可能会将新值覆盖到旧值上。
  • 在对列表进行第一次添加时,代码将进入 无限循环。
  • 虽然与代码的功能无关,但列表名称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)

【讨论】:

  • 它似乎运行良好,但它没有在列表末尾打印任何 None
  • 是的,我正在尝试进行线性探测:)
  • 现在只是打印出来 [26, 54, 94, 17, 31, 13, 44, 51]
  • 仍然给出相同的输出:/
  • @deans7 这很奇怪!我还在答案末尾添加了一个演示。它在那里显示正确的输出。
【解决方案2】:

除了一些小错别字和错误名称变量之外,您的代码中的主要问题是您尝试将每个值都放在已经占用的位置。循环while size[hash_key] == None: 将搜索被占用的单元格,因为它会在找到size[hash_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)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    • 2014-08-27
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 2023-03-31
    相关资源
    最近更新 更多