学习安排根据《代码随想录》~
什么是哈希表:根据关键码的值而进行访问的数据结构【官方解释】
个人总结:根据索引能找到对应的值。例子:数组就是一个哈希表。
哈希表有什么用:一般用来快速判断一个元素是否出现在集合里。
哈希表查找元素的时间复杂度:O(1)。
什么是哈希函数:通过特定的编码方式 将存储的哈希值 映射为哈希表的索引 的函数
即
什么是哈希碰撞:由于 需要存储的元素数量大于哈希表的大小,所以出现 不同哈希值 对应相同的索引,这一现象就叫做哈希碰撞。解决哈希碰撞的两种方法:拉链法、线性探测法。
(a)拉链法 (b)线性探测法
拉链法:选择合适的哈希表大小,这样就不会因为数组空值太大而导致内存浪费,也不会因为链表太长导致查找时间浪费。
线性探测法:需要哈希表的大小大于数据元素的长度,需要找空位给冲突元素。
常见的哈希结构:
1.数组 2. set集合 3.map(映射)
底层实现原理:
PS: std::set 和std::multiset 的底层实现是红黑树,红黑树是一种平衡二叉搜索树,所以key值是有序的,但key不可以修改,改动key值会导致整棵树的错乱,所以只能删除和增加。
PS:std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底层实现是红黑树。同理,std::map 和std::multimap 的key也是有序的。
使用建议:
1. 解决哈希问题,优先使用 unordered_set,因为其查询和增删效率是最优的。
2.如果需要有序插入,则用set;除此之外,如果还要数据可以重复,用multiset。
3.map是一个<键 值>对的数据结构,map中对键的存储有限制,对 值没有。
4.红黑树的底层实现依旧可以来解决映射问题,所以同样称为哈希法。
5.hash_map、hash_set与unordered_set、unordered_map功能一样,但是后者被引入C++11标准库了,前者没有。
总结:哈希法用来判断元素是否存在于某个集合中,但是牺牲了空间来换取查询时间。