01 哈希表理论基础
1、哈希表:
散列表,般哈希表都是用来快速判断一个元素是否出现集合里。 只需要O(1)就可以做到。
将学生姓名映射到哈希表上就涉及到了hash function ,也就是哈希函数。
2、哈希函数:
哈希函数,把学生的姓名直接映射为哈希表上的索引,如果学生的数量大于哈希表的大小怎么办,此时就算哈希函数计算的再均匀,也避免不了会有几位学生的名字同时映射到哈希表 同一个索引下标的位置。
接下来哈希碰撞登场
3、哈希碰撞:
小李和小王都映射到了索引下标 1 的位置,这一现象叫做哈希碰撞。
一般哈希碰撞有两种解决方法, 拉链法和线性探测法。
拉链法:
就是在哈希表后接上一个链表,让冲突的元素都加入到此链表中。
其实拉链法就是要选择适当的哈希表的大小,这样既不会因为数组空值而浪费大量内存,也不会因为链表太长而在查找上浪费太多时间。
线性探测法:
使用线性探测法一定要保证哈希表的大小大于数据大小,从而让剩余的空位来解决冲突问题。
即如果小王要加入的位置存在了小李,则将小李加入在小王位置的下一个位置。
4、常见的三种哈希结果:
数组、set(集合)、map(映射)。
当我们要使用集合来解决哈希问题的时候,优先使用 unordered_set,因为它的查询和增删效率是最优的;
如果需要集合是有序的,那么就用set;
如果要求不仅有序还要有重复数据的话,那么就用multiset。