上次刷完LeetCode题目1,看了答案之后懂得流程,但其实对于哈希表的流程还是不是特别明白
所以针对哈希表进行专业学习
哈希表,是根据关键字来创建的一个表格,创建之后就可以遍历了,是很快的一个操作,可以理解为电话簿存储联系人时,每个首字母对应一个关键字,匹配则存往该地址。
当面临一个关键字有多个对应的值的时候,有开放寻址法和拉链法来进行解决。没有具体操作之前,认为拉链法会比较好。
开放寻址法,是指如果当前关键字如果已经有对应值,就去该地址的下一个地址去查询,看是否可以存储。我觉得这个若是对于一个数组,存储时,前面重复的关键字会导致占用后面该正在存储的关键字,使得哈希表不能完全是一个哈希表了。就是本来关键字是3 的,但因为关键字是2的过多,占用了3的位置,那么当我们想要找关键字3的值时,就无法直接找到了。
拉链法,是直接将重复关键字的值,构成链表。需要掌握链表的知识。可能会导致存储空间的浪费。比如某个关键字完全没有值对应,那么这片空间一定会被浪费。
哈希函数设置为:hash(key) = key % capacity; capacity为存储元素底层空间总的大小
头文件要包含#include <unordered_map> #include <unordered_set>用到哪个写哪个
通过unordered_set或者unorder_map来构造哈希表,可以使用begin表示起始位置,end表示末位置(map和set遍历是有序的,unordered系列是无序的)
可能会用到vector添加元素(push_back()和emplace_back())
调用函数时会用到STL库
LeetCode第一题是需要掌握哈希表的使用,而不是从定义要求开始