Hash 为什么在计算哈希函数时,哈希查找的成本为O(1),而计算哈希函数可能需要更多的时间?

Hash 为什么在计算哈希函数时,哈希查找的成本为O(1),而计算哈希函数可能需要更多的时间?,hash,hashtable,big-o,time-complexity,Hash,Hashtable,Big O,Time Complexity,HashMap(或)HashTable是键控数组的一个示例。这里,索引是用户定义的键,而不是通常的索引号。例如,arr[“first”]=99是hashmap的一个示例,其中b键为first,值为99 由于使用了键,因此需要使用哈希函数将键转换为索引元素,然后在数组中插入/搜索数据。此过程假定没有碰撞 现在,给定要在数组中搜索的键,如果存在,则必须获取数据。因此,每次搜索之前,都必须将键转换为数组的索引号。那么这需要多少时间呢?因为,时间复杂度也取决于哈希函数。所以时间复杂度必须是O(散列函数的

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

由于使用了键,因此需要使用哈希函数将键转换为索引元素,然后在数组中插入/搜索数据。此过程假定没有碰撞


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

当谈到散列时,我们通常通过讨论在表中搜索元素时需要进行的预期探测数来衡量散列表的性能。在大多数散列设置中,我们可以证明预期的探测数是O(1)。通常,我们会从那里跳到“因此哈希表查找的预期运行时是O(1)”

不过,情况未必如此。正如您所指出的,在特定输入上计算哈希函数的成本可能并不总是需要时间O(1)。类似地,比较哈希表中两个元素的成本也可能不需要时间O(1)。例如,考虑对字符串或列表进行散列

也就是说,通常正确的是以下几点。如果我们让表中的元素总数为n,我们可以说执行哈希表查询的预期成本与n的数量无关。也就是说,不管哈希表中有1000000个元素还是10100个元素,您需要证明的点的数量平均是相同的。因此,我们可以说,作为哈希表大小的函数,在哈希表中执行查找的预期成本为O(1),因为执行查找的成本不取决于表大小

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


希望这有帮助

散列函数的时间假定为常数
O(散列函数的时间)=O(1)
,因为通常字符串的散列不依赖于整个字符串,而只依赖于它的第一个/最后一个
O(1)
字节。和@EgorSkriptunoff不,这不是原因:对一个(相对较短的)字符串进行哈希运算的工作与大量工作相比
N
(映射中的条目数)减小为
N->inf
-即,如果字符串键的长度以
k
散列为界,则任何键都可能是常量的重复。我理解,如果L很大,则Thash可能特别重要,但是,我假设一个好的哈希表实现在仅查找散列比较期间不会比较字符串。我认为哈希表中存储的字符串的长度并不重要。@AlbinoCordeiro在某一点上,您必须比较字符串本身,否则,如果您有一个字符串与表中的另一个字符串存在真正的哈希冲突,您将错误地报告该字符串存在,即使它实际上并不存在。