复习HashMap-3

一.哈希表(散列)

1.什么是哈希表

根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

给定表M,存在函数H(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数H(key)为哈希(Hash)函数。

2.什么是哈希冲突(面试题)

根据一定的规则放进存放哈希值的数组中,然后下标为1的数组已经有值了,后面根据规则,判定某个数也需要放到下标为1的数组中,这样就导致了只有一个位置两个人都要坐,就引起了冲突。(不同的key值产生的H(key)是一样的)。

3.解决哈希冲突的方法(面试题)

(1) 开放地址法

插入一个元素的时候,先通过哈希函数进行判断,若是发生哈希冲突,就以当前地址为基准,根据再寻址的方法(探查序列),去寻找下一个地址,若发生冲突再去寻找,直至找到一个为空的地址为止。所以这种方法又称为再散列法。

Hi=(H(key)+di)%m //开放地址法计算下标公式
Hi:下标(储存的地址)
H(key):哈希函数(计算哈希值)
di:增量
%:取模
m:哈希表的长度

探查方法如下

① 线性探查

di=1,2,3,…m-1;冲突发生时,顺序查看表中下一单元,直到找出一个空单元或查遍全表。

②二次探查

di=1^2, -1^2, 2^2, -2^2 …k^2, -k^2,(k<=m/2); 冲突发生时,在表的左右进行跳跃式探测,比较灵活。

③随机探查

di=伪随机数序列;冲突发生时,建立一个伪随机数发生器(如i=(i+p) % m),p是质数(在m范围取得质数),生成一个伪随机序列,并给定一个随机数做起点,每次加上伪随机数++就行。

为了更好的理解,我们举一个例子

设哈希表长为14,哈希函数为H(key)=key%11。表中现有数据15、38、61和84,其余位置为空,如果用二次探测再散列处理冲突,则49的位置是?使用线性探测法位置是?解:因为H(key)=key%11
所以15的位置 = 15 % 11=4; 38的位置 = 38 % 11=5; 61的位置 = 61 % 11=6; 84的位置 = 84 % 11=7;(证明哈希表4,5,6,7已经有元素)因为计算下标的公式为:Hi=(H(key)+di)mod%m
使用二次探测法
H(1) = (49%11 + 1^1) = 6;冲突      
H(-1) = (49%11 + (-1^2)) = 4;冲突   注意 -1^2 = -1; (-1)^2 = 1;
H(2) = (49%11 + 2^2) = 9;不冲突
二次探测法49的位置就是哈希表的9。使用线性探测
H(1) = (49%11 + 1) = 6;冲突
H(2) = (49%11 + 2) = 7;冲突
H(3) = (49%11 + 3) = 8;不冲突
线性探测法49的位置就是哈希表的8。

(2) 再哈希法

再哈希法又叫双哈希法,有多个不同的Hash函数,当发生冲突时,使用第二个,第三个,….,等哈希函数计算地址,直到无冲突。虽然不易发生聚集,但是增加了计算时间。

(3) 链地址法

每个哈希表节点都有一个next指针,多个哈希表节点可以用next指针构成一个单向链表,被分配到同一个索引上的多个节点可以用这个单向链表连接起来。

(4)建立公共溢出区

将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表。

二.HashMap

1.HashMap的hash()算法(面试)

回答:减少哈希冲突

	//源码:计算哈希值的方法 H(key)static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);}   //^ (异或运算) 相同的二进制数位上,数字相同,结果为0,不同为1。  举例如下:0 ^ 0 = 00 ^ 1 = 11 ^ 1 = 01 ^ 0 = 1// &(与运算)  相同的二进制数位上,都是1的时候,结果为1,否则为零。 举例如下:0 & 0 = 00 & 1 = 01 & 0 = 01 & 1 = 1

h = key.hashCode() ^ (h >>> 16)意思是先获得key哈希值h,然后 h 和 h右移十六位 做异或运算,运算结果再和 数组长度 - 1 进行 运算,计算出储存下标的位置。具体原理如下:

综下所述 储存下标 = 哈希值 & 数组长度 - 1//jdk1.7中计算数组下标的HashMap源码
static int indexFor(int h, int length) {//计算储存元素的数组下标return h & (length-1);
}//jdk1.8中去掉了indexFor()函数,改为如下
i = (n - 1) & hash //i就是元素存储的数组下标 

某个key的哈希值为 :1111 1111 1110 1111 0101 0101 0111 0101,数组初始长度也是16,如果没有 ^ h >>> 16,计算下标如下

          1111 1111 1110 1111 0101 0101 0111 0101  //h = hashcode()&  0000 0000 0000 0000 0000 0000 0000 1111  //数组长度 - 1 = 15 (15的二进制就是 1111)------------------------------------------0000 0000 0000 0000 0000 0000 0000 0101  //key的储存下标为5由上面可知,只相当于取了后面几位进行运算,所以哈希冲突的可能大大增加。

以上条件不变,加上 异或h >>> 16,之后在进行下标计算

          1111 1111 1110 1111 0101 0101 0111 0101  //h = hashcode()^  0000 0000 0000 0000 1111 1111 1110 1111  //h >>> 16------------------------------------------1111 1111 1110 1111 1010 1010 1001 1010  //h = key.hashCode() ^ (h >>> 16) &   0000 0000 0000 0000 0000 0000 0000 1111  //数组长度 - 1 = 15 (15的二进制就是 1111)------------------------------------------0000 0000 0000 0000 0000 0000 0000 1010  //key的存储下标为10重要:由上可知,因为哈希值得高16位和低16位进行异或运算,混合之后的哈希值,低位也可能掺杂了高位的一部分特性(就是变化性增加了),这样就减少了哈希冲突。

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

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

相关文章

园区电能监测系统

园区电能监测系统是一种能够对园区内电能使用情况进行实时监测和管理的系统&#xff0c;可以帮助企业更好地控制能源消耗&#xff0c;提高能源利用效率&#xff0c;从而降低能源成本&#xff0c;对于推进节能减排和可持续发展具有重要意义。 园区电能监测系统通常由多个子系统组…

【python opencv】如何获取一个图片区域的亮度

要获取一个图片区域的亮度&#xff0c;你可以使用以下代码&#xff1a; import cv2 import numpy as npdef get_image_region_brightness(image, x, y, w, h):region image[y:yh, x:xw]gray cv2.cvtColor(region, cv2.COLOR_BGR2GRAY)brightness np.mean(gray)return brigh…

css学习知识总结

一、css与html连接&#xff1a; 可以将css语句放在html内部&#xff0c;一般放在<head>之下&#xff0c;定义在<style>中&#xff0c;格式一般是一个“.”然后加上一个“名称”再加上一个“{}”&#xff0c;再在“{}”内部定义具体的语句。 二、调整元素 2.1 字体…

LiveData使用和原理

LiveData使用和原理 本文链接&#xff1a;https://blog.csdn.net/feather_wch/article/details/131797422 文章目录 LiveData使用和原理LiveData使用Transformations LiveData相关类原理粘性事件数据倒灌 问题思考设计模式 要点&#xff1a; 注册监听事件分发生命周期感知粘性…

【springboot】RestTemplate的使用、格式转换、异常处理、拦截器,

RestTemplate提供了一个基于Http客户端库&#xff08;HttpClient&#xff0c;OkHttp等&#xff09;的高层次API&#xff0c;并不是重复制造轮子。 RestTemplate提供了常见的REST请求方案的模版&#xff0c;例如GET请求、POST请求、PUT请求、DELETE请求以及一些通用的请求执行方…

整数拆分(力扣)动态规划 JAVA

给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。 示例 2: 输入: n 10 输出: 36 解释: 10 3 3 4…

Python应用实例(二)数据可视化(二)

数据可视化&#xff08;二&#xff09; 1.随机漫步1.1 创建RandomWalk类1.2 选择方向1.3 绘制随机漫步图1.4 模拟多次随机漫步1.5 设置随机漫步图的样式 1.随机漫步 使用Python来生成随机漫步数据&#xff0c;再使用Matplotlib以引人瞩目的方式将这些数据呈现出来。随机漫步是…

使用 YOLOv8 和 Streamlit 构建实时对象检测和跟踪应用程序:第 1 部分-介绍和设置

示例:图像上的对象检测 介绍 实时视频中的目标检测和跟踪是计算机视觉的一个重要领域,在监控、汽车和机器人等各个领域都有广泛的应用。 由于需要能够识别和跟踪对象、确定其位置并对它们进行实时分类的自动化系统,对视频帧中的实时对象检测和跟踪的需求日益增加。 在这…

MinIO:开源对象存储解决方案

MinIO是一款开源的云原生对象存储解决方案&#xff0c;旨在提供高性能、可扩展和持久化存储服务。它兼容Amazon S3 API&#xff0c;可以轻松地集成到现有的应用程序中&#xff0c;为用户提供可靠的对象存储和数据管理。本文将介绍MinIO的基本概念、架构设计以及常见的应用场景&…

Java反射

Java中的字节码&#xff1a;Java源代码经过虚拟机编译器编译后产生的文件&#xff08;即扩展为.class的文件&#xff09;&#xff0c;它不面向任何特定的处理器&#xff0c;只面向虚拟机。 1.反射的定义 反射机制 JAVA反射机制是在运行状态中&#xff0c;对于任意一个类&…

GitUI汉化

1.下载汉化文件 下载地址 备用下载地址 https://files.cnblogs.com/files/chenghu/git-gui-zh-master.zip https://files.cnblogs.com/files/chenghu/git-gui-zh-master.zip 2.找到git安装路径 C:\Program Files\Git\mingw64\share\git-gui\lib 3.解压出1下载的文件 复制粘…

VM(CentOS7安装和Linux连接工具以及换源)

目录 一、Linux意义 二、安装VMWare 三、centos7安装 1、正式安装CentOS7&#xff1a; 2、安装不了的解决方案 2.1常见问题——虚拟机开机就黑屏的完美解决办法 3、查看、设置IP地址 ① 查看ip地址&#xff1a;ip addr 或者 ifconfig&#xff0c; 注意与windows环境的区别…

了解区块链---一个去中心化技术

1.假如你是从事区块链的高端技术人员&#xff0c;我从来没有接触过区块链&#xff0c;请你为我讲解下他的概率、原理、应用&#xff1f; 概念&#xff1a; 区块链是一种去中心化的分布式账本技术&#xff0c;它是由一系列区块组成的链式结构&#xff0c;每个区块包含一些交易数…

宋浩线性代数笔记(一)行列式的计算

本帖更新b站宋浩老师的线代网课笔记&#xff0c;内容较为细致详细&#xff0c;参考书用的是科学出版社的第三版&#xff0c;之后会附加同济出版社第六版的教材内容。 &#xff08;字不好看大家将就看吧QAQ&#xff09;

当DevOps遇到AI,黑马迎来3.0时代丨IDCF

随着GhatGPT的爆火&#xff0c;人工智能和研发效能&#xff0c;无疑成为了2023的两个最重要的关键词。大规模语言模型LLM和相关应用的快速发展正在对研发团队的工作方式产生深远影响&#xff0c;这几乎象征着新的生产力革命的到来。 那么&#xff0c;作为一名工程师&#xff0…

java密码强度校验

一、代码 Testpublic void test(){//包含数字、大小写字母&#xff0c;长度10-20位 String regular "^(?.*\\d)(?.*[a-z])(?.*[A-Z]).{10,20}$";String example1 "1234567891";System.out.println(example1.matches(regular)); //falseString exa…

React(2)

题外话&#xff1a;vscode有个插件可以很方便的快速写代码 输入rcc回车 1.组件嵌套 import React, { Component } from reactclass Navbar extends Component{render(){return <div>Navbar</div>} }const Swiper()>{return <div>Swiper</div> }cons…

数据库信息速递 MONGODB 6.0 的新特性,更多的查询函数,加密查询,与时序数据集合 (译)...

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到3群&#xff08;共…

linux安装redis

背景 项目需要 安装redis&#xff0c;不使用root用户,假设使用redis用户。 root准备 安装依赖 yum install gcc安装目录 mkdir /usr/local/redis授权安装目录 注意&#xff0c;先要新建用户 chown -R redis:redis /usr/local/redis 安装 切换用户 下载 下载包地址 h…

Spring实现文件上传,文件上传

第一步&#xff1a;创建jsp文件 创建form表单 提交文件是post 文件上传的表单 服务端能不能获得数据&#xff0c;能 实现单文件上传的步骤&#xff1a; 导入相应的坐标&#xff1a;在pom.xml文件中进行导入 再导入这份&#xff1a; 第二步&#xff0c;在spring-MVC的上传中去配…