01 哈希表理论基础

36 阅读2分钟

01 哈希表理论基础

1、哈希表:

散列表,般哈希表都是用来快速判断一个元素是否出现集合里。 只需要O(1)就可以做到。

将学生姓名映射到哈希表上就涉及到了hash function ,也就是哈希函数

2、哈希函数:

哈希函数,把学生的姓名直接映射为哈希表上的索引,如果学生的数量大于哈希表的大小怎么办,此时就算哈希函数计算的再均匀,也避免不了会有几位学生的名字同时映射到哈希表 同一个索引下标的位置。

接下来哈希碰撞登场

3、哈希碰撞:

小李和小王都映射到了索引下标 1 的位置,这一现象叫做哈希碰撞

一般哈希碰撞有两种解决方法, 拉链法和线性探测法。

拉链法:

就是在哈希表后接上一个链表,让冲突的元素都加入到此链表中。

其实拉链法就是要选择适当的哈希表的大小,这样既不会因为数组空值而浪费大量内存,也不会因为链表太长而在查找上浪费太多时间。

线性探测法:

使用线性探测法一定要保证哈希表的大小大于数据大小,从而让剩余的空位来解决冲突问题。

即如果小王要加入的位置存在了小李,则将小李加入在小王位置的下一个位置。

4、常见的三种哈希结果:

数组、set(集合)、map(映射)。

当我们要使用集合来解决哈希问题的时候,优先使用 unordered_set,因为它的查询和增删效率是最优的;

如果需要集合是有序的,那么就用set

如果要求不仅有序还要有重复数据的话,那么就用multiset