【数据结构】什么是哈希表?为什么哈希表的查询时间复杂度是O(1)?

【数据结构】什么是哈希表?为什么哈希表的查询时间复杂度是O(1)?力扣刷题的第一题 两数之和的最佳解决方法就是哈希表 本篇就是来讲解数据结构 哈希表的 来帮助大家认识哈希表 助力解题


大家好,我是卷心菜,可以叫我菜菜,大二学生一枚。本篇主要讲解一种数据结构:哈希表。如果您看完文章有所收获,可以三连支持博主哦~,嘻嘻。


一、前言

  • 实话实说,我算法贼菜,为了提高自己的算法能力,自己也是慢慢开始积累刷题经验,在做题中学习数据结构和算法。为了说明今天所要讲的哈希表这一个数据结构,还是从经典的两数之和开始吧

这道题是牛客网的一道算法题:题目链接如下:两数之和
可能刚接触编程的小伙伴们还不知道什么是牛客网:他是一个可以学习编程,比如JAVA、C++、C、Python等等编程语言;内推找工作面经复习知识的神器,非常适合用来日常的学习,:点击开始注册吧

  • 题目如下,自己第一次写这道题,也是循环遍历,效率可以说是非常的慢,就像评论区那样所说:“有人相爱,有人夜里看海,有人两数之和做不出来”在这里插入图片描述

二、数组

在正式开始讲解哈希表之前,让我们来简单认识一下数组。我们经常使用 数组,它也是一种数据结构,那么数组有什么优点呢?
在这里插入图片描述
简单来说,数组的优点是:我们可以通过数组的下标快速定位到该位置下的数值,获取这个数值是非常非常的快, O(1)级别的时间复杂度。而哈希表的出现,就很好的解决了这个问题。




但是大家有没有想过,如果我们不知道该数值的下标,想要获取这个值,只能通过从头遍历数组,这时候,查询的时间复杂度就是O(N)级别的


三、哈希表

1、百度百科

哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数(哈希函数),存放记录的数组叫做哈希表。给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。

读起来有些吃力,我们只需要抓住两点:哈希函数、哈希表,接下来我会介绍它们


2、问题引用

前面讲过了,哈希表的出现可以解决数组的缺点,让我们从一个小案例来慢慢理解哈希表~


3、哈希函数

上文说的“一种方式”,就是哈希函数,它有三个很重要的性质:

  • 当给哈希函数传入相同的输入值时,返回值一样
  • 当给哈希函数传入不同的输入值时,返回值可能一样,也可能不一样,也就是我们所说的哈希碰撞
  • 很多不同的输入值所得到的返回值会均匀的分布在输出域上,这一点很重要

4、哈希表结构


5、举例分析

在这里插入图片描述
当我们输入abc时,由哈希函数计算得到一个哈希值10,10求%后得到1,就把abc放到数组下标为1的位置;然后输入edg,再次由哈希函数计算得到一个哈希值13,13求%后得到4,就把edg放到数组下标为4的位置,后面的操作也是这样。


6、哈希冲突

最后再来提一提哈希冲突:当我们输入future时,假如通过哈希函数计算得到哈希值是15,我们就发现跟love的位置冲突了,解决这个方式有好几种,比如:拉链法再次哈希法等等,这个我准备在写HashMap源码的时候,通过讲解HashMap的底层实现原理时,说一说Java的API的哈希表是什么样的时候再说。


7、哈希表的优缺点

  • 优点:处理元素很快,添加、删除、修改、查找元素性能好
  • 缺点:元素在数组中是无序的,不能重复

最后,讲解了哈希表的数据结构,那么力扣第一题你会了吗?

class Solution { 
              public int[] twoSum(int[] nums, int target) { 
              int[] arr = new int[2]; HashMap<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < nums.length; i++) { 
              if (map.containsKey(nums[i])) { 
             //如果为true,说明target-num[i-1]的值在数组中存在 arr[0] = map.get(nums[i]); arr[1] = i; return arr; } map.put(target - nums[i], i);//这条语句不能放到if语句的前面! } return arr; } } 

感谢阅读,一起进步,嘻嘻~

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/225723.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 上午8:41
下一篇 2026年3月17日 上午8:41


相关推荐

  • RJ45 网线接口介绍

    RJ45接口通常用于数据传输,最常见的应用为网卡接口。  RJ45是各种不同接头的一种类型(例如:RJ11也是接头的一种类型,不过它是电话上用的);RJ45头根据线的排序不同,分为有两种,一种是橙白、橙、绿白、蓝、蓝白、绿、棕白、棕;另一种是绿白、绿、橙白、蓝、蓝白、橙、棕白、棕;因此使用RJ45接头的线也有两种即:直通线、交叉线。RJ45型网卡接口  10100basetxRJ

    2022年4月9日
    54
  • 垂直类AI Agent智能体开发指南

    垂直类AI Agent智能体开发指南

    2026年3月16日
    2
  • export报错SyntaxError: Unexpected token export

    export报错SyntaxError: Unexpected token export情景重现 a jsexportlett function console log 1 b jsleta require a a test 运行 nodeb 即出现如下报错 exportdefaul SyntaxError Unexpectedto 解决方法 a

    2026年3月17日
    2
  • 汇编语言(指令简表)

    汇编语言(指令简表)一 汇编指令简表数据传送指令汇编格式指令的操作 movdest source 数据传送 CBW 字节转换成字 CWD 字转换成双字 LAHFFLAGS 低 8 位装入 AH 寄存器 SAHFAH 寄存器内容送到 FLAGS 低 8 位 LDSdest source 设定数据段指针 LESdest source 设定附加段指针 LEAdest sour

    2026年3月26日
    1
  • mybatis拦截器详解_Java拦截器

    mybatis拦截器详解_Java拦截器拦截器可在mybatis进行sql底层处理的时候执行额外的逻辑,最常见的就是分页逻辑、对结果集进行处理过滤敏感信息等。}}}}}else{}}}折叠从上面的代码可以看到mybatis支持的拦截类型只有四种(按拦截顺序)1.Executor执行器接口2.StatementHandlersql构建处理器3.ParameterHandler参数处理器4.ResultSetHandler结果集处理器。…

    2025年10月16日
    8
  • FinalShell国产ssh连接工具简单的使用教程

    FinalShell国产ssh连接工具简单的使用教程办公中 使用 xshell 由于用的免费版 经常过段时间就要再去重新申请 比较麻烦 现在换成国产 FinalShell 工具 用了段时间效果不错 一 对应版本下载地址 Windows 版下载地址 http www hostbuf com downloads finalshell install exeMac 版 Linux 版安装及教程 http www hostbuf

    2026年3月17日
    20

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号