为什么在评估哈希函数时哈希查找的成本 O(1) 可能需要比这更多的时间?

Why is the cost of a hash lookup O(1) when evaluating the hash function might take more time than that?

A HashMap(或)HashTable 是 keyed 数组的一个例子。在这里,索引是用户定义的键而不是通常的索引号。例如,arr["first"]=99 是一个 hashmap 的例子,其中 b 键是 first,值为 99.

由于使用了键,所以需要一个哈希函数将键转换为索引元素,然后insert/search数组中的数据。此过程假设 没有碰撞

现在,给定一个要在数组中搜索的键,如果存在,则必须获取数据。所以,每次搜索前,都必须将key转换为数组的索引号。那么这如何花费 O(1) 时间呢?因为,时间复杂度也取决于散列函数。所以时间复杂度一定是O(哈希函数的时间)。

在谈论散列时,我们通常通过谈论搜索时需要进行的 探测 的预期数量来衡量散列的性能 table table 中的元素。在大多数哈希设置中,我们可以证明预期的探测数是 O(1)。通常,我们然后从那里跳到 "so the expected runtime of a hash table lookup is O(1)."

不过,情况不一定如此。正如您所指出的,计算特定输入的哈希函数的成本可能并不总是需要时间 O(1)。同样,比较散列 table 中的两个元素的成本也可能不会花费 O(1) 的时间。例如,考虑哈希字符串或列表。

也就是说,以下情况通常是正确的。如果我们让 table 中的元素总数为 n,我们可以说执行查找散列 table 的预期成本与数字 n 无关。也就是说,哈希 table 或 10100 中是否有 1,000,000 个元素并不重要 - 您需要证明的点数平均而言是相同的.因此,我们可以说在散列 table、 中执行查找的预期成本作为散列 table 大小 的函数是 O(1)因为执行查找的成本不取决于 table 大小。

也许考虑散列中查找成本的最佳方法 table 会说它是 O(Thash + Teq),其中Thash是散列一个元素所需的时间,Teq是比较所需的时间table 中的两个元素。例如,对于字符串,您可以说查找的预期成本是 O(L + Lmax),其中 L 是您正在散列的字符串的长度,Lmax是哈希存储的最长字符串的长度table.

希望对您有所帮助!