哈希表的概念(散列表)

news/2024/11/17 7:18:30/

一、基本概念

散列表特点 :
数据元素的关键字与存储地址直接相关

通过哈希函数建立“关键字”与“存储地址”的联系

若不同的关键字通过散列函数映射到同一个值,则称它们为 “同义词”
通过散列函数确定的位置已经存放了其他元素,则称这种情况为 “冲突”


二、常见散列函数

  1. 除留取余法—H(key)=key%p
    表长为m,取不大于m但最接近或等于m的质数
  2. 直接定址法—H(key)=a*key+b
    适合 关键字分布基本连续 的情况
  3. 数字分析法—选取数码分布较为均匀的若干位作为散列地址
    在这里插入图片描述
    4.平方取中法—取关键字的平方值的中间几位作为散列地址
    在这里插入图片描述

散列查找是典型的 “用空间换时间” 的算法,只要散列函数设计的合理,则散列表越长,冲突的概率越低。

三、处理冲突的方法

1.拉链法

用拉链法处理“冲突”:把所有“同义词”存储在一个链表
在这里插入图片描述

2.开放定址法

空地址既对同义词开放,又向非同义词开放。其数学递推公式为
Hi=(H(key)+di)%mH_i=(H(key)+d_i)\%m Hi=(H(key)+di)%m
其中i∈[0,m−1]i\in[0,m-1]i[0,m1],m表示散列表表长,did_idi为增量序列;H(key)表示初始地址;i理解为“第i次发生冲突”

(1) 线性探测法

di=0,1,2,...,m−1d_i=0,1,2,...,m-1di=0,1,2,...,m1

1存储操作
即发生冲突时,每次往后探测一个单元(向后挪1单元)。若为空,放入,若发生冲突,则接着挪

【易错点】
H(key)=key%pH(key)=key\%pH(key)=key%p
Hi=(H(key)+di)%mH_i=(H(key)+d_i)\%mHi=(H(key)+di)%m
m和p不一定相等
例如:
在这里插入图片描述
n=13;p为不大于n且与n互质的数,为13
m为表长为16
H(25)=25%13=12H(25)=25\%13=12H(25)=25%13=12
H1=(12+1)%16=13H_1=(12+1)\%16=13H1=(12+1)%16=13

查找操作与存储操作类同。当查找到第一个空位,仍未找到,则查找失败。(例如查找21,从位置8开始查找,直到位置13,仍未找到。查找失败)

缺点:

(2) 平方探测法

di=0,1,−1,22,−22,32,−32....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,以此类推)
【注意】:

  1. 在平方探测法中,由于偏移量有负,故要处理Hi=(H(key)+di(i))%m<0H_i=(H(key)+di(i))\%m<0Hi=(H(key)+di(i))%m<0的情况。处理方法为:当di(i)<0时,Hi=(H(key)+di(i)+m)%mdi(i)<0时,H_i=(H(key)+di(i)+m)\%mdi(i)<0时,Hi=(H(key)+di(i)+m)%m
  2. 在平方探测法中,散列表长度m必须是一个可以表示为4j+3的素数,才能探测到所有位置

(3) 伪随机序列法

di=0,5,24,11,..d_i=0,5,24,11,..di=0,5,24,11,..或其他给出的伪随机序列
与以上两种操作类同,不再赘述


http://www.ppmy.cn/news/22317.html

相关文章

分享92个JS特效动画效果,总有一款适合您

分享92个JS特效动画效果&#xff0c;总有一款适合您 92个JS特效动画效果下载链接&#xff1a;https://pan.baidu.com/s/1C_b7PM8E8WUpNMethPGtbQ?pwdr3f8 提取码&#xff1a;r3f8 Python采集代码下载链接&#xff1a;https://wwgn.lanzoul.com/iKGwb0kye3wj fullPage百度…

iPhone苹果手机Apple id帐号如何永久性注销删除数据?

原文来源&#xff1a;https://www.caochai.com/article-4120.html 注本方法&#xff1a;将会将您的iPhone苹果手机Apple id帐号从所有 Apple App、服务和 iCloud&#xff08;由云上贵州运营&#xff09; 中永久删除你的帐户和相关联的数据。 iPhone苹果手机Apple id帐号如何永…

C语言中内存函数

目录memcpy模拟实现memcpymemmove模拟实现memmovememcmp模拟实现memcmpmemsetmemcpy 前面介绍了专门拷贝字符串的函数strcpy,但是strcpy只能拷贝字符串 如果想拷贝其他类型的内存空间&#xff0c;就需要用到memcpy函数 void * memcpy ( void * destination, const void * sou…

Learning C++ No.3【类和对象No.2】

引言&#xff1a; 北京时间&#xff1a;2023/2/4/9:52&#xff0c;起床时间8:55&#xff0c;今天为什么可以起这么早呢&#xff1f;原因就是我没有把我的闹钟给放在枕边&#xff0c;哈哈哈&#xff01;但是好像导致一个8:20的闹钟闹了半个小时&#xff0c;哈哈哈&#xff01;上…

条款3:理解decltype

对于给定的名字或表达式&#xff0c;decltype能告诉你名字或表达式型别。一般来说&#xff0c;它告诉你的结果和你预测的是一样的。偶尔它也会给出某个结果&#xff0c;让你抓耳挠腮&#xff0c;不得不去参考手册或在线FAQ页面求得一些启发。 先从一般案例讲起——就是那些不会…

C语言进阶——字符函数和字符串函数(中)

&#x1f307;个人主页&#xff1a;_麦麦_ &#x1f4da;今日感言&#xff1a;博客写多了&#xff0c;容颜自然改变&#xff0c;许多时候&#xff0c;自己可能以为许多写过的博客都成了过眼云烟&#xff0c;不复记忆&#xff0c;其实他们仍是潜在的。在气质里&#xff0c;在谈吐…

DVWA-XSS(DOM)注入-Low-Medium-Hight

Low 先点个Select&#xff0c;静观其变 点击select以后url地址中多出来一个default参数&#xff0c;尝试这个注入点。 输入payload <script>alert(1)</script> 并提交Medium 1、先尝试<script>alert(1)</script>&#xff0c;并提交 这里不难看出…

【5】KVM | 虚拟机网络配置 | Nat网络 | Bridge网络

目录 网络模式 【1】Nat网络 【2】Bridge网络 网络模式 Qemu-kvm提供了三种网络模式 1、桥接(bridge)将虚拟机的网卡桥接到宿主机的物理网卡。虚拟机和宿主机处于同一个网络内使用同一个网段。相当于将虚拟机的网卡和宿主机的网卡接在同一台二层交换机上。2、NAT宿主机需要…