前言
哈希表这个名词,对于科班生来说应该都很熟悉,但对于一些没有系统学过计算机数据结构的同学,可能就有点陌生了,但是不要怕,实际上大部分同学在开发过程中都会有相关的应用,例如通过策略模式的优化if / else
,或者在对循环计算的优化,都会借用到哈希表的思想,今天就和大家一起聊一聊 Hash
表
哈希表
简介
哈希表也叫散列表,哈希表是一种数据结构,它提供了快速的插入操作和查找操作,无论哈希表总中有多少条数据,插入和查找的时间复杂度都是为O(1) ,因为哈希表的查找速度非常快,所以在很多时候我们可以用它来优化程序
关于哈希表,我们可以拿它和我们比较熟悉的数组做对比,数组中有两个概念,索引 index
(也就是下标)和对应的值,哈希表也类似,有对应的关键字(与数组元素的下标相对应,只是没有必须要是数字了) ,并且每个关键字都有其与之相对应的值,可以说大部分情况下,哈希表与数组,是可以相互转化的,数组能做的,哈希表同样也能做
优势
数组只能通过下标迅速访问,但是这个下标与数组里存的元素值没什么关系;哈希表通过散射函数建立了数组元素关键码的值与下标的关系 , 是数组的加强版
如果不需要有序遍历数据,并且可以提前预测数据量的大小,那么哈希表在速度和易用性方面是无与伦比的
缺点
哈希表是基于数组的,数组创建后难于扩展,某些哈希表被基本填满时,性能下降得非常严重
做题
给你一个整数数组
nums
。如果任一值在数组中出现 至少两次 ,返回true
;如果数组中每个元素互不相同,返回false
。
分析
从题目中分析,只需要找到任意一个重复的数字,那么可以利用哈希表,用数字的值作为 key 去存储,如果遇到已经存在的 key,则直接返回
算法步骤
- 声明哈希表用来保存遍历的值
- 开始遍历数组
- 获取当前值,判断值是否已经存在,若存在,则返回结果并结束循环
- 储存当前值进哈希表
- 循环直到遍历完成
/** * @param {number[]} nums * @return {boolean} */ var containsDuplicate = function(nums) { const map = new Map() for (let i = 0; i < nums.length ; i ++) { if (map.get(nums[i])) { return true } map.set(nums[i], true) } return false }; 复制代码
复杂度分析
- 时间复杂度 O(N):遍历一遍数组既可完成(本质上是通过空间换时间)
- 空间复杂度 O(N):需要声明哈希表进行存储