【问题标题】:Understand implementation of a hash table了解哈希表的实现
【发布时间】:2020-05-04 23:22:50
【问题描述】:

我正在研究哈希表,我对这个用 Python 编写的哈希表实现有点困惑,它来自教科书。我理解所有这一切,除了在 addEntry() 方法内部有一个 for 循环,它执行 hashBucket[i] = (dictKey, dictVal) if hashBucket[i][0] == dictKey 我对它的作用有点困惑。

class intDict(object):
    def __init__(self, numBuckets):
        self.buckets = []
        self.numBuckets = numBuckets
        for i in range(numBuckets):
            self.buckets.append([])

    def addEntry(self, dictKey, dictVal):
        hashBucket = self.buckets[dictKey%self.numBuckets]
        for i in range(len(hashBucket)):
            if hashBucket[i][0] == dictKey:
                hashBucket[i] = (dictKey, dictVal)
                return
        hashBucket.append((dictKey, dictVal))

    def getValue(self, dictKey):
        hashBucket = self.buckets[dictKey%self.numBuckets]
        for e in hashBucket:
            if e[0] == dictKey:
                return e[1]
        return None

    def __str__(self):
        result = '{'
        for b in self.buckets:
            for e in b:
                result = result + str(e[0]) + ':' + str(e[1]) + ','
        return result[:-1] + '}' 

【问题讨论】:

  • 没有深入阅读其余部分,该部分只是检查第 0 个索引(我猜测的键)是否已经存在,然后覆盖键值对。

标签: python algorithm hashtable


【解决方案1】:

退后一步,想想哈希表。您只有一个存储桶数组,并且您可以获得索引以确定在给定键的情况下您将查看哪个存储桶的方式是基于一些哈希函数f()。想象一下,您有无限数量的键,但 f() 只能产生大约 20 亿个唯一哈希值。鸽子洞原则指出,如果您有 n 个桶和 n+1 个要放入桶中的对象,那么 至少 个桶将包含多个对象。你可以想象一个最坏的情况,f() 是一个糟糕的哈希函数,我们将所有内容放在同一个桶中。

确实,对于无限大的键集和受限的散列集,没有办法保证哈希表不会发生键冲突。那么,这是为什么呢?

for i in range(len(hashBucket)):
    if hashBucket[i][0] == dictKey:
        hashBucket[i] = (dictKey, dictVal)
            return

这是考虑到同一存储桶中可能存在两个或多个密钥的可能性。我们不仅要查找散列值的索引,而且必须遍历该桶中的所有值以确定它是否是我们要查找的值。如果是这样,我们还需要以某种方式将新值与键一起存储。您仍然需要确定密钥来确定密钥相等性(因为您不能信任哈希这样做),并且您需要该值来使数据结构有价值,因此 (key, value) 元组。

【讨论】:

    猜你喜欢
    • 2011-06-07
    • 2012-06-03
    • 2016-03-25
    • 2011-10-14
    • 2011-09-15
    • 1970-01-01
    • 2021-09-14
    • 2013-05-31
    相关资源
    最近更新 更多