浅谈哈希表

哈希表又叫散列表,一种以 "key-value" 形式存储数据的数据结构,C++11中的unordered​_map就是用哈希表实现的。

简单讲,就是计算出(key)的哈希值,然后对应到(value)上。这样查询就可以做到(O(1))查询。

但是显然,哈希不可避免的就会出现哈希冲突。解决这个问题比较常用的方法叫做"开散列法"。

我们建一个邻接表。类似于一张图,一个哈希值可以连向多个(value),然后类似于遍历图一样查询就可以了。假设(key)的范围是([1,m]),哈希表总的大小为(n),则一次插入/查询进行期望(O(frac{N}{M}))的比较。(接近(O(1)))。

为了邻接表开的下,显然(key)不能太大对吧。比如(32767)作为模数就是个不错的选择。

举例:双哈希

比如我们要判断一个字符串是否出现过,使用双哈希降低冲突。那么就可以写一个哈希值1->哈希值2的哈希表,判断一个串出现过只需要计算出两个哈希值,在第一个哈希值对应的链表里找第二个哈希值是否出现过就可以了。

原文地址:https://www.cnblogs.com/lijilai-oi/p/11775232.html