第九章查找 习题解答

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第九章查找 习题解答

9.5 画出对长度为10的有序表进行折半查找的判定树,并求其等概率时查找成功的平

均查找长度。 解:求得的判定树如下:

5

710

9

6

4

3

1

8

2

ASL 成功=(1+2*2+4*3+3*4)/10 =2.9 9.9

已知如下所示长度为12的表(Jan,Feb,Mar,Apr,May,June,July,Aug,Sep,Oct,Nov,Dec )

(1)试按表中元素的顺序依次插入一查初始为空的二叉排序树,画出插入完成之后的二

叉排序树,并求其在等概率的情况下查找成功的平均查找长度。

(2)若对表中元素先进行排序构成有序表,求在等概率的情况下对此有序表进行折半查

找时查找成功的平均查找长度。 解:(1)求得的二叉排序树如下图所示:

Jan

Feb Mar

Apr Aug Dec June July

May

Sept

Oct

Nov

在等概率情况下查找成功的平均查找长度为:

ASL 成功=(1+2*2+3*3+4*3+5*2+6*1)/12=42/12=3.5

(2)

分析:对表中元素进行排序后,其实就变成了对长度为12的有序表进行折半查找了,那么在等概率的情况下的平均查找长度只要根据折半查找的判定树就很容易求出。

长度为12的有序表进行折半查找的判定树如下图所示:

6

8

12

11

7

5

4

1

9

32

10

所以可求出:

ASL 成功=(1+2*2+4*3+5*4)/12=37/12

9.19 选取哈希函数H(k)=(3k) MOD 11。用开放定址法处理冲突,di=i((7k)MOD 10

+1)(i=1,2,3,…)。试在0~10的散列地址空间中对关键字序列(22,41,53,46,30,13,01,67)造哈希表,并求等概率情况下查找成功时的平均查找长度。 解:因为H(22)=0;

H(41)=2; H(53)=5; H(46)=6;

H(30)=2;H 1(30)=3; H(13)=6;H 1(13)=8;

H(01)=3;H 1(01)=0;H 2(01)=8;H 3(01)=5;H 4(01)=2;H 5(01)=10 H(67)=3;H 1(67)=2;H 2(67)=1 所以:构造的哈希表如下图所示:

并求得等概率情况下查找成功的平均查找长度为: ASL 成功=(1*4+2*2+3+6)/8=17/8

9.21 在地址空间为0~16的散列区中,对以下关键字序列构造两哈希表: (Jan,Feb,Mar,Apr,May,June,July,Aug,Sep,Oct,Nov,Dec ) (1)用线性探测开放定址法处理冲突; (2)用链地址法处理。

并分别求这两个哈希表在等概率情况下查找成功和不成功时的平均查找长度。设哈希函数为H(x)=i/2取整,其中i 为关键字中第一个字母在字母表中的序号。 解:(1)因为:

H(Jan)=5; H(Feb)=3; H(Mar)=6; H(Apr)=0;

H(May)=6; H 1(May)=7;

H(June)=5;H 1(June)=6;H 2(June)=7;H 3(June)=8

H(July)=5;H 1(July)=6;H 2(July)=7;H 3(July)=8;H 4(July)=9; H(Aug)=0; H 1(Aug)=1

H(Sep)=9; H 1(Sep)=10

H(Oct)=7; H 1(Oct)=8;H 2(Oct)=9; H 3(Oct)=10; H 4(Oct)=11;

H(Nov)=7; H 1(Nov)=8;H 2(Nov)=9; H 3(Nov)=10; H 4(Nov)=11;H 5(Nov)=12; H(Dec)=2

所以,用线性探测开放定址法处理冲突构造的哈希表如下图所示:

并求得:ASL 成功=(1*5+2*3+4+5*2+6)/12=31/12

ASL 不成功=(5+4+3+2+1+9+8+7+6+5+4+3+2+1)/14=60/14 (2)用链地址法处理冲突构造的哈希表如下图所示:

并求得:

ASL 成功=(1*7+2*4+3)/12=18/12

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

ASL不成功=(1*3+2*3+3)14=12/14

9.25 假设顺序表按关键字自大至小有序,试改写教科书9.1.1节中的顺序查找算法,

将监视哨设在高下标端。然后画出描述此查找过程的判定树,分别求出等概率下查找成功和不成功的平均查找长度。

解:(1)顺序表的存储结构描述:

Typedef struct {

Keytype key;

}Elemtype; //记录类型;

typedef struct {

Elemtype *elem;

int length;

}SSTable; //顺序表类型;

按要求所得算法如下:

int Search(SSTable ST, Keytype key)

{ ST.elem[ST.length].key=key;

for (i=0; key

if (i==ST.length) return 0;

else if (key==ST.elem[i].key) return i;

else return 0;

}

(2)按此查找过程的判定树如下图所示:

1

2

3

n

(3)等概率下的查找成功与查找不成功的平均查找长度分别为:、

ASL成功=(1+2+3+….+n)/n=(n+1)/2

ALS不成功=(1+2+3+…+n)/(n+1)=(n+2)/2

补充:

设散列表的长度为13,散列函数为H(K)=K%13,给定的关键字序列为: 19,14,23,01,68,20,84,27,55,11,10,79。试画出分别用拉链法和线性探查法解决冲突时所构造的散列表,并求出在等概率情况下,求这两种方法的查找成功和查找不成功的平均查找长度。

解:(1)用拉链法处理冲突:

因为:H(19)=6;H(14)=1;H(23)=10;H(01)=1;H(68)=3;H(20)=7;

相关文档
最新文档