【算法入门】哈希表

1,087 阅读3分钟

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

前言

哈希表这个名词,对于科班生来说应该都很熟悉,但对于一些没有系统学过计算机数据结构的同学,可能就有点陌生了,但是不要怕,实际上大部分同学在开发过程中都会有相关的应用,例如通过策略模式的优化if / else,或者在对循环计算的优化,都会借用到哈希表的思想,今天就和大家一起聊一聊 Hash

哈希表

简介

哈希表也叫散列表,哈希表是一种数据结构,它提供了快速的插入操作和查找操作,无论哈希表总中有多少条数据,插入和查找的时间复杂度都是为O(1) ,因为哈希表的查找速度非常快,所以在很多时候我们可以用它来优化程序

关于哈希表,我们可以拿它和我们比较熟悉的数组做对比,数组中有两个概念,索引 index (也就是下标)和对应的值,哈希表也类似,有对应的关键字(与数组元素的下标相对应,只是没有必须要是数字了) ,并且每个关键字都有其与之相对应的值,可以说大部分情况下,哈希表与数组,是可以相互转化的,数组能做的,哈希表同样也能做

优势

数组只能通过下标迅速访问,但是这个下标与数组里存的元素值没什么关系;哈希表通过散射函数建立了数组元素关键码的值与下标的关系 , 是数组的加强版

如果不需要有序遍历数据,并且可以提前预测数据量的大小,那么哈希表在速度和易用性方面是无与伦比的

缺点

哈希表是基于数组的,数组创建后难于扩展,某些哈希表被基本填满时,性能下降得非常严重

做题

217. 存在重复元素 - 力扣(LeetCode)

给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false

分析

从题目中分析,只需要找到任意一个重复的数字,那么可以利用哈希表,用数字的值作为 key 去存储,如果遇到已经存在的 key,则直接返回

算法步骤

  1. 声明哈希表用来保存遍历的值
  2. 开始遍历数组
  3. 获取当前值,判断值是否已经存在,若存在,则返回结果并结束循环
  4. 储存当前值进哈希表
  5. 循环直到遍历完成
/**
 * @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):需要声明哈希表进行存储