哈希表
哈希表是根据关键码的值而直接进行访问的数据结构。
一般哈希表都是用来快速判断一个元素是否出现集合里。
哈希函数
为了保证映射出来的索引数值都落在哈希表上,我们会在再次对数值做一个取模的操作
哈希碰撞
数据数量大于哈希表的大小怎么办,此时就算哈希函数计算的再均匀,也避免不了会有几个数据同时映射到哈希表同一个索引下表的位置。这就导致了哈希碰撞
解决方法:
- 拉链法
- 线性探测法
常见的三种哈希结构
-
数组
-
set (集合)
c++中有三种set容器:
std::unordered_set底层实现为哈希表
std::set 和std::multiset 的底层实现是红黑树红黑树是一种平衡二叉搜索树,所以key值是有序的,但key不可以修改,改动key值会导致整棵树的错乱,所以只能删除和增加。
-
map(映射)
c++中有三种map容器:
std::unordered_map 底层实现为哈希表
std::map 和std::multimap 的底层实现是红黑树同理,std::map 和std::multimap 的key也是有序的(这个问题也经常作为面试题,考察对语言容器底层的理解)。
哈希的常用方法
一般是哈希值的索引用来表示信息;值用来记录,一般记录数目或者做标记