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


文章目录

  • 一、前言
  • 二、数组
  • 三、哈希表
    • 1、百度百科
    • 2、问题引用
    • 3、哈希函数
    • 4、哈希表结构
    • 5、举例分析
    • 6、哈希冲突
    • 7、哈希表的优缺点

一、前言

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

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

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

二、数组

在正式开始讲解哈希表之前,让我们来简单认识一下数组。我们经常使用 数组,它也是一种数据结构,那么数组有什么优点呢?

简单来说,数组的优点是:我们可以通过数组的下标快速定位到该位置下的数值,获取这个数值是非常非常的快, O(1)级别的时间复杂度。而哈希表的出现,就很好的解决了这个问题。

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


三、哈希表

1、百度百科

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

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


2、问题引用

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

假如周末到了,你要去图书馆借一本书《活着》,图书馆的管理员管理书籍很随意,是按照数组的方式来放书的,就像下图一样。而恰巧你要的《活着》是在最后一个位置,管理员从头开始找,你是不是要等好久好久?

最后你等的不耐烦了,就举报这个管理员,图书馆的老板把这个管理员给解雇了,来了一个新的管理员,她很聪明,她通过一种方式把每种书籍都编上一个号,并记录下来。你向她借《活着》,她通过“一种方式”一计算,哦,是在下标为6的位置,就直接走过去,给你拿了过来。你很满意,老板也很满意,给她升职加薪~


3、哈希函数

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

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

4、哈希表结构

前面说了数组和哈希函数,就引出了我们的哈希表结构:

我们输入一个值,通过哈希函数计算后 % 上数组的长度,就可以让值放入数组中,所以当我们使用哈希表结构的时候,它的时间复杂度在理想状态下是O(1),接下来给大家举例分析一下:


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;}
}

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

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

  1. 数据结构学习笔记(七):哈希表(Hash Table)

    目录 1 哈希表的含义与结构特点 1.1 哈希(Hash)即无序 1.2 从数组看哈希表的结构特点 2 哈希函数(Hash Function)与哈希冲突(Hash Collision) 2.1 哈希函 ...

  2. 高级数据结构与算法 | 哈希 :哈希冲突、负载因子、哈希函数、哈希表、哈希桶

    文章目录 哈希 哈希函数 常见的哈希函数 字符串哈希函数 哈希冲突 闭散列的解决方法 开散列的解决方法 负载因子以及增容 对于闭散列 对于开散列结构 具体实现 哈希表(闭散列) 插入 查找 删除 完整 ...

  3. 哈希表添加哈希表(Hash Table,也叫散列表),是根据键(Key)而直接访问在内存存储位置的数据结构。typedef enum{ HASH_OK, -icoding

    哈希表添加 哈希表(Hash Table,也叫散列表),是根据键(Key)而直接访问在内存存储位置的数据结构.也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加 ...

  4. e - 数据结构实验之查找五:平方之哈希表_leetcode算法之哈希表

    今天该来盘一盘 哈希表 这类题目 分类别解析leetcode上的一些相关的例题路,代码采用C++与python实现. 哈希表 哈希表是一种很有用的数据结构, 其作用主要是以空间换时间, 在c++中主要 ...

  5. e - 数据结构实验之查找五:平方之哈希表_面试中常被问到的Hash表,你了解吗

    #新人扶持计划# Hash表在面试中经常被问到,今天我们来了解下. Hash表也称散列表,也有直接译作哈希表,Hash表是一种特殊的数据结构,它同数组.链表以及二叉排序树等相比较有很明显的区别,它能够 ...

  6. 数据结构 5分钟带你搞定哈希表(建议收藏)!!!

    对比之前博客讨论的二叉排序树 二叉平衡树 红黑树,它们的查找都是先从根节点进行查找,从节点取出数据或索引与查找值进行比较.那么,有没有一种函数H,根据这个函数和查找关键字key,可以直接确定查找值所在 ...

  7. 数据结构学习笔记 哈希表(一) 哈希表基础与哈希函数

    ------HR:The first question is what you do if you have a conflict with your manager ? ------You:Hash ...

  8. 数据结构-链表、队列、栈、哈希表

    数据结构指的是任意长度.类型的数据对应的字节在内存中的存放结构.内存存储单元的最小单位是Byte,内存物理上是连续的.无差别的.但是软件可以通过不一样的使用方式来填充.操作内存.例如数组中,数据是顺序 ...

  9. 【夜深人静写数据结构与算法 | 第八篇】哈希算法与哈希表

    目录 前言: 哈希: 哈希表: 哈希表组成: 哈希表实例: 哈希函数: TIPS: 总结 前言: 如果此时我要你默写一个有一百位的数字,你要如何做才能保证不会漏写呢?我们有一种方法很好用:直接数我们写 ...

最新文章

  1. Apache下的ArrayUtils工具类总结
  2. matplotlib 横坐标只显示整数_matplotlib初学:这样画折线图和添加标注、箭头
  3. zynqpl端时钟_第十二章 ZYNQ-MIZ702 PS读写PL端BRAM
  4. 应用商店后台MIS的一些思考
  5. Netty 5用户指南
  6. 白领体检异常率连年走高,这5本书教你怎样科学养生
  7. 再见了!微软宣布停止服务支持:一代经典系统退出舞台
  8. mybatis association 问题
  9. android 粘性view_android - 如何在RecyclerView中制作粘性标头? (有或没有外部库) - SO中文参考 - www.soinside.com...
  10. is内存地址 id 地址比较 小数据池概念
  11. curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused
  12. java textarea滚动条_Java Swing TextArea 滚动条和获得焦点
  13. CCS以及DSP入门帖
  14. 2019最新java自学路线
  15. 【原创】JS文件替换神器--Chrome ReRes插件
  16. solidworks模板文件_教你如何快速制作工程图模板
  17. win7虚拟机iOS坑爹法语键盘冲突解决方法
  18. sue的小球 牛客(区间dp)
  19. nginx容器通过docker内置DNS实现动态负载
  20. 硬件接口之audio接口

热门文章

  1. 第3-7课:推箱子游戏
  2. choice python接口,数据可视化环境(Python接口)配置
  3. 为金融场景而生的数据类型:Numeric
  4. 啊哈,终于知道了怎么获取网站的logo
  5. CSCD库期刊查询方法
  6. 百度搜索引擎排名规则
  7. 讲解如何为AD 添加多个UPN后缀
  8. 文档在线预览(二)-使用JODConverter转换文档为PDF
  9. Android通话接通监听
  10. APENFT FOUNDATION官宣2022艺术梦想基金主题征集