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),它提供了删除最大(或最小)关键字值的数据项的方法,插入数据项的方法,优先级队列可以用有序数组来实现 ...
随机推荐
- C语言中字符串存储方法
众所周知,C语言中没有数据类型能够存储字符串, char数据类型仅仅能够存储一个字符的数据,那么在C语言中关于存储字符串这一难题我们改何去何从呢? 下面将详述相关的字符串存储方法; 1,使用字符数组存 ...
- hive 下篇
由于spark on hive 问题,导致无法插入数据,暂时使用spark进行hive操作 向分区表插入数据 hive> show partitions customers;OKpartitio ...
- Unable to open file '.RES'
Unable to open file '.RES' 另存工程,带来的隐患,工程图标也改不了. 搜索发现源码里某个man.cpp里带了prgram resource aaa.res,换成新工程文件名 ...
- Find 和 Findstr
FIND 在文件中搜索文字字符串. FINDSTR 在文件中搜索字符串. findstr能用正则表达式,而find不能 dir c:|find /N /I /C "windows&q ...
- MySQL JSON 类型数据操作
1.Java 中动态扩展字段,会导致数据库表被锁,在MySQL 5.7.8版本之前,因为MySQL不能直接操作JSON类型数据,可以将一个字段设定成varchar类型,里面存放JSON格式数据,这样在 ...
- Qt 的事件
一个事件由一个特定的QEvent子类来表示,如QMouseEvent.QKeyEvent 处理一个事件的方法: 方法一:重新实现部件的paintEvent.mousePressEvent等事件处理函数 ...
- Haskell语言学习笔记(29)CPS
CPS (Continuation Passing Style) CPS(延续传递风格)是指函数不把处理结果作为返回值返回而是把处理结果传递给下一个函数的编码风格. 与此相对,函数把处理结果作为返回值 ...
- DataFrame查增改删
DataFrame查增改删 查 Read 类list/ndarray数据访问方式 dates = pd.date_range(',periods=10) dates df = pd.DataFrame ...
- Linux初学时的一些常用命令(2)
文件的操作 创建一个文件 touch 文件名 创建一个空白的文件 复制文件 cp 文件 目录/文件名 例如: cp 1.txt 2.txt cp 1.tx ...
- conductor Workflow Metrics
Server Metrics conductor使用spectator收集指标.https://github.com/Netflix/spectator 名称 目的 标签 workflow_serve ...