哈希表(散列表)
个人理解跟字典挺像的,就是通过键来访问值。
- std::unordered_set(集合)
- std::unordered_map(数组)
- std::multiset(value可重复)
- std::multimap(key可重复)
由值映射到索引的过程被称为哈希映射,采用的是哈希函数,哈希函数也就是映射的规则,但有时候不同的值会被映射到相同的索引下,这一现象叫做哈希碰撞。
一般哈希碰撞有两种解决方法, 拉链法和线性探测法。
拉链法
拉链法就是。将冲突的两个值用链表存储起来,还是跟原来的索引保持映射关系,这样就可以通过索引同时找到两个值。
拉链法要选择适当的哈希表(也就是映射表)的大小,这样既不会因为数组(值的存储空间)空值而浪费大量内存,也不会因为链表太长而在查找上浪费太多时间。
线性探测法
使用线性探测法,一定要保证索引空间大于值空间。 依靠哈希表中的空位来解决碰撞问题。当新的值被映射到的索引已经被使用了,就转而寻找新的空位。
为了更好的应用哈希表,推荐leetcode习题:1, 49, 128