建立关键字序列(16,74,60,43,54,90,46,31,29,88,77)对应哈希表A[0..12],哈希函数为H(k)=k%p,并采用开放地址法中的线性探测法解决冲突
时间: 2024-04-25 10:27:46 浏览: 122
好的,这是一个哈希表的问题,我来给您讲解一下。
首先,哈希表是一种数据结构,可以用来实现快速的查找操作。哈希表通过哈希函数将关键字映射到一个桶中,然后在桶内进行查找。哈希函数是关键字到桶的映射函数,是哈希表的核心部分。
在这个问题中,我们需要将关键字序列(16,74,60,43,54,90,46,31,29,88,77)存储到哈希表A[0..12]中。哈希函数为H(k)=k%p,其中p为桶的个数,也就是13。
开放地址法是一种解决冲突的方法,它的基本思想是如果一个桶已经被占用了,就继续往下一个桶里找,直到找到一个空桶为止。线性探测法是开放地址法的一种,它的探测序列是:H(k), H(k)+1, H(k)+2, …, H(k)+i, …,其中i是一个整数。
下面是具体的实现步骤:
1. 定义哈希函数H(k)=k%p,其中p=13,所以H(k)=k%13。
2. 定义哈希表A[0..12],并初始化为-1,表示该桶为空。
3. 对于关键字序列中的每一个关键字k,计算H(k)的值,然后进行线性探测,直到找到一个空桶,将k存储到该桶中。
4. 如果线性探测的过程中遇到了已经被占用的桶,就继续往下一个桶里找,直到找到一个空桶为止。
下面是具体的实现过程:
1. 定义哈希函数H(k)=k%13。
2. 定义哈希表A[0..12],并初始化为-1。
3. 对于关键字序列中的每一个关键字k,计算H(k)的值,然后进行线性探测,直到找到一个空桶,将k存储到该桶中。
- k=16,H(k)=16%13=3,A[3]=-1,将k存储到A[3]中,A变为[-1,-1,-1,16,-1,-1,-1,-1,-1,-1,-1,-1,-1]。
- k=74,H(k)=74%13=8,A[8]=-1,将k存储到A[8]中,A变为[-1,-1,-1,16,-1,-1,-1,-1,74,-1,-1,-1,-1]。
- k=60,H(k)=60%13=8,A[8]=74,继续往下一个桶里找,H(k)+1=9,A[9]=-1,将k存储到A[9]中,A变为[-1,-1,-1,16,-1,-1,-1,-1,74,60,-1,-1,-1]。
- k=43,H(k)=43%13=4,A[4]=-1,将k存储到A[4]中,A变为[-1,-1,-1,16,43,-1,-1,-1,74,60,-1,-1,-1]。
- k=54,H(k)=54%13=2,A[2]=-1,将k存储到A[2]中,A变为[-1,-1,54,16,43,-1,-1,-1,74,60,-1,-1,-1]。
- k=90,H(k)=90%13=12,A[12]=-1,将k存储到A[12]中,A变为[-1,-1,54,16,43,-1,-1,-1,74,60,-1,-1,90]。
- k=46,H(k)=46%13=7,A[7]=-1,将k存储到A[7]中,A变为[-1,-1,54,16,43,-1,-1,46,74,60,-1,-1,90]。
- k=31,H(k)=31%13=5,A[5]=-1,将k存储到A[5]中,A变为[-1,-1,54,16,43,31,-1,46,74,60,-1,-1,90]。
- k=29,H(k)=29%13=3,A[3]=16,继续往下一个桶里找,H(k)+1=4,A[4]=43,继续往下一个桶里找,H(k)+2=5,A[5]=31,继续往下一个桶里找,H(k)+3=6,A[6]=-1,将k存储到A[6]中,A变为[-1,-1,54,16,43,31,29,46,74,60,-1,-1,90]。
- k=88,H(k)=88%13=7,A[7]=46,继续往下一个桶里找,H(k)+1=8,A[8]=74,继续往下一个桶里找,H(k)+2=9,A[9]=60,继续往下一个桶里找,H(k)+3=10,A[10]=-1,将k存储到A[10]中,A变为[-1,-1,54,16,43,31,29,46,74,60,88,-1,90]。
- k=77,H(k)=77%13=12,A[12]=90,继续往下一个桶里找,H(k)+1=0,A[0]=-1,将k存储到A[0]中,A变为[77,-1,54,16,43,31,29,46,74,60,88,-1,90]。
4. 关键字序列中的所有关键字都被存储到了哈希表中,查找操作就可以通过哈希函数进行,是一种O(1)的常数时间复杂度操作。
希望我的讲解对您有所帮助。
阅读全文