(第13讲)哈希表的开放地址法中的线性探测

本文介绍了哈希表的基本概念和线性探测法,详细讲解了如何使用线性探测解决哈希冲突,包括在Java中实现哈希表的插入、删除、查找和遍历操作,并给出了具体代码示例。
摘要由CSDN通过智能技术生成

哈希表:也叫散列表(Hash table,),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数(哈希函数),存放记录的数组叫做散列表(哈希表)

线性探测:是指如果经过哈希化得到的数组下标,其对应的位置不为空或者不是被删除状态,就继续查看下一个位置,一次这样。公式如下所示:

Hi=(H(key)+di) MOD m i=1,2,...,k(k<=m-1)其中m为表长,di为增量序列

如果di值可能为1,2,3,...m-1,称线性探测再散列

packagecom.eleven; 

publicclass HashTableApp {

         public static void main(String[] args){

         int size = 10;//哈希表长度

        int num = 8;//哈希表中数据项个数
        int rate = 10;//比率为10,
         HashTable hashtable = new HashTable(size);
         /*for(int i =0;i<num;i++){
             int value =(int)( Math.random()*rate*siz
好的,这是一个关于哈希表的问题,我会尽力解答。首先,我们需要了解一些基本概念: - 哈希表:一种根据关键字直接访问内存存储位置的数据结构。 - 哈希函数:将关键字映射为哈希表地址的函数。 - 冲突:不同的关键字可能映射到哈希表同一个地址的现象。 - 开放地址法:解决冲突的一种方法,当发生冲突时,通过探测哈希表的其他地址来寻找空闲的地址。 - 线性探测:一种开放地址法探测的顺序是依次往后探测。 - 二次探测再散列:一种开放地址法,当发生冲突时,采用二次探测探测步长是关键字的平方),并重新计算哈希值。 现在,我们根据题目要求构造哈希表: 1. 线性探测法 首先,我们需要定义哈希函数 H(key)=key % 13。然后,我们按照以下步骤构造哈希表: 1. 将哈希表的所有元素初始化为空。 2. 将关键字序列{19,1,23,14,55,20,84,27,68}插入哈希表。 3. 当发生冲突时,采用线性探测法,即依次往后探测,直到找到空闲地址为止。 构造出来的哈希表如下所示: |地址|关键字| |----|------| |0 |68 | |1 |27 | |2 |55 | |3 |14 | |4 |1 | |5 |20 | |6 |23 | |7 |84 | |8 | | |9 |19 | |10 | | |11 | | |12 | | 接下来,我们来计算平均查找长度(ASL)。ASL是指在查找过程,平均需要查找的次数。假设查找成功的概率为p,那么查找失败的概率就是1-p。在线性探测,当发生冲突时,需要依次往后查找,直到找到空闲地址为止。因此,平均查找长度可以表示为: ASL = p * (1 + 1/2 + 1/3 + ... + 1/(1-p)) + (1-p) * (1 + 1/2 + 1/3 + ... + 1/(1-(1-p))) 其,p = n/m,n表示关键字的个数,m表示哈希表的大小。对于本题,n=9,m=13,因此p=0.6923。 将p代入公式,可以得到ASL=1.5292。因此,在线性探测,平均需要查找1.5292次。 2. 二次探测再散列法 同样地,我们需要定义哈希函数 H(key)=key % 13。然后,按照以下步骤构造哈希表: 1. 将哈希表的所有元素初始化为空。 2. 将关键字序列{19,1,23,14,55,20,84,27,68}插入哈希表。 3. 当发生冲突时,采用二次探测再散列法,即计算新的哈希值,并重新探测。 构造出来的哈希表如下所示: |地址|关键字| |----|------| |0 |68 | |1 |14 | |2 |55 | |3 |1 | |4 |19 | |5 |20 | |6 |23 | |7 |84 | |8 | | |9 |27 | |10 | | |11 | | |12 | | 接下来,我们来计算平均查找长度。同样地,假设查找成功的概率为p,查找失败的概率为1-p。在二次探测再散列法,当发生冲突时,需要计算新的哈希值,并重新探测。因此,平均查找长度可以表示为: ASL = p * (1 + 1/2^2 + 1/3^2 + ... + 1/k^2) + (1-p) * (1 + 1/2^2 + 1/3^2 + ... + 1/k^2) 其,k表示探测的最大步长。对于本题,k=6,因为最远可以探测到第6个地址。将p代入公式,可以得到ASL=1.3214。因此,在二次探测再散列法,平均需要查找1.3214次。 综上所述,二次探测再散列法的平均查找长度线性探测法更短,因此更加高效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值