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.展示租车清单,包含:总金额.总载货量以及其车 ...
随机推荐
- oracle表相关
堆表 数据以堆的形式管理,增加数据时会使用段中找到的第一个能放下数据的自由空间,我们见到的绝大部分的表都是堆表.堆表是数据库的默认表类型. 最简单的情况是 create table test (c1 ...
- 「ubuntu」通过无线网络安装Ubuntu Server,启动系统后如何连接无线网络
接触Ubuntu系统不久,发现无线网络环境下安装Ubuntu Server一个不太人性化的设计:在安装过程中选择无线网卡,即使用无线网络安装(此时需要选择Wi-Fi网络并输入密码),但系统安装完成重启 ...
- JavaScript中的直接量与初始器的区别
很多代码优化及公司规范都会提到 写对象不应该 var obj = new Object() 而应该 var obj = {} 写数组不应该 var arr = new Array() 而应该 var ...
- mysql启动不成功显示The server quit without updating PID file的解决方法
上午在编译安装mysql的时候 就出现标题中的错误,经实践在第二步操作后启动成功,参考链接 链接http://linuxadministrator.pro/blog/?p=225 You may fa ...
- Redis安装,mongodb安装,hbase安装,cassandra安装,mysql安装,zookeeper安装,kafka安装,storm安装大数据软件安装部署百科全书
伟大的程序员版权所有,转载请注明:http://www.lenggirl.com/bigdata/server-sofeware-install.html 一.安装mongodb 官网下载包mongo ...
- UVALive 6269 Digital Clock --枚举,模拟
题意:说不清楚,自己看吧,太恶心. 这题真是SB了,当时看了一下以为乱搞就好了,于是开始动手拍,结果拍了好几个小时都没拍出来,而且越想越想不通,直接把自己绕进去了,结果gg了. 总结:甭管什么题,想清 ...
- 阿里巴巴Druid数据源,史上最强的数据源,没有之一
目前常用的数据源主要有c3p0.dbcp.proxool.druid,先来说说他们Spring 推荐使用dbcp:Hibernate 推荐使用c3p0和proxool1. DBCP:apacheDBC ...
- 获取WIN10技术预览版
说明 这是一款预发行软件 在进行商业发行之前,我们可能会对 Windows Technical Preview 进行大量修改. Microsoft 不对此处提供的信息作任何明示或默示的担保. 有些产品 ...
- C++ 基础笔记(一)
解释型和编译型 解释型: 边解释边执行,翻译成机器代码后就执行. 编译型: 整篇代码编译成机器码后,保存在可执行文件中,然后启动该程序文件,运行获得结果. Hello World #include & ...
- xshell5.0实现中键复制
1. 右建点击黑色屏幕 2. 在打开选项 3. 勾选 ""