哈希表的概念(散列表)
文章目录
- 一、基本概念
- 二、常见散列函数
- 1. 除留取余法---H(key)=key%p
- 2.直接定址法---H(key)=a*key+b
- 3. 数字分析法---选取数码分布较为均匀的若干位作为散列地址
- 4.平方取中法---取关键字的平方值的中间几位作为散列地址
- 三、处理冲突的方法
- 1.拉链法
- 2.开放定址法
- (1) 线性探测法
- (2) 平方探测法
- (3) 伪随机序列法
一、基本概念
散列表特点 :
数据元素的关键字与存储地址直接相关
通过哈希函数建立“关键字”与“存储地址”的联系
若不同的关键字通过散列函数映射到同一个值,则称它们为 “同义词”
通过散列函数确定的位置已经存放了其他元素,则称这种情况为 “冲突”
二、常见散列函数
1. 除留取余法—H(key)=key%p
表长为m,取不大于m但最接近或等于m的质数
2.直接定址法—H(key)=a*key+b
适合 关键字分布基本连续 的情况
3. 数字分析法—选取数码分布较为均匀的若干位作为散列地址
4.平方取中法—取关键字的平方值的中间几位作为散列地址
散列查找是典型的 “用空间换时间” 的算法,只要散列函数设计的合理,则散列表越长,冲突的概率越低。
三、处理冲突的方法
1.拉链法
用拉链法处理“冲突”:把所有“同义词”存储在一个链表中
2.开放定址法
空地址既对同义词开放,又向非同义词开放。其数学递推公式为
H i = ( H ( k e y ) + d i ) % m H_i=(H(key)+d_i)\%m Hi=(H(key)+di)%m
其中 i ∈ [ 0 , m − 1 ] i\in[0,m-1] i∈[0,m−1],m表示散列表表长, d i d_i di为增量序列;H(key)表示初始地址;i理解为“第i次发生冲突”
(1) 线性探测法
d i = 0 , 1 , 2 , . . . , m − 1 d_i=0,1,2,...,m-1 di=0,1,2,...,m−1
1存储操作
即发生冲突时,每次往后探测一个单元(向后挪1单元)。若为空,放入,若发生冲突,则接着挪
【易错点】
H ( k e y ) = k e y % p H(key)=key\%p H(key)=key%p
H i = ( H ( k e y ) + d i ) % m H_i=(H(key)+d_i)\%m Hi=(H(key)+di)%m
m和p不一定相等
例如:
n=13;p为不大于n且与n互质的数,为13
m为表长为16
H ( 25 ) = 25 % 13 = 12 H(25)=25\%13=12 H(25)=25%13=12
H 1 = ( 12 + 1 ) % 16 = 13 H_1=(12+1)\%16=13 H1=(12+1)%16=13
查找操作与存储操作类同。当查找到第一个空位,仍未找到,则查找失败。(例如查找21,从位置8开始查找,直到位置13,仍未找到。查找失败)
缺点:
(2) 平方探测法
d i = 0 , 1 , − 1 , 2 2 , − 2 2 , 3 2 , − 3 2 . . . . d_i=0,1,-1,2^2,-2^2,3^2,-3^2.... di=0,1,−1,22,−22,32,−32....
存储操作
即发生冲突时,以H(key)为,向右向左探索。若为空,放入;若左右都冲突,探测下一个平方值,直至找到空位(eg. H(key)=9, 若10和8都冲突,探测13和5,以此类推)
【注意】:
- 在平方探测法中,由于偏移量有负,故要处理 H i = ( H ( k e y ) + d i ( i ) ) % m < 0 H_i=(H(key)+di(i))\%m<0 Hi=(H(key)+di(i))%m<0的情况。处理方法为:当 d i ( i ) < 0 时, H i = ( H ( k e y ) + d i ( i ) + m ) % m di(i)<0时,H_i=(H(key)+di(i)+m)\%m di(i)<0时,Hi=(H(key)+di(i)+m)%m
- 在平方探测法中,散列表长度m必须是一个可以表示为4j+3的素数,才能探测到所有位置
(3) 伪随机序列法
d i = 0 , 5 , 24 , 11 , . . d_i=0,5,24,11,.. di=0,5,24,11,..或其他给出的伪随机序列
与以上两种操作类同,不再赘述
哈希表的概念(散列表)相关推荐
- 哈希表(模拟散列表 字符串哈希)
目录 一.哈希表的概念 二.模拟散列表 题目 代码实现 ①拉链法 ②开放寻址法 三.字符串哈希 题目 思路 注意点 代码实现 一.哈希表的概念 哈希表(又称为散列表),将一个比较大的值域映射到一个小的 ...
- 《算法图解》学习笔记(五):哈希表,小名散列表(附代码)
欢迎关注WX公众号:[程序员管小亮] python学习之路 - 从入门到精通到大师 文章目录 欢迎关注WX公众号:[程序员管小亮] [python学习之路 - 从入门到精通到大师](https://b ...
- 【数据结构】哈希表的概念及应用
[数据结构]哈希表的概念及应用 前言 1.写出哈希表的基本概念 2.列出常用的哈希函数构造方法,并阐述各自的特点. 直接定址法 除留余数法 数字分析法 其他构造整数关键字的哈希函数的方法: 平方取中法 ...
- 哈希表(闭散列、拉链法--哈希桶)
哈希表,也称散列表,是一种通过key值来直接访问在内存中的存储的数据结构.它通过一个关键值的函数(被称为散列函数)将所需的数据映射到表中的位置来访问数据. 关于哈希表,主要为以下几个方面: 一.哈希表 ...
- java集合表_java集合类散列表
哈希表 是种数据结构,它可以提供快速的插入操作和查找操作.第一次接触哈希表时,它的优点多得让人难以置信.不论哈希表中有多少数据, 插入和删除(有时包括侧除)只需要接近常量的时间即0(1)的时间级.实际 ...
- 什么是散列表(哈希表)?
散列表(哈希表) 概念 散列表的构造方法 处理冲突的方法 后续 概念 散列函数:一个把查找表中的关键字映射成该关键字对应的地址的函数,记为Hash(key)=Addr(这里的地址可以是数组下标.索引或 ...
- Hash表(哈希表、散列表)
哈希表 概念 为什么需要哈希表 静态查找表与动态查找表中,为了查找某关键字值等于某个值的记录,都要经过一系列的关键字进行比较,以确定待查记录的储存位置或查找失败,查找的时间总是与比较次数有关 什么是哈 ...
- 散列表(哈希表)工作原理 (转)
1. 引言 哈希表(Hash Table)的应用近两年才在NOI中出现,作为一种高效的数据结构,它正在竞赛中发挥着越来越重要的作用. 哈希表最大的优点,就是把数据的存储和查找消耗的时间大 ...
- 【Java数据结构与算法】第十章 哈希表和二叉树
第十章 哈希表和二叉树 文章目录 第十章 哈希表和二叉树 一.哈希表 1.介绍 2.代码实现 二.二叉树 1.介绍 2.遍历二叉树 3.查找二叉树 4.二叉树删除节点 5.二叉树综合实例 一.哈希表 ...
最新文章
- 转载 oracle12c 切换字符集
- 《the way to go》一处关于go匿名函数的“勘误”
- ASP.NET Core分布式项目实战(集成ASP.NETCore Identity)--学习笔记
- matplotlib的颜色和控制条
- arduino 舵机接线图_用fritzing绘制arduino硬件连线图
- MFC 中获取各种类指针的方法
- ai人工智能可以干什么_我们可以使人工智能更具道德性吗?
- UVAOJ1586题解
- SQL入门之第八讲——UPDATE更新语句
- Neverland Test 2.0
- 小强统一认证中心开源介绍
- 芭蕉树上第十八根芭蕉-- Qt图片绘图类QPixmap/QImage/QPicture
- 经典逻辑题笔试题和答案(不断更新)
- matlab灰色预测关联度
- bzoj 3730 震波 —— 动态点分治+树状数组
- Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exc
- 破竹课堂-老A的杠杆术
- SPSS数据分析中出现的常见问题总结
- 产品公司解决方案、解决方案公司解决方案,可能你做了一辈子IT你也不知道...
- MongoDB启动命令
热门文章
- 黑苹果键盘对应的相应按键
- ios开发之音频视频开发
- 防止后缀aol.com}AOL勒索病毒*** .com}AOL勒索病毒解密工具处理方法
- linux ps-e和-ax区别,Linux编程 6 (查看进程 ps 及输出风格)
- 伤感!!!!!!!!!!!!!!!
- 给你一台大疆无人机,你能用来做点啥?(二)-----——倾斜摄影建模
- 51单片机实现万年历
- eclipes error
- linuxService
- V型反弹的名场面,荣耀能否在海外市场“荣耀”?