算法 | 前端之哈希表

249 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 13 天,点击查看活动详情

哈希表(Hash table)是根据关键码值而直接进行访问的数据结构。其中的关键码值就是(Key value)。对于哈希表的完整定义是这样的:

给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数

image.png

在前端中,Object、Set、WeakSet、Map、WeakMap 等都属于是哈希结构。那么,我们使用哈希表可以解决哪些问题?

比如:查找元素。当人这里的查找不仅限于找到某个元素,还会有相应的扩展:

  • 判断数组中是否存在重复元素
  • 数组去重
  • 数组或字符串中只出现一次的字符
  • 插入或修改或删除

使用哈希表来进行元素的查找,与普通的循环遍历查找相比,时间复杂度会降低(从 O(N) 到 O(1) )。查找效率的降低,其实就是查找时比较次数的降低,如果想要直接在一组数据中找到目标元素,就要建立一种对应关系,每个关键字对应结构中一个存储位置(唯一)。

哈希函数

建立一种对应关系,需要封装一个函数,把关键字转化为对应的下标值,这个函数就是哈希函数。前端中常用的 MD5 就是哈希函数。

不同的关键字哈希化后可能得到的下标值是相同的,会产生地址的冲突,这个就是哈希冲突。解决冲突的方法有:

  • 链地址法 将发生冲突的元素存在链表中
  • 开放地址法

总结

  1. 哈希表的结构是数组的形式
  2. key不允许重复的
  3. 哈希表无论数据的多少,插入和删除的时间复杂度趋近于 O(1)
  4. 哈希表中的数据是没有顺序的
  5. 查找速度快