浅谈哈希表

哈希表又叫散列表,一种以 "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的哈希表,判断一个串出现过只需要计算出两个哈希值,在第一个哈希值对应的链表里找第二个哈希值是否出现过就可以了。

posted @ 2019-11-01 09:33  锦依卫Lijilai  阅读(160)  评论(0编辑  收藏  举报