开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 13 天,点击查看活动详情
哈希表(Hash table)是根据关键码值而直接进行访问的数据结构。其中的关键码值就是(Key value)。对于哈希表的完整定义是这样的:
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数
在前端中,Object、Set、WeakSet、Map、WeakMap 等都属于是哈希结构。那么,我们使用哈希表可以解决哪些问题?
比如:查找元素。当人这里的查找不仅限于找到某个元素,还会有相应的扩展:
- 判断数组中是否存在重复元素
- 数组去重
- 数组或字符串中只出现一次的字符
- 插入或修改或删除
使用哈希表来进行元素的查找,与普通的循环遍历查找相比,时间复杂度会降低(从 O(N) 到 O(1) )。查找效率的降低,其实就是查找时比较次数的降低,如果想要直接在一组数据中找到目标元素,就要建立一种对应关系,每个关键字对应结构中一个存储位置(唯一)。
哈希函数
建立一种对应关系,需要封装一个函数,把关键字转化为对应的下标值,这个函数就是哈希函数。前端中常用的 MD5 就是哈希函数。
不同的关键字哈希化后可能得到的下标值是相同的,会产生地址的冲突,这个就是哈希冲突。解决冲突的方法有:
- 链地址法 将发生冲突的元素存在链表中
- 开放地址法
总结
- 哈希表的结构是数组的形式
- key不允许重复的
- 哈希表无论数据的多少,插入和删除的时间复杂度趋近于 O(1)
- 哈希表中的数据是没有顺序的
- 查找速度快