哈希表数据结构_Java数据结构哈希表如何避免冲突

前言

一、哈希表是what?

这是百度上给出的回答:6ccd58124cab5b2bd29972f2741826da.png8fe391260b3d492e1d4ff57243362494.png
简而言之,为什么要有这种数据结构呢?
因为我们想不经过任何比较,一次从表中得到想要搜索的元素。所以就构造出来了哈希表,通过某种函数(哈希函数)使元素的存储位置与它的关键码之间能够建立一一映射的关系,方便我们在查找的时候可以更加快速的查找出来我们想要查找的元素。
在下面的代码演示中,底层就使用了哈希表,使得每一个字母与其在字符串中出现的次数是一一对应的关系;

public static void main(String[] args) {
String s="huddiolabcsjddddop";
int[] count=new int[26];
for(char ch:s.toCharArray()){
int idx=ch-'a';
count[idx]++;
}
System.out.println(Arrays.toString(count));

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

二、什么是哈希冲突

1.为什么会出现哈希冲突

对于两个数据元素的关键字Ki和Kj(i!=j),但是存在:Hash(Ki)==Hash(Kj),即:不同的关键字通过哈希函数计算出相同的哈希地址,这种现象就成为哈希冲突或哈希碰撞。

2.哈希冲突能否避免

首先,我们需要明确一点,由于我们哈希表底层数组的容量往往小于实际上要存储的关键字的数量,(就是我们往往存储的元素的范围不确定的时候,可能会出现有多个元素的哈希地址是相同的),这就造成了哈希冲突是不可避免的,所以我们能做的就是尽量降低冲突率。

三、如何解决哈希冲突

1.线性探测

比如给定一个数组,int[] array={4,5,6,9,1,7,44}
其插入操作:1.通过哈希函数获取待插入元素在哈希表中的位置
2.如果该位置没有元素则直接进行插入,如果该位置有元素,则使用线性探测法找到下一个空位置进行插入。001d692b1052446d0ef496d6eeb7bdcd.png

2.拉链法

100afd6bffdb3f2055f23ebcf1cb6819.png拉链法,可以认为把一个大的集合中的搜索问题转化为小集合中的搜索问题。

总结

线性探测法的的效率问题:4e75ae5569183c13889161be72e2ab79.png

1.对于所有在哈希表中的元素做查找,平均比较次数是多少?
(1+1+1+1+1+5+1)/7=1.57

2.对于所有不在哈希表中的元素做查找,平均比较次数是多少?
(对每一个下标来判断是否是连续的)
(1+2+1+1+7+6+5+4+3+2)/10=3.2.

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

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

相关文章

Python 高级网络操作 - Python Advanced Network Operations

1 Python 高级网络操作 - Python Advanced Network Operations2 3 Half Open Socket,4 一个单向的 socket 被称为 half open socket, 即数据只能在一个方向上传输.5 Half Open Socket 是通过在 socket 对象上调用 shutdown() 方法得到.6 shutdown 接收一个 numeric…

java getattribute为空_Java TransMeta.getAttribute方法代码示例

import org.pentaho.di.trans.TransMeta; //导入方法依赖的package包/类Overridepublic void getData( TransMeta transMeta ) throws KettleException {try {String serviceName transMeta.getAttribute( StreamingConst.STREAMING_GROUP, StreamingConst.STREAMING_SERVICE_…

python summary writer_tensorflow中summary操作

tf中 tensorboard 工具通过读取在网络训练过程中保存到本地的日志文件实现数据可视化,日志数据保存主要用到 tf.summary 中的方法。tf.summary中summary是tf中的一个py文件,位置在 /tensorflow/python/summary/ 文件夹下,提供了像tf.summary.…

10 3 java_10.3 UiPath如何调用Java

调用Java方法(Invoke Java Method)的介绍从Java Scope中的.jar加载的方法中调用指定的Java方法。并结果存储在变量中二、Invoke Java Method 在UiPath中的使用打开设计器, 在设计库中新建一个Sequence,为序列命名及设置Sequence存放的路径, 在Activities中搜索Java …

物联网python教程慕课_物联网技术(校慕课资源,物联网组)-中国大学mooc-题库零氪...

3. 智慧社区的部署3.1 IIS服务器安装随堂测验1、在安装IIS信息服务器时,我们应打开电脑控制面板中的哪个设置( )A、管理工具B、程序与功能C、Windows 防火墙D、操作中心2、在安装IIS服务器时,在widows功能下需要勾选以下哪几项 ?( )A、Intern…

台达伺服电机选型手册_机械加工工艺师手册_打包下载

如何【设为星标★】,优先推送资料信息?Ta们都在看咱们:机械大佬群注意及时保存和下载,资料若失效请拉到本页底部留言,我们将不定时补发!免责声明:该资料系网络转载,版权归原作者所有…

java zar_唬人的Java泛型并不难

泛型public interfaceFoo {}public interfaceBar {}public interfaceZar> {}上面的代码有什么区别?泛型初探1、为何引入泛型?Java 泛型也是一种语法糖,使用泛型可以在代码编译阶段完成类型的转换,避免代码在运行时强制转换而出…

团队作业7——Beta版本冲刺计划及安排

需要改进的工具流程(如版本控制、测试工具等) 首先把之前项目的BUG进行修复 然后完成如下的功能 冲刺的时间计划安排 (冲刺时间为期七天,安排在2017.12.4——2017.12.10之间) 组员任务陈福鹏实现博客.多语言、倒计…

开发黑名单功能demo_中台实践:通用化黑名单平台

业务中台的价值主要体现在对通用化业务能力的沉淀、整合,通过对可复用业务流程和业务功能的设计,向不同业务方提供标准化且可扩展的服务能力。本文来聊一聊笔者工作过程中设计的通用化黑名单平台,通过将用户管控能力的下沉,为各业…

java注解教程 pdf_Java注解详解

在使用SpringBoot作为Web敏捷开发的框架之后,SpringBoot除了自动装配配置的便捷之外,在很多时候需要基于注解来开发。注解不仅增加了代码的可读性,还增加了开发的速度。这篇文章主要讲述Java 注解。元注解元注解用于注解其他注解的。Java 5.0…

●BZOJ 1855 [Scoi2010]股票交易

题链: http://www.lydsy.com/JudgeOnline/problem.php?id1855 题解: DP,单调队列优化。(好久没做 DP题,居然还意外地想出来了) 定义 dp[i][k] 表示前 i天,手上还有 k股的最大收益。(注意这个定…

java无权图求最短路径_求有权图和无权图的最短路径

无权图的最短路径思路:无权图的最短路径也就是要求两点之间最少几跳可达,那么我们可以这样,用广度遍历,从起点开始一层层遍历,如果第一次遍历到终点,那么肯定是最短路径。public static void findPath(int …

无限级分类及生成json数据

第一步,先去数据库查询类别数据,然后交给生成json数据的函数处理,代码如下: 1 /*生成类别JSON数据*/ 2 public function wirteJson(){ 3 $dataInfo \think\Db::query("select id as v,name as n,pid from think_pro_category"); 4 $data $this…

python游戏图像识别_利用python做图像识别

Python验证码识别处理实例(转)一、准备工作与代码实例1、PIL、pytesser、tesseract(1)安装PIL:下载地址:http://www.pythonware.com/products/pil/(CSDN下载)下载后是一个exe,直接双击安装,它会自动安装到C:\Python27\Lib\site-pa…

Java旅游动吧项目讲解_springboot动吧项目

架构分析页面流程业务分析:客户端向服务端发送一个请求,发向了Tomcat,如果Tomcat只有一个线程是不可能处理多个请求的,所以就需要一个多个线程的池资源,然后线程用I/O读取请求中的数据,然后服务器从http协议…

java并发-内存模型与volatile

JMM的关键技术点都是围绕着多线程的原子性、可见性和有序性来建立的。因此,我们首先必须了解这些概念 1,原子性 原子性是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰&#xf…

python glob函数_python glob 模块 map函数

昨晚有了点小想法,想写个小脚本。用到了 glob 模块 和 map 函数 觉得他们配合起来和不错的。#coding:utf8import globprint "glob.golb 方法返回 " , glob.glob(r"/var/log/*.log")a glob.iglob(r"/var/log/*.log")print &qu…

数据分析师免费课程网址

分享一些免费的课程以下课程免费,讲师都是领域的专家,需要提前报名,请注意开班的时间。Coursera.org:统计学。Coursera.org:机器学习。Coursera.org:数据分析的计算方法。Coursera.org:大数据。…

微信机器人红包java_微信机器人_奇迹蛋_java实现

【实例简介】参考了别人的一些微信开发方法,自己实现了一个简单的微信机器人,部署在百度云上,能够点歌,查询天气,调教对话。可关注微信公众号:奇迹蛋。实现说明:http://blog.csdn.net/elcarim/a…

python增量赋值是什么意思_关于python中的增量赋值的理解

增量赋值运算符 和 * 的表现取决于它们的第一个操作对象 操作首先会尝试调用对象的 __ iadd__方法,如果没有该方法,那么尝试调用__add__方法,所以 与 的区别实质是__iadd__ 与 __add__的区别,同理,* 操作首先会尝试调…