目录
哈希表:英文名(Hash Table)
国内常翻译为散列表。能看到散列表和哈希表知道描述的是同一个东西就行。
简单理解哈希表:
哈希表中的关键码就是数组的索引下标,然后通过下标直接访问数组中的元素。
哈希表能解决的问题:
一般哈希表都是用来快速判断一个元素是否出现在集合里。
例如:在一个学生名字的集合里去查一个学生的名字,如果是枚举就需要o(n)的时间复杂度,如果是哈希表我们就可以通过下标访问,时间复杂度为o(1)。
而我们要做的就是初始化所有学生的名字存在哈希表里。
将学生名字映射到哈希表上就涉及到了hash function 即哈希函数。
什么是哈希函数?
哈希函数就是,通过hashcode 把名字转化为数值,一般hashcode是通过特定的编码方式,可以将其他数据转化为不同的数值,这样就把学生的名字映射为哈希表的索引上去了。
如果通过hashcode得到的数值大于哈希表的大小,也就是大于tablesize怎么办? 我们可以通过对得到的数值做一个取模的操作,就要我们保证可学生姓名一定可以映射到哈希表上了。
那么问题来了,如果学生的数量太大而哈希表的tablesize太小怎么办,此时就算hash函数计算的再怎么均匀也避免不了会有几个名字落在通一个索引下的位置。
加下来有请哈希碰撞登场
哈希碰撞:
不同的关键字通过相同的哈希函数计算得到了一个相同的位置此时就会发生哈希碰撞。
解决办法:
拉链法(开散列,哈希桶,链地址法) 和 线性探测法(闭散列,线性探测,二次探测)
拉链法:
冲突就是两个关键字 通过哈希函数落在了同一个索引下面,而拉链法就是在这个位置创建了个链表把两个所得的值练了起来,这样只需要找到同一个索引,在顺着索引往链表里找就可以找到两个所得值了。
线性探测法:
线性探测法一定要保证tablesize(数组长度)大于 datesize(链表长度)。我们需要依靠哈希表中的空位来解决碰撞问题。
例如,如果冲突位置放了小李,那么就向下找一个空位置放小王的信息,所以要求tablesize 一定要大于 datesize,要不然哈希表上就没有位置来存放冲突的数据了。
常见的三种哈希结构:
- 数组
- set(集合)
- map(映射)
总结:
总结一下,当遇到需要我们判断一个元素是否粗线在集合里面的时候,就需要考虑哈希法了,
但是哈希法也是牺牲了空间换区了时间,因为我们要是用额外的数组,set或者map来存放数据,才能实现快速查找。
推荐题型:
力扣上搜:
1.有效的字母异位词。
2.赎金信。)
3.字母异位词分组。
题解请看下一篇。
谢谢观看,点个赞支持一下吧!