【数据结构】什么是哈希表?为什么哈希表的查询时间复杂度是O(1)?
大家好,我是卷心菜,可以叫我菜菜,大二学生一枚。本篇主要讲解一种数据结构:哈希表。如果您看完文章有所收获,可以三连支持博主哦~,嘻嘻。
文章目录
- 一、前言
- 二、数组
- 三、哈希表
- 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)?相关推荐
- 数据结构学习笔记(七):哈希表(Hash Table)
目录 1 哈希表的含义与结构特点 1.1 哈希(Hash)即无序 1.2 从数组看哈希表的结构特点 2 哈希函数(Hash Function)与哈希冲突(Hash Collision) 2.1 哈希函 ...
- 高级数据结构与算法 | 哈希 :哈希冲突、负载因子、哈希函数、哈希表、哈希桶
文章目录 哈希 哈希函数 常见的哈希函数 字符串哈希函数 哈希冲突 闭散列的解决方法 开散列的解决方法 负载因子以及增容 对于闭散列 对于开散列结构 具体实现 哈希表(闭散列) 插入 查找 删除 完整 ...
- 哈希表添加哈希表(Hash Table,也叫散列表),是根据键(Key)而直接访问在内存存储位置的数据结构。typedef enum{ HASH_OK, -icoding
哈希表添加 哈希表(Hash Table,也叫散列表),是根据键(Key)而直接访问在内存存储位置的数据结构.也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加 ...
- e - 数据结构实验之查找五:平方之哈希表_leetcode算法之哈希表
今天该来盘一盘 哈希表 这类题目 分类别解析leetcode上的一些相关的例题路,代码采用C++与python实现. 哈希表 哈希表是一种很有用的数据结构, 其作用主要是以空间换时间, 在c++中主要 ...
- e - 数据结构实验之查找五:平方之哈希表_面试中常被问到的Hash表,你了解吗
#新人扶持计划# Hash表在面试中经常被问到,今天我们来了解下. Hash表也称散列表,也有直接译作哈希表,Hash表是一种特殊的数据结构,它同数组.链表以及二叉排序树等相比较有很明显的区别,它能够 ...
- 数据结构 5分钟带你搞定哈希表(建议收藏)!!!
对比之前博客讨论的二叉排序树 二叉平衡树 红黑树,它们的查找都是先从根节点进行查找,从节点取出数据或索引与查找值进行比较.那么,有没有一种函数H,根据这个函数和查找关键字key,可以直接确定查找值所在 ...
- 数据结构学习笔记 哈希表(一) 哈希表基础与哈希函数
------HR:The first question is what you do if you have a conflict with your manager ? ------You:Hash ...
- 数据结构-链表、队列、栈、哈希表
数据结构指的是任意长度.类型的数据对应的字节在内存中的存放结构.内存存储单元的最小单位是Byte,内存物理上是连续的.无差别的.但是软件可以通过不一样的使用方式来填充.操作内存.例如数组中,数据是顺序 ...
- 【夜深人静写数据结构与算法 | 第八篇】哈希算法与哈希表
目录 前言: 哈希: 哈希表: 哈希表组成: 哈希表实例: 哈希函数: TIPS: 总结 前言: 如果此时我要你默写一个有一百位的数字,你要如何做才能保证不会漏写呢?我们有一种方法很好用:直接数我们写 ...
最新文章
- Apache下的ArrayUtils工具类总结
- matplotlib 横坐标只显示整数_matplotlib初学:这样画折线图和添加标注、箭头
- zynqpl端时钟_第十二章 ZYNQ-MIZ702 PS读写PL端BRAM
- 应用商店后台MIS的一些思考
- Netty 5用户指南
- 白领体检异常率连年走高,这5本书教你怎样科学养生
- 再见了!微软宣布停止服务支持:一代经典系统退出舞台
- mybatis association 问题
- android 粘性view_android - 如何在RecyclerView中制作粘性标头? (有或没有外部库) - SO中文参考 - www.soinside.com...
- is内存地址 id 地址比较 小数据池概念
- curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused
- java textarea滚动条_Java Swing TextArea 滚动条和获得焦点
- CCS以及DSP入门帖
- 2019最新java自学路线
- 【原创】JS文件替换神器--Chrome ReRes插件
- solidworks模板文件_教你如何快速制作工程图模板
- win7虚拟机iOS坑爹法语键盘冲突解决方法
- sue的小球 牛客(区间dp)
- nginx容器通过docker内置DNS实现动态负载
- 硬件接口之audio接口