【数据结构基础】【散列表】

散列表也叫做哈希表(hash table),这种数据结构提供了键(key)和值(value)的映射关系。只要给出一个key,就可以高效查找它匹配的value,时间复杂度接近O(1);

哈希函数

哈希函数通过某种方式,把key和数组下标进行转换。
在java中,每个对象都有属于自己的hashcode,这个hashcode是区分不同对象的重要标识。无论对象自身的类型是什么,他们的hashcode都是一个整型变量。
最简单的转化方式是按照数组长度进行取模运算:

index = HashCode(Key)%Array.length

JDK中的哈希函数并没有直接采取取模运算,而是利用位运算的方式来优化性能。
通过哈希函数,我们可以把字符串或其他类型的Key,转化成数组的下标index
例如长度为8的数组

key = 001121,
index = HashCode(“001121”)%Array.length=1420036703%8=7

散列表的读写扩容操作

1、写操作:在散列表中插入新的键值对
例如调用:

hashMap.put("002931","王五");

具体实现方式:
1、通过哈希函数,将key转换成数组下标,例如5
2、如果数组小标5对应的位置没有元素,就把这个键值对填充到数组下标为5的位置
但是,由于数组的长度是有限的,当插入的键值对越来越多,不同的key通过哈希函数获得的下标可能是相同的
这种情况叫做哈希冲突
例如:

002936的对应数组下标为2,;
002947的对应数组下标也是2;

哈希冲突是无法避免的。解决哈希冲突的方法:
1、开放寻址法
例如:第6组键值对通过哈希函数得到下标2,该下标在数组中已经有了其他元素,那么就向后移动1位,观察数组下标3是否有空
如果下标3也被占用,那么就再向后移动,直到找到空的位置。
(寻址的方式有很多,并不一定只是简单地寻找当前元素的后一个元素,这里只是简单举例)
2、链表法
HashMap数组的每个元素不仅是一个键值对对象,还是一个链表的头结点。每一个键值对对象通过next指针指向它的下一个键值对结点。当新来的键值对映射到与之冲突的数组位置时,只需要插入对应的链表中即可:
如下图:
在这里插入图片描述
2、读操作:通过给定的key,在散列表中查找对应的value
例如:调用函数hashMap.get(“002936”)
具体步骤:(以链表法为例)
1、通过哈希函数,将key转换成数组下标,例如2
2、找到数组下标2对应的元素,如果这个元素的key是002936,那么就找到了
如果这个key不是002936,由于数组的每个元素都与一个链表对应,我们可以顺着链表慢慢往下找,看看能否找到与key相匹配的结点

3、扩容操作:
当经过多次元素插入,散列表达到一定的饱和度时,key映射位置发生冲突的概率会逐渐提高。这样一来,大量元素拥挤在相同的数组下标位置形成很长的链表,对后续的插入和查询操作都会有很大影响。
此时就需要进行扩容:
影响扩容的因素:
1、HashMap当前长度
2、HashMap的负载因子,默认值为0.75f(在JDK中)
衡量HashMap需要进行扩容的操作如下:

HashMap.Size>=Capacity x LoadFactor

扩容具体步骤:
1、扩容,创建一个新的键值对空数组,长度是原数组的两倍
2、重新Hash,遍历原来的键值对数组,把所有的键值对重新Hash到新数组中(因为数组长度变化后,hash的规则也发生变化了)
经过扩容后,散列表重新变得稀疏。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378121.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VisualStudio运行C++项目检测include<stdio.h>报错解决方案

一、项目—>属性 二、将SDL检查更改为否即可

信息设计中的“父子关系”

交互设计工作核心在于信息架构和交互细节设计。信息架构包括信息分类以及信息展示逻辑设计;交互细节则多表现为控件的选择,交互效果的定义等。在信息设计中,遇到最棘手的问题就是信息量太多而显得设计结果不尽人意,那么在砍不掉需…

[Object-oriented] : 控制反转

前言 : 参加点部落的活动,关于IoC(控制反转)大家有很多的讨论。本文排除对象生成的部份,单纯解释IoC为甚么叫做控制反转。本篇文章以之前写的 [Object-oriented] : 重用内容来举例。 未IoC之前的对象图 : 很明显的左边的组件A,相依右边的组件…

二、规则组织数学模型的建立

一、规则组织数学模型的建立 规则组织满足两个不变:1,组织点运动规律不变、2,飞数不变的单系统组织 即:若知道组织点运动规律和飞数即可确定唯一一个组织。 3上2下,组织循环数为325,经纱循环数纬纱循环数…

LeetCode 3:无重复字符的最长子串 思考分析

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”&#x…

美国人看见的是友情,中国人看见的是忠诚

美国人看见的是友情,中国人看见的是忠诚 这是一个人狗情未了的感人事件。 一个即将死去的人,总有未了的心愿难以割舍,来自美国的凯文麦克莱恩实现了他的临终愿望,而他的最后愿望就是与自己的爱犬见上最后一面。 现年57岁的凯文麦克…

PyCharm安装及配置

一、下载PyCharm和相关工具 qoi8 二、安装PyCharm 先不要运行PyCharm 三、将jar包放到PyCharm安装目录的bin文件夹下 三、找到pycharm64.exe.vmoptions和pycharm.exe.vmoptions配置文件 四、编辑这两个文件,在这两个文件最后一行加入下载好的jar包文件路径 -ja…

LeetCode 239:滑动窗口最大值 思考分析

给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 进阶: 你能在线性时间复杂度内解决此题吗? 示例: 输入: num…

计算机论文范文1500,电子商务毕业论文范文1500字

电子商务毕业论文范文1500字时间稍纵即逝,充满意义的大学生活即将结束,毕业前要通过最后的毕业论文,毕业论文是一种有计划的检验学生学习成果的形式,那么问题来了,毕业论文应该怎么写?下面是小编为大家整理…

五、规则组织的衍生组织——纬山形组织数学模型的建立

基础概念公式推到可参考该专栏下的前几篇博文。 纬山形组织图: 观察可知:纬山形组织图下半部分是右斜组织,上半部分是左斜组织。右斜和左斜按照垂直方向进行排列。 该图是一个2上3下2上1下(从最下面一行从左往右观看) 特点:每一…

剑指 Offer 57 - II. 和为s的连续正数序列 思考分析

输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。 序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。 示例 1: 输入:target 9 输出:[[2,3,4],[4…

六、规则组织的衍生组织——纬向破斜组织数学模型的建立

基础概念公式推到可参考该专栏下的前几篇博文。 纬向破斜组织图: 下半部分(从左往右):,3上2下2上1下,右斜,飞数为1 上半部分(从下往上):,2上2下1上3下。左斜,飞数为-1 通过分析可…

数据结构与算法2——数组

数组是应用最广泛的数据存储结构。它被植入到大部分编程语言中。大部分数据结构都有最基本的四个操作:插入、删除、查找、修改。对于这四种操作每一种数据结构都有相应的算法。算法和数据结构因此就是非常紧密的相联系的。 1 数组例子 …

LeetCode 167. 两数之和 II - 输入有序数组 思考分析

目录1、暴力,超时2、双指针滑动窗口条件限制 AC3、观看题解(吸取他人经验)1、二分查找2、双指针3、双指针二分查找给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。 函数应该返回这两个下标值 index1 …

敏捷开发用户故事系列之七:用户故事与MVC

这是用户故事系列的第七篇。(之一,之二,之三,之四,之五,之六,之七,之八,之九)用户故事和MVC没有关系,因为MVC是实现方法,因此在思考用…

七、规则组织的衍生组织——菱形斜纹组织数学模型的建立

基础概念公式推到可参考该专栏下的前几篇博文。 菱形斜纹组织图: 分析:首先3上2下2上1下,飞数为1,右斜。kw8表示从左下角开始往上数8格为纬峰所在位置;kj8表示从左上角开始往右数8格为经峰所在位置。 这样就将菱形斜…

显卡测试软件毛毛虫,超龙超龙,与众不同,顶流配备,散热一流,3070Ti超龙旗舰版评测...

可能大家都没想到此次显卡荒会持续近一年,还是出现国家级干涉才将这股“歪风”刹住了。而且也仅仅算是刹住了大陆的速度,主要踩死刹车的应该就是黄大厨。他从5月初推出的新核心就采取了出厂即锁算力的做法,但是即便如此,那些看着高…

八、非规则组织分析及其数学模型——平纹变化组织

非规则组织顾名思义,无法通过一个数学模型来描述所有的非规则组织、对于每一个具体的非规则组织而言,其也有一定的规律性可循,即可通过分析每一个具体的非规则组织的组织点运动规律来建立相应的数学模型。 一、平纹变化组织 平纹变化组织即…

怎么看xp计算机是32位还是64位,教你查看XP系统的不同32位还是64位详细的步骤

电脑中使用的不同的版本如果安装一些大型的游戏的时候都是有技巧来实现的,那在XP电脑中想要知道的对于不同的32位还是64位的版本的文件操作的时候新手是怎么知道自己安装的软件的版本呢,今天小编就来跟大家分享一下教你查看XP系统的不同32位还是64位详细…

LeetCode 27.移除元素 思考分析

题目 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长…