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.展示租车清单,包含:总金额.总载货量以及其车 ...
随机推荐
- linux内核调优参考
对于新部署的机器,需要做一些基本的调优操作,以更改一些默认配置带来的性能问题 1 修改打开文件数 root@mysql:/data/tools/db# vim /etc/security/limits ...
- jQuery Validate 表单验证插件----利用jquery.metadata.js将校验规则直接写在class属性里面并定义错误信息的提示
一.下载依赖包 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW 访问密码 f224 二. 添加一个另外一个插件jquery.metadata.js 并把校验规则写在控件里面 ...
- Jena学习笔记(2)——利用数据库保存本体
注明:本文档是使用Jena2.6.4,数据库为MySQL,数据库驱动版本为mysql-connector-java-5.1.13-bin.jar. 1 Jena的数据库接口 Jena提供了将RDF数据 ...
- Mac OS X 快捷键
启动快捷键 按下按键或组合键,直到所需的功能出现(例如,在启动过程中按住 Option 直到出现“启动管理程序”,或按住 Shift 直到出现“安全启动”).提示:如果启动功能未起作用,而您使用的是第 ...
- 认识与学习 BASH
2015-08-03摘自鸟哥 什么是变量? 那么,什么是『变量』呢?简单的说,就是让某一个特定字符串代表不固定的内容就是了.举个大家在国中都会学到的数学例子, 那就是:『 y = ax + b 』这东 ...
- linux chromuim安装常用插件(flash,手势,拖拽,广告屏蔽)
1.本机kali2.0 64位,kali基于Debian.文章所用的所有插件请到http://files.cnblogs.com/files/yuuyuu/chromium_plugins.tar. ...
- 关键路径 SDUTOJ 2498
SDUTOJ 2498 AOE网上的关键路径 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 一个无环的有向图称为无环图(Dire ...
- iOS使用Core Graphics和UIBezierPath绘画
通过UIView的子类的- (void)drawRect:(CGRect)rect 函数可用对视图进行重新绘画: 要重新绘画可以通过Core Graphics和UIBezierPath来实现. 1.通 ...
- FreeMarker 一二事 - 静态模板的使用与生成
如今前后端分离,动静分离 使用freemarker实现动静分离,nginx处理静态资源文件,提高效率 加载jar包 <!-- freemarker --> <dependency&g ...
- 在同一个机器中安装LoadRunner与QTP
若你计划在测试机上安装LoadRunner并且测试机上已经安装了QTP,类似这样的情况可能会出现一些冲突现象,若QTP与LR必须并存在同一测试机上,那么请确保先安装Loadrunner以及所有的LR补 ...