【算法入门】哈希表

简介: 哈希表

17c98850bc1c134a9ea9f2d37b04e63.png

前言

哈希表这个名词,对于科班生来说应该都很熟悉,但对于一些没有系统学过计算机数据结构的同学,可能就有点陌生了,但是不要怕,实际上大部分同学在开发过程中都会有相关的应用,例如通过策略模式的优化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):需要声明哈希表进行存储
相关文章
|
2月前
|
机器学习/深度学习 存储 缓存
数据结构从入门到精通——算法的时间复杂度和空间复杂度
算法的时间复杂度和空间复杂度是评估算法性能的两个重要指标。时间复杂度主要关注算法执行过程中所需的时间随输入规模的变化情况,而空间复杂度则关注算法执行过程中所需的最大存储空间或内存空间。
75 0
|
2月前
|
搜索推荐 算法 C语言
C语言选择排序算法,从入门到精通只需1秒!
C语言选择排序算法,从入门到精通只需1秒!
|
2月前
|
算法 前端开发
|
4天前
|
存储 机器学习/深度学习 算法
|
7天前
|
算法 索引
数据结构与算法-最短路径基础入门
数据结构与算法-最短路径基础入门
6 0
|
7天前
|
算法 索引
数据结构与算法-最小生成树入门
数据结构与算法-最小生成树入门
12 0
|
7天前
|
算法
数据结构与算法-图论的基础入门
数据结构与算法-图论的基础入门
6 0
|
7天前
|
算法 索引
数据结构与算法-排序进阶入门
数据结构与算法-排序进阶入门
7 0
|
7天前
|
算法
数据结构与算法-AVL树入门
数据结构与算法-AVL树入门
10 0
|
7天前
|
算法 索引
数据结构与算法-三种队列基础入门
数据结构与算法-三种队列基础入门
8 0