哈希表查找不成功的平均查找长度题目是:将关键字序列(7、8、30、11、18、9、14)散列存储到散列表中。散列表的存储

pikmon2022-10-04 11:39:541条回答

哈希表查找不成功的平均查找长度
题目是:将关键字序列(7、8、30、11、18、9、14)散列存储到散列表中。散列表的存储空间是一个下标从0开始的一维数组,散列函数为: H(key) = (keyx3) MOD 7,处理冲突采用线性探测再散列法,要求装填(载)因子为0.7。
(1) 请画出所构造的散列表。
(2) 分别计算等概率情况下查找成功和查找不成功的平均查找长度。
前面那个画表和查找成功的长度,都不是问题,成功的长度也好理解,就是一次成功和一次没成功多挪了几次的相加除以总数就行了。
问题是这个不成功的平均长度:
接下来讨论不成功的情况, 看表2,计算查找不成功的次数就直接找关键字到第一个地址上关键字为空的距离即可, 但根据哈希函数地址为MOD7,因此初始只可能在0~6的位置。等概率情况下,查找0~6位置查找失败的查找次数为:
看地址0,到第一个关键字为空的地址2的距离为3,因此查找不成功的次数为3.
地址1, 到第一个关键为空的地址2的距离为2,因此查找不成功的次数为2.
地址2, 到第一个关键为空的地址2的距离为1,因此查找不成功的次数为1.
地址3,到第一个关键为空的地址4的距离为2,因此查找不成功的次数为2.
地址4,到第一个关键为空的地址4的距离为1,因此查找不成功的次数为1.
地址5,到第一个关键为空的地址2(注意不是地址9,因为初始只可能在0~6之间,因此循环回去)的距离为5,因此查找不成功的次数为5.
地址6,到第一个关键为空的地址2(注意不是地址9,因为初始只可能在0~6之间,因此循环回去)的距离为4,因此查找不成功的次数为4.
因此查找不成功的次数表如下表所示
Key 7 8 30 11 18 9 14
Count 3 2 1 2 1 5 4
我表示这段看的莫名其妙,完全不知道在说什么。
到底所谓的地址是哪个?为什么第一个地址为3后第二个2?怎么想的?

已提交,审核后显示!提交回复

共1条回复
xuyaoting 共回答了15个问题 | 采纳率80%
所谓地址是指散列函数的hash值
采用线性探测再散列法处理冲突,查询时,当遇到第一个为空时才能认为是查找失败
1年前

相关推荐

求高手帮忙14. 题目:哈希表查询设计及实现
求高手帮忙14. 题目:哈希表查询设计及实现
总体设计:设计哈希表,实现对英文单词的快速查找;
要求: (1)设计哈希表,该表应能够容纳50个英文单词。
(2)对该哈希表进行查询,实现对特定单词的快速查询,并显示经过的节点内容;百度已有的不给分,麻烦发邮箱!!谢谢了!!!发现可用不重复再追加100分!
caoaizhang1年前1
白马银枪2000 共回答了20个问题 | 采纳率95%
/*
(1)设计哈希表,该表应能够容纳50个英文单词。
(2)对该哈希表进行查询,实现对特定单词的快速查询,并显示经过的节点内容
已经发到你邮箱里了 enochwills@hotmail.com
*/
#include
#include
#include
#include
#include
#define szNAME 80
#define HASH_ROOT 47 /*用于计算哈希地址的随机数*/
#define szHASH 50 /*哈希表总长度*/
#define POPULATION 30 /*学生总数*/
/*哈希表结构体*/
struct THash {
int key; /*钥匙码*/
char name[10]; /*姓名*/
int depth; /*检索深度*/
};
/*根据钥匙码和哈希根计算哈希地址*/
int GetHashAddress(int key, int root)
{
return key % root;
}/*end GetHashAddress*/
/*冲突地址计算,如果发现地址冲突,则用当前地址和钥匙码、哈希根重新生成一个新地址*/
int GetConflictAddress(int key, int address, int root)
{
int addr = address + key % 5 + 1;
return addr % root;
}/*end GetConflictAddress*/
/*根据字符串生成哈希钥匙码,这里的方法是将串内所有字符以数值形式求累加和*/
int CreateKey(char * name)
{
int key = 0;
unsigned char * n = (unsigned char *)name;
while(*n) key += *n++;
return key;
}/*end CreateKey*/
/*输入一个名字,并返回哈希钥匙码*/
int GetName(char * name)
{
scanf("%s", name);
return CreateKey(name);
}/*end CreateKey*/
/*根据学生人数、长度和哈希根构造哈希表*/
struct THash * CreateNames(int size, int root, int population)
{
int i =0, key = 0, addr = 0, depth = 0; char name[10];
struct THash * h = 0, *hash = 0;
/*哈希根和长度不能太小*/
if(size < root || root < 2) return 0;
/*根据哈希表长度构造一个空的哈希表*/
hash = (struct THash *)malloc(sizeof(struct THash) * size);
/*将整个表清空*/
memset(hash, 0, sizeof(struct THash) * size);
for(i = 0; i < population; i++) {
/*首先产生一个随机的学生姓名,并根据姓名计算哈希钥匙码,再根据钥匙码计算地址*/
key = GetName(name);
addr = GetHashAddress(key, root);
h = hash + addr;
if (h->depth == 0) { /*如果当前哈希地址没有被占用,则存入数据*/
h->key = key;
strcpy(h->name , name);
h->depth ++;
continue;
}/*end if*/
/*如果
很高兴回答楼主的问题 如有错误请见谅
你确定第8题答案是C?8.以下与数据的存储结构无关的术语是( C ).A.循环队列 B.链表 C.哈希表 D.栈
西门张扬1年前1
longlong85 共回答了20个问题 | 采纳率90%
应该是D,栈只是一种后进先出的调度方式而已,与数据结构无关
入栈、出栈的可以是各种变量,甚至可以是当前运行环境
哈希表:二次探测再散列给定关键字集合{19,1,23,14,55,68,11,82,36}构造哈希表,设哈希函数为H(k
哈希表:二次探测再散列
给定关键字集合{19,1,23,14,55,68,11,82,36}构造哈希表,设哈希函数为H(key)=key MOD 11,表的长度为11,若采用线性探测再散列,则以下结果正确吗? 0 1 2 3 4 5 6 7 8 9 10 H(key) 55 1 23 14 68 11 82 36 19 那么采用二次探测再散列处理冲突的结果应该是怎样的(重点解释你是如何计算关键子11的位置的)?
ff的十三1年前1
凝碧旧池 共回答了16个问题 | 采纳率100%
h(19)=8,h(1)=1,h(23)=1->2,h(14)=3,h(15)=0,h(68)=2->3->4,h(11)=0->1->2->3->4->5,h(82)=5->6,h(36)=3->4->5->6->7线性探测正确 二次探测H(19)=8H(1)=1H(23)=1,h(23+1^2)=2H(14)=3H(55)=0H(68)=2,h(68+1^2)=3,h(68-1^2)=1,h(68+2^2)=6H(11)=0,h(11+1^2)=1,h(11-1^2)=10H(82)=5H(36)=3,h(36+1^2)=4
建立哈希表 及计算ASL值若已知哈希函数为: H(key)= key MOD 11, 哈希表长为m=13 请为一组关键字
建立哈希表 及计算ASL值
若已知哈希函数为: H(key)= key MOD 11,
哈希表长为m=13 请为一组关键字序列(19,68,20,84,27,55,11,10,79,14,23,1)建立哈希表.解决冲突的方法采用线性探测法.计算ASL的值.
希望高人给予指点,谢谢!
O耶o耶1年前1
ade3456 共回答了11个问题 | 采纳率100%
哈希表的建立:
key: 0 1 2 3 4 5 6 7 8 9 10 11 12
55 68 11 79 14 27 23 84 19 20 10 1
ASL=(1+1+1+1+1+1+3+2+2+6+11)/12
做此类题应注意哈希冲突函数怎么构建,此题采用线性探测法,即如果产生冲突方法为H+1一直到没有冲突为止。哈希表的建立,是依照key依次算对应的哈希码。
平均查找长度就是查找成功需要的次数除以总个数。答案自己算。这样的题自己多动手。看懂了的话要好评啊!呵呵。
设哈希函数为H(K)=KMOD7,哈希表的地址空间为0,...,6,开始时哈希表为空,用线性探测法解决冲突,请画出依次插
设哈希函数为H(K)=KMOD7,哈希表的地址空间为0,...,6,开始时哈希表为空,用线性探测法解决冲突,请画出依次插入键值23,14,9,6,30,12,18后的哈希表.
xyf00xyf1年前1
zhanggminxie 共回答了26个问题 | 采纳率88.5%
地址空间:0 1 2 3 4 5 6
23
14 23
14 23 9
14 23 9 6
14 23 9 30 6
14 23 9 30 12 6
14 18 23 9 30 12 6
用开放定址法求造哈希表并求成功时的平均查找长度(求解释详细谢谢)
用开放定址法求造哈希表并求成功时的平均查找长度(求解释详细谢谢)
选取哈希函数H(k)=(3k)mod11用开放定址法处理冲突di=i((7k)mod10+1)(i=1,2,3.)是在0~10的散列地址空间对关键字序列(22,41,53,46,30,13,01,67)造哈希表,并求等概率情况下查找成功时的平均查找长度.答案是17/8 怎么算都对不上很郁闷
aa艺人1年前1
Dennyhut 共回答了14个问题 | 采纳率100%
用线性探测法:发生冲突后,从该地址开始顺序向下一个地址探测,直到找到一个空的单元
H(22)=(22*3)mode 11=0
H(41)=(41*3)mode 11=2
H(53)=(53*3)mode 11=5
H(46)=(46*3)mode 11=6
H(30)=(30*3)mode 11=2,和 H(41)冲突,则探测下个地址:H1=(H(41)+1)mode 11=3;
H(13)=(13*3)mode 11=6,和H(46)冲突,则探测下个地址:H1=(H(13)+1)mode 11=7;
H(01)=3; 和H(30)冲突,则探测下个地址:H1=(H(01)+1)mode 11=4
H(67)=(67*3)mode 11=3,和H(01)冲突,则探测下个地址:H1=(H(67)+1)mode 11=4,和冲突,
则探测下个地址:H2=(H(01)+2)mode 11=5; 和H(53)冲突,继续探测:H3=6,和H(46)冲突,继续探测:H4=7,又冲突:H5=8;
则平均查找长度=(4*1+3*2+1*6)/8=2 答案应该是 2;我算几次了,不可能17/8,要不题目错了 方法是对
二次探测散列法设哈希表维14,哈希函数时H(key)=key%11,表中已有数据的关键字维15,38,61,84共四个,
二次探测散列法
设哈希表维14,哈希函数时H(key)=key%11,表中已有数据的关键字维15,38,61,84共四个,现要将关键字维49的结点加到表中,用二次探测再散列法解决冲突,则放入的位置是:
A、8 B、3 C、5 D、9
心如止水7141年前1
枫橡树 共回答了22个问题 | 采纳率95.5%
15,38,61,84除11的余数分别为4,5,6,7,没有重复,因此分别就放在这4个下标
49除11的余数为5,发生冲突,因为是二次探测,所以接下来分别探测+1, -1, +4, -4, +9, -9...
显然5 + 1, 5 - 1的位置都有冲突,5 + 4的位置没有冲突
所以最后放入的位置是9,也就是答案D
数据结构的这道选择题选哪个?8.下列说法正确的是:()A. 哈希表是解决排序的方法B. 图的结点关系是任意的,在拓扑排序
数据结构的这道选择题选哪个?
8.下列说法正确的是:()
A. 哈希表是解决排序的方法
B. 图的结点关系是任意的,在拓扑排序中,弧头结点可能会出现在弧尾结点之前
C. 图的广度优先搜索算法中采用了递归
D. 树是图的一种特殊形式
晴史1年前1
数我小美 共回答了16个问题 | 采纳率93.8%
很明显,正确的是D
哈希表主要用于查找;有向图的结点有些场合下关系不能是任意的,比如拓扑排序中弧头结点不可能会出现在弧尾结点之前;图的广度优先搜索算法一般采用队列实现;图是一般的数据结构形式,线性结构和树形结构都是图的一种特殊形式.
关于数据结构哈希表的问题假设一个哈希表包含 hash_size=13个元素,下标从0到12,并且需要将下列键映射到表格中
关于数据结构哈希表的问题
假设一个哈希表包含 hash_size=13个元素,下标从0到12,并且需要将下列键映射到表格中:10 100 32 45 58 126 3 29 200 400 0
运用%hash_size运算缩小这些键,确定它们的哈希地址并找出要发生多少冲突.
blueblack1年前1
wanghuaigu 共回答了22个问题 | 采纳率100%
10%13 = 10 存放在key=10的位置
100 %13 = 9 存放在key=9的位置
32%13 = 6 存放在key=6的位置
45%13 = 6 冲突,会有个冲突处理函数,这里以key = key+1 则放在key=7的位置
58%13 = 6 冲突,key+1 = 7 冲突,再加1 放在key=8的位置
126%13 = 8 放在key=8,冲突,放在key=9的位置
3%13 = 3 放在key=4的位置
29%13=3 冲突,4也冲突,放在key=5的位置
200%13 = 5 冲突,6 冲突,7 冲突,8 冲突,9冲突 放在key=10的位置
400%13 = 10 冲突,放在key=11的位置
0%13=0 放在key=0的位置.
哈希函数一般都要精心设计,尽量减少冲突次数,提高效率
自己数下有都少次冲突.
数据结构的简单问题已知哈希函数为H(key)=key%11,哈希表长度为13,用线性探测再散列的方法处理冲突.表中已依次
数据结构的简单问题
已知哈希函数为H(key)=key%11,哈希表长度为13,用线性探测再散列的方法处理冲突.表中已依次存放了关键字为22、12、24、30、52和43的6个记录,现将关键字63填入哈希表,其哈希地址是,给出具体求解过程
lantian19981年前1
我爱-夏天 共回答了21个问题 | 采纳率85.7%
依次计算已经存放各关键字的位置:
22 % 11 = 0
12 % 11 = 1
24 % 11 = 2
30 % 11 = 7
52 % 11 = 8
43 % 11 = 10
都没有发生冲突,其位置就是散列函数值
63 % 11 = 8
与52 发生冲突,按照线性探测再散列的方法处理冲突,先探查8 + 1 = 9,这个位置空,没有关键字冲突,因此哈希地址为9
一道求画出对应哈希表的数据结构习题,求解答..
一道求画出对应哈希表的数据结构习题,求解答..
已知一组关键字序列为(25,51,8,22,26,67,11,16,54,41),其散列地址空间为[0,…,12],若Hash函数定义为:H(key) = key MOD 13,采用线性探测法处理冲突,请画出它们对应的哈希表
轻风漫雨8881年前1
193771 共回答了16个问题 | 采纳率87.5%
由除余法的散列函数计算出的上述关键字序列的散列地址为(12,12,8,9,0,2,11,3,2,2)。
先插入25 T[12]的位置,51也是12,所以再探查(12+1) mod 13 = 0, 插入T[0]位置,8插入T[8],22插入T[9], 26插入T[0],发现被占,再探查(0+1) mod 13 =1,插入T[1], 67插入T[2],11插入T[11],16插入T[3],54插入T[2],发现T[2]被占,(2+1)mod 13 =3, T[3]依旧被占,再探查,(2+2)mod 13 =4,插入T[4],41发现T[2]被占,T[3] T [4]也被占,(2+3)mod 13 = 5,T[5]开放,插入,结果如下
地址空间 序列
0 51
1 26
2 67
3 16
4 54
5 41
6
7
8 8
9 22
10
11 11
12 25