Java数据结构和算法(一)散列表
Java数据结构和算法(一)散列表
数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html)
散列表(Hash table) 也叫哈希表,是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做 散列函数 ,存放记录的数组叫做 散列表。
- 数组的特点是:寻址容易,插入和删除困难;
- 链表的特点是:寻址困难,插入和删除容易。
- 散列表的特点是:结合了两者的优势,寻址容易,插入删除也容易。
散列表 Hash table(key,value) 就是把 Key 通过一个固定的算法函数即散列函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,将 value 存储在以该数字为下标的数组空间里。通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
而当使用哈希表进行查询的时候,就是再次使用哈希函数将 key 转换为对应的数组下标,并定位到该空间获取 value,如此一来,就可以充分利用到数组的定位性能进行数据定位。
一、散列函数
1.1 直接定址法
关键码本身和地址之间存在某个线性函数关系时,散列函数取为关键码的线性函数,即:H(key)=a*key+b,a、b均为常数。
这样的散列函数优点就是简单、均匀,也不会产生冲突,但问题是这需要事先知道关键字的分布情况,适合査找表较小且连续的情况。由于这样的限制,在现实应用中虽然简单,但却并不常用。
1.2 余数法
通过选择适当的正整数 p,按计算公式 H(K) = K mod p 来计算关键码K的散列地址。
若关键码个数为 n,散列表表长为 m(一般 m >= n),通常选 p 为小于或等于表长 m 的最大素数或不包含小于 20 的质因子的合数,一般也要求 p >= n。
这种方法计算最简单,也不需根据全部关键码的分布情况研究如何从中析取数据,最常用。
1.3 平方取中法
将关键码 K 平方,取 K^2 中间几位作为其散列地址 H(K) 的值。
假如有以下关键字序列 {421,423,436},平方之后的结果为 {177241,178929,190096},那么可以取 {72,89,00} 作为 Hash 地址。
1.4 随机数法
采用随机函数作为散列函数 H(Key) = random(Key),其中 random 为随机函数。当关键码长度不等时,采用该方法较恰当。
二、Hash 冲突
2.1 缓冲区
建立一个缓冲区,把凡是 Hash(key) 重复的元素放到缓冲区中。当我通过 key 查找时,发现找的不对,就在缓冲区里找。
2.2 开放定址法
- 线性探测:从发生冲突位置的下一个位置开始寻找空的散列地址。线性探测会导致数据集中到某一块区域。
- 二次探测:从发生冲突位置的 1, 2^2, 3^2, 4^2, 5^2 ...
- 再哈希:
2.3 拉链法
具体的关键字列表为(19,14,23,01,68,20,84,27,55,11,10,79),则散列函数为 H(key) = key MOD 13。则采用除留余数法和拉链法后得到的预想结果应该为:

每天用心记录一点点。内容也许不重要,但习惯很重要!
Java数据结构和算法(一)散列表的更多相关文章
- Java数据结构和算法(四)赫夫曼树
Java数据结构和算法(四)赫夫曼树 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 赫夫曼树又称为最优二叉树,赫夫曼树的一个 ...
- Java数据结构和算法 - 数组
Q: 数组的创建? A: Java中有两种数据类型,基本类型和对象类型,在许多编程语言中(甚至面向对象语言C++),数组也是基本类型.但在Java中把数组当做对象来看.因此在创建数组时,必须使用new ...
- Java数据结构与算法 - 外部存储
Q: 什么是外部存储? A: 外部存储特指某类磁盘系统,例如在大多数台式电脑或服务器中的硬盘. Q: 如何访问外部存储? A: 我们所学的数据结构都是假设数据存储在内存中,但是,在很多情况下要处理的数 ...
- Java数据结构和算法 - 哈希表
Q: 如何快速地存取员工的信息? A: 假设现在要写一个程序,存取一个公司的员工记录,这个小公司大约有1000个员工,每个员工记录需要1024个字节的存储空间,因此整个数据库的大小约为1MB.一般的计 ...
- 数据结构和算法 – 7.散列和 Hashtable 类
7.1.散列函数 散列是一种常见的存储数据的技术,按照这种方式可以非常迅速地插入和取回数据.散列所采用的数据结构被称为是散列表.尽管散列表提供了快速地插入.删除.以及取回数据的操作,但是诸如查找最大值 ...
- Java数据结构和算法
首先,本人自学java,但是只学习了java的基础知识,所以想接下来学习一下数据结构和算法,但是找了很多教材,大部分写的好的都是用c语言实现的,虽然知道数据结构和算法,跟什么语言实现的没有关系,但是我 ...
- 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现
本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是 ...
- Java数据结构和算法(六)——前缀、中缀、后缀表达式
前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...
- Java数据结构和算法(十四)——堆
在Java数据结构和算法(五)——队列中我们介绍了优先级队列,优先级队列是一种抽象数据类型(ADT),它提供了删除最大(或最小)关键字值的数据项的方法,插入数据项的方法,优先级队列可以用有序数组来实现 ...
随机推荐
- 通过cookie验证用户登录
# cookie # cookie# 当你在浏览器登陆时,浏览器记录这个登录信息(服务器响应时发送请求的数据和登录信息),再次访问时 浏览器会将访问请求和缓存的登录信息都发送到服务器, # 服务器通过 ...
- js1:根据标签的Id获取value值
例子:<input id="startDate" name="startDate" value="2015-09-14" class= ...
- 使用three.js开发3d地图初探
three是图形引擎,而web二维三维地图都是基于图形引擎的,所以拿three来开发需求简单的三维地图应用是没什么问题的. 1.坐标转换 实际地理坐标为经度.纬度.高度,而three.js使用的是右手 ...
- mysql闯关练习
1.表关系 班级表:class 学生表:student cid caption grade_id sid sname gender clas ...
- Asp.Net MVC参考资料
Every day up!!!!!! 1.无废话MVC入门教程 2.MVC快速入门 3.MVC小牛之路 4.Web API强势入门指南 5.全网最全的mvc汇总 6.MVC5+EF6+Bootstra ...
- centos升级python2.7
http://meiyitianabc.blog.163.com/blog/static/10502212720133192489840/
- python爬虫(5)--正则表达式
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑. 1.了解正则表达式 正则表达式 ...
- nginx的配置文件解析
worker_processes ;#工作进程的个数,一般与计算机的cpu核数一致 events { worker_connections ;#单个进程最大连接数(最大连接数=连接数*进程数) } h ...
- 判断一个对象是否为真 __nonzero__ 方法和 __len__方法
class A(): def __nonzero__(self): # 判断 一个对象是否为空,先查看该方法的返回值 return 1 def __len__(self): # 如果没有上一个方法,那 ...
- Numpy随机数
Numpy随机数 np.random随机数子库 1: 基本函数 .rand(d0,d1,..dn):创建d0-dn维度的随机数数组,浮点数,范围从0-1,均匀分布 .randn(d0,d1,..dn) ...