Java学习笔记(二十)——Java 散列表_算法内容
【前面的话】
周末,本来打算找人去玩,结果没找到,所以我只好有学习了。
为什么会学习散列表,因为要使用HashMap?因为在做项目的时候,在服务器和客户端需要传输DTO,而传输的属性是动态增加的,所以需要HashMap动态的添加一些属性到DTO类中去,所以学习一下。
【定义】
Hash表:是根据关键字而直接进行访问的数据结构,也就是说,散列表建立了关键字和存储地址之间的一种直接映射关系。
散列函数:一个把查找表中的关键字映射成该关键字对应的地址的函数,记为Hash(key)=Addr。
冲突:散列函数可能会把两个或两个以上的不同关键字映射到同一地址,称这种情况为“冲突”。
同义词:这些发生碰撞的不同关键字成为同义词。
【基础知识】
一. 常用的散列函数:
- 直接定址法——H(key)=a*key+b
- 除留余数法——H(key)=key%p
- 数字分析法
- 平方去中法
二. 处理冲突的方法
(一) 拉链法
拉链法是指把所有的同义词存储在一个线性链表中,这个链表由散列地址唯一标识。
关键字码为:{06,12,15,26,36,38,41,44,51,68},散列函数为H(key)=key%13。用拉链法处理冲突建立的表如下:

(二) 开放定址法
开放定址法是指可存放新表项的空闲地址即向它的同义词表项开发,又向它的非同义词表项开发。其数学递推公式为(Hi表示冲突发生后第i次探测的散列地址):
Hi=(H(key)+di)%m
其中,i=1,2,···,k(k<=m-1);m为散列表表长;di为增量序列。当取定某一增量序列后,则对应的处理方法是确定的。通常有:
1. 线性探测
di=1,2,···,m-1
特点:冲突发生时,顺序查看表中下一个单元,直到找到空单元为止。
2. 平方探测
di=12,-12,22,-22···,k2,-k2。K<=m/2
3. 再散列
【题】
- 设有一组关键字{9,1,23,14,55,20,84,27},采用散列函数H(key)=key mod 7,表长为10,用开放定址的二次探测再散列法Hi=(H(key)+di)%10(di=12,22,32,···)解决冲突。要求:对该关键字序列构造散列表,并计算查找成功的平均查找长度。
- 答案:
{9,1,23,14,55,20,84,27} mod 7={2,1,2,0,6,6,0,6}
|
关键字 |
计算 |
比较次数 |
|
9 |
H(9)=9%7=2(不冲突) |
1 |
|
1 |
H(1)=1%7=1(不冲突) |
1 |
|
23 |
H(23)=23%7=2(冲突),H1=(2+1)%10=3(不冲突) |
2 |
|
14 |
H(14)=14%7=0(不冲突) |
1 |
|
55 |
H(55)=55%7=6(不冲突) |
1 |
|
20 |
H(20)=20%7=6(冲突),H1=(6+1)%10=7(不冲突) |
2 |
|
84 |
H(84)=84%7=0(冲突),H1=(0+1)%10=1(冲突),H2=(0+22)%10=4(不冲突) |
3 |
|
27 |
H(27)=27%7=6(冲突),H1=(6+1)%10=7(冲突),H2=(6+22)%10=0(冲突),H3=(6+32)%10=5(不冲突) |
4 |
|
散列地址 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
|
关键字 |
14 |
1 |
9 |
23 |
84 |
27 |
55 |
20 |
||
|
探测长度 |
1 |
1 |
1 |
2 |
3 |
5 |
1 |
2 |
平均查找长度=(1+1+2+1+1+2+3+4)/8=15/8
【参考资料】
- 王道考研书籍
【后面的话】
加油。
——TT
Java学习笔记(二十)——Java 散列表_算法内容的更多相关文章
- Java学习笔记二十:Java中的内部类
Java中的内部类 一:什么是内部类: (1).什么是内部类呢? 内部类( Inner Class )就是定义在另外一个类里面的类.与之对应,包含内部类的类被称为外部类. (2).那为什么要将一个类定 ...
- Java学习笔记二十九:一个Java面向对象的小练习
一个Java面向对象的小练习 一:项目需求与解决思路: 学习了这么长时间的面向对象,我们只是对面向对象有了一个简单的认识,我们现在来做一个小练习,这个例子可以使大家更好的掌握面向对象的特性: 1.人类 ...
- Java学习笔记二十八:Java中的接口
Java中的接口 一:Java的接口: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承 ...
- Java学习笔记二十二:Java的方法重写
Java的方法重写 一:什么是方法的重写: 如果子类对继承父类的方法不满意,是可以重写父类继承的方法的,当调用方法时会优先调用子类的方法. 语法规则 返回值类型.方法名.参数类型及个数都要与父类继承的 ...
- Java学习笔记二十五:Java面向对象的三大特性之多态
Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...
- Java学习笔记二十四:Java中的Object类
Java中的Object类 一:什么是Object类: Object类是所有类的父类,相当于所有类的老祖宗,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类默认继承Object ...
- Java学习笔记二十六:Java多态中的引用类型转换
Java多态中的引用类型转换 引用类型转换: 1.向上类型转换(隐式/自动类型转换),是小类型到大类型的转换: 2.向下类型转换(强制类型转换),是大类型到小类型的转换: 3.instanceof运算 ...
- Java学习笔记二十一:Java面向对象的三大特性之继承
Java面向对象的三大特性之继承 一:继承的概念: 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方 ...
- Java学习笔记三十:Java小项目之租车系统
Java小项目之租车系统 一:项目背景介绍: 根据所学知识,编写一个控制台版的“呱呱租车系统” 功能: 1.展示所有可租车辆: 2.选择车型.租车量: 3.展示租车清单,包含:总金额.总载货量以及其车 ...
随机推荐
- jQuery Validate 表单验证插件----在class属性中添加校验规则进行简单的校验
一.下载插件包. 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW 访问密码 f224 二.jQuery表单验证插件----添加class属性形式的校验 <!DOCTY ...
- Ajax详解及其案例分析------如何获得Ajax对象,使用Ajax对象发送GET和POST请求,校验用户名,POST和GET请求时的乱码处理,实现级联的下拉列表
本节主要内容预览: 1 获得Ajax对象 2 使用Ajax对象发送GET请求 3 使用Ajax对象发送POST请求 4 使用Ajax校验用户名 5 POST请求时的乱码处理 6 GET请求时的乱码处理 ...
- Shell basic1
A shell script is a text file that typically begins with a shebang, as follows: #!/bin/bash /bin/bas ...
- dotnet use regex two samples
One sample is used to replace double quote from words which encapsulated by csvwriter , you know csv ...
- HDU 4865 Peter's Hobby --概率DP
题意:第i天的天气会一定概率地影响第i+1天的天气,也会一定概率地影响这一天的湿度.概率在表中给出.给出n天的湿度,推测概率最大的这n天的天气. 分析:这是引自机器学习中隐马尔科夫模型的入门模型,其实 ...
- SPOJ AMR10I Dividing Stones --DFS
题意:给n个石头,分成一些部分(最多n部分,随便分),问分完后每部分的数量的乘积有多少种情况. 分析:可以看出,其实每个乘积都可以分解为素数的乘积,比如乘积为4,虽然可以分解为4*1,但是更可以分解为 ...
- CSU 1081 集训队分组
题意:有n个学生,比了一场比赛,但是榜单看不到了.现在告诉你m段信息,每段信息的内容是(a,b),表示a的排名比b的高.问你能不能根据这些信息得出这场比赛的前k名. 思路:用拓扑排序找出一组符合k个人 ...
- Android Studio系列教程四--Gradle基础
Android Studio系列教程四--Gradle基础 2014 年 12 月 18 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzhang ...
- Android Handler处理机制 ( 二 ) ——Handler,Message,Looper,MessageQueue
Android是消息驱动的,实现消息驱动有几个要素: 消息的表示:Message 消息队列:MessageQueue 消息循环,用于循环取出消息进行处理:Looper 消息处理,消息循环从消息队列中取 ...
- sqlzoo.net刷题
只发后面提升题目的题解,前面的太简单,写下来也没有意义 12.查找尤金•奧尼爾EUGENE O'NEILL得獎的所有細節 Find all details of the prize won by EU ...