算法与数据结构(C++语言版)(冯广慧第2版)习题及答案 第11章课后习题答案.docx

算法与数据结构(C++语言版)(冯广慧第2版)习题及答案 第11章课后习题答案.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
PAGE PAGE 2 习题答案 一、选择题 1-5:D,C,D,D,DC 二、填空题 小于等于表长的最大素数或不包含小于20的质因子的合数 n/m (1)13 (2)0..12 (3)4 三、判断题 1-5:对错错对错 四、应用题 如何衡量散列函数的优劣?简要叙述散列表技术中的冲突概念,并指出三种解决冲突的方法。 【解答】评价散列函数优劣的因素有:能否将关键字均匀影射到散列空间上,有无好的解决冲突的方法,计算散列函数是否简单高效。由于散列函数是压缩映像,冲突难以避免。 解决冲突的方法见线性探测、二次探测、拉链法等。 2、设有一组关键字{9,1,23,14,55,20,84,27},采用散列函数:H(key)=key % 7 ,表长为10,用开放地址法的二次探测再散列方法Hi=(H(key)+di) % 10(di=12,22,32,…,)解决冲突。要求:对该关键字序列构造散列表,并计算查找成功的平均查找长度。 【解答】 散列地址 0 1 2 3 4 5 6 7 8 9 关键字 14 1 9 23 84 27 55 20 比较次数 1 1 1 2 3 4 1 2 平均查找长度:ASLsucc=(1+1+1+2+3+4+1+2)/8=15/8 以关键字27为例:H(27)=27%7=6(冲突) H1=(6+1)%10=7(冲突) H2=(6+22)%10=0(冲突) H3=(6+33)%10=5 所以比较了4次。 3、对下面的关键字集合{30,15,21,40,25,26,36,37},若查找表的装填因子为0.8,采用线性探测再散列方法解决冲突。要求: (1)设计散列函数; (2)画出散列表; (3)计算查找成功和查找失败的平均查找长度。 【解答】由于装填因子为0.8,关键字有8个,所以表长为8/0.8=10。 (1)用除留余数法,散列函数为H(key)=key % 7 (2) 散列地址 0 1 2 3 4 5 6 7 8 9 关键字 21 15 30 36 25 40 26 37 比较次数 1 1 1 3 1 1 2 6 (3)计算查找失败时的平均查找长度,必须计算不在表中的关键字,当其散列地址为i时的查找次数。散列地址为i的失败比较次数是从i开始往右循环数到没有数据的位置。一般说计算时的分母是表长m。但在本例中,因为散列函数是H(key)=key % 7,散列地址只能是0~6,所以分母是7,而不应当用10。 故查找失败和查找成功时的平均查找长度分别为: ASLunsucc=(9+8+7+6+5+4+3)/7=42/7=6 ASLsucc =16/8=2 4、设散列函数H(k)=3K % 11,散列地址空间为0~10,对关键字序列(32,13,49,24,38,21,4,12)按下述两种解决冲突的方法构造散列表:(1)线性探测再散列 (2)链地址法, 并分别求出等概率下查找成功时和查找失败时的平均查找长度。 【解答】.(1) 散列地址 0 1 2 3 4 5 6 7 8 9 10 关键字 4 12 49 38 13 24 32 21 比较次数 1 1 1 2 1 2 1 2 ASLsucc =(1+1+1+2+1+2+1+2)/8=11/8 ASLunsucc=(1+2+1+8+7+6+5+4+3+2+1)/11=40/11 (2) ASLsucc =(1*5+2*3)/8=11/8 ASLunsucc=(1*6+2*2+3*3)/11=19/11 五、算法设计题 已知某散列表HT的装填因子小于1,散列函数H(key)为关键字的第一个字母在字母表中的序号。(1)处理冲突的方法为线性探测再散列。编写按第一个字母的顺序输出散列表中所有关键字的算法。处理冲突的方法为链地址法。(2)编写一个计算在等概率情况下查找不成功的平均查找长度的算法。 【题目分析】 本题未直接给出散列表表长,但已给出装填因子小于1,且散列函数H(k)为关键字第一个字母在字母表中的序号,字母‘A’的序号为1,表长可设为n(n≥27),而链地址法中,表长26。查找不成功是指碰到空指针为止(另一种观点是空指针不计算比较次数)。 (1)void Print(rectype h[])∥按关键字第一个字母在字母表中的顺序输出各关键字 {int i,j; for(i=1;i≤26;i++) ∥ 散列地址1到26 {j=1;printf(“\n”); while(h[j]!=null) ∥ 设散列表初始值为null {if(ord(h[j])==i)∥ ord()取关键字第一字母在字母表中的序号 printf(“%s”,h[j]); j=(j+1)% n; }∥while

文档评论(0)

balala11 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档