数据结构:哈希表平均长度,给定一组查找关键字(19,14,23,1,65,20,84,27,55,11,10,79) 哈希函数为:H(key)=key % 13, 哈希表长为m=15,设每个记录的查找

目录

给定一组查找关键字(19,14,23,1,65,20,84,27,55,11,10,79)

线性探测法例题

链地址法例题

网上一些博客错误的指正


给定一组查找关键字(19,14,23,1,65,20,84,27,55,11,10,79)

哈希函数为:H(key)=key % 13, 哈希表长为m=15,设每个记录的查找概率相等。

1. 请画出按照线性探测再散列处理冲突得到的哈希表(给出求解过程),并计算查找成功和查找失败时的平均查找长度各是多少。

2. 请画出按照链地址法处理冲突得到的哈希表,并计算查找成功和查找失败时的平均查找长度各是多少。

ps:老师改题啦,原来和下面的那题是一样的,题目任你改做不出算我输,哈哈哈(低调低调)

由第一个H(19) = 19MOD 13 =  6以此类推

19142316820842755111079
611010761311101

可以得到散列表为

01234567891011121314
65141215579197884 231110  

 

key01234567891011121314
count112325113 113  

查找成功的平均长度:(1+1+2+3+2+5+1+1+3+1+1+3)÷12 = 24/12 = 2; 

key01234567891011121314
count10987654321432  

查找失败得平均长度:(10+9+8+7+6+5+4+3+2+1+4+3+2)÷13 = 64/13;

(2)

链地址法:

查找成功的平均长度:(1×7+2×3+3×1+4×1)÷12 = 20/12=5/3;

查找失败的平均长度:(2+5+1+2+1+1+3+2+1+1+3+2+1)÷13 = 25/13; 

 

 

请回答采用线性探测再散列和链地址法处理冲突构建的哈希表中,查找失败时的平均查找长度如何计算?

例:已知一组关键字(19,14,23,1,68,20,84,27,55,11,10,79)

       哈希函数为:H(key)=key MOD 13, 哈希表长为m=15,

       设每个记录的查找概率相等,采用以上两种方法处理冲突,查找失败时的平均查找长度各是多少

 

 这题可真得是出到点子上去啦,看视频,找资料,网上有得解释真的是有点误人子弟,随后加上问了老师一番才有了确定的结果

没错我们主要得难点还是查找失败得分母到底是什么呢,还有一个网上解释错得,但广为流传得,

但是还是全部体系得去写吧毕竟也许以后就忘了

线性探测

(1)

有第一个H(19) = 19MOD 13 =  6,后面得以此类推,

19142316820842755111079
611013761311101

可以得到散列表为

01234567891011121314
 14168275519208479231110  

 

key01234567891011121314
count 121431139113  

查找成功的平均长度:(1+2+1+4+3+1+1+3+9+1+1+3)÷12 = 30/12 = 2.5; 

 

key01234567891011121314
count11312111098765432  

查找失败得平均长度:(1+13+12+11+10+9+8+7+6+5+4+3+2)÷13 = 7

 

 

ps:查找失败得平均长度分母是MOD后面得数也就是13

(2)

链地址法:

查找成功的平均长度:(1×6+2×4+3×1+4×1)÷12 = 21/12;

查找失败的平均长度:(1+5+1+3+1+1+3+2+1+1+3+2+1)÷13 = 25/13; 

ps:它的分母也是mod后面的数13 ,并且查的范围是0-12

 

线性探测法例题

将关键字序列(14、15、9、4、16、2、21)散列存储到散列表中。散列表的存储空间是一个下标从0开始的一维数组。散列函数为: H(key) = (key x 3) MOD 7,处理冲突采用线性探测再散列法,要求装填因子为0.7。
(1) 请画出所构造的散列表;
(2) 分别计算等概率情况下查找成功和查找不成功的平均查找长度。

当时由于老师让及时做出来,就有点匆忙,能懂哪个意思就行

链地址法例题

题目
将关键字序列{1 13 12 34 38 33 27 22} 散列存储到散列表中。散列函数为:H(key)=key mod 11,处理冲突采用链地址法,求在等概率下查找成功和查找不成功的平均查找长度

1mod11=1,所以数据1是属于地址1
13mod11=2,所以数据13是属于地址2
12mod11=1,所以数据12也是属于地址1(这个数据是数据1指针的另一个新数据)
34mod11=1,所以数据34是属于地址1(这个数据是数据12指针的另一个新数据)
38mod11=5,所以数据38是属于地址5
33mod11=0,所以数据33是属于地址0
27mod11=5,所以数据27是属于地址5,(这个数据是数据38指针的另一个新数据)
22mod11=0,所以数据22是属于地址0,(这个数据是数据33指针的另一个新数据)

链地址法处理冲突构造所得的哈希表如下:


查找成功时: ASL=(3×1+2×3+1×4)/8=13/8,

查找不成功时:ASL=(3+4+2+1+1+3+1+1+1+1+1)/11=19/11;或者 ASL=(7×1+1×2+2×3+1×4 )/11=19/11,


 

网上一些博客错误的指正

 这个里面的一个解释是错的

 

这个地址就是9

这个也是有错的

全部少加一个1

  • 24
    点赞
  • 125
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
好的,我来为您解答这个问题。 根据您提供的信息,我们可以使用哈希表来实现对关键字55查找。具体步骤如下: 1. 定义哈希表的结构体,包括哈希表的大小、存储数据的数组、哈希函数等信息。 2. 实现哈希函数,将关键字映射到哈希表中的位置。在本例中,我们可以使用除留余数法作为哈希函数,即hash(x) = x % size,其中x为关键字,size为哈希表的大小。 3. 实现哈希表的插入、删除和查找等操作。其中,查找操作需要根据哈希函数计算关键字哈希表中的位置,然后判断该位置上是否存储了关键字。如果是,返回该位置;否则继续查找,直到找到该关键字或者发现该位置为空。 下面是一个示例代码,用来实现对关键字55查找: ```c #include <stdio.h> #include <stdlib.h> #define TABLE_SIZE 12 typedef struct { int key; int value; } Node; typedef struct { Node *nodes; int size; } HashTable; int hash(int key) { return key % TABLE_SIZE; } HashTable *create_table(int size) { HashTable *table = (HashTable *)malloc(sizeof(HashTable)); table->size = size; table->nodes = (Node *)calloc(size, sizeof(Node)); return table; } void insert(HashTable *table, int key, int value) { int pos = hash(key); while (table->nodes[pos].key != 0) { pos = (pos + 1) % table->size; } table->nodes[pos].key = key; table->nodes[pos].value = value; } int search(HashTable *table, int key) { int pos = hash(key); int count = 0; while (table->nodes[pos].key != 0) { if (table->nodes[pos].key == key) { printf("%d在哈希表位置%d,共比较%d次查询成功。\n", key, pos, count + 1); return pos; } pos = (pos + 1) % table->size; count++; } printf("%d在哈希表中不存在。\n", key); return -1; } int main() { HashTable *table = create_table(TABLE_SIZE); insert(table, 19, 1); insert(table, 14, 2); insert(table, 23, 3); insert(table, 01, 4); insert(table, 68, 5); insert(table, 20, 6); insert(table, 84, 7); insert(table, 27, 8); insert(table, 55, 9); insert(table, 11, 10); insert(table, 10, 11); insert(table, 79, 12); search(table, 55); return 0; } ``` 在这个示例代码中,我们先创建了一个大小为12的哈希表,并将元素值插入到哈希表中。接着,使用search函数来查找关键字55哈希表中的位置。在search函数中,我们使用线性探测法来解决哈希冲突的问题,并记录比较次数。 根据示例代码的输结果来看,在哈希表查找关键字55成功,它的位置在5,共比较了3次。 希望这个回答能够解决您的问题。如有其他疑问,欢迎随时提

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值