算法与数据结构(C++语言版)(第2版) 第11章课后习题答案_第1页
算法与数据结构(C++语言版)(第2版) 第11章课后习题答案_第2页
算法与数据结构(C++语言版)(第2版) 第11章课后习题答案_第3页
算法与数据结构(C++语言版)(第2版) 第11章课后习题答案_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGEPAGE2习题答案一、选择题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,…,)解决冲突。要求:对该关键字序列构造散列表,并计算查找成功的平均查找长度。【解答】散列地址0123456789关键字14192384275520比较次数11123412平均查找长度: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)散列地址0123456789关键字2115303625402637比较次数11131126(3)计算查找失败时的平均查找长度,必须计算不在表中的关键字,当其散列地址为i时的查找次数。散列地址为i的失败比较次数是从i开始往右循环数到没有数据的位置。一般说计算时的分母是表长m。但在本例中,因为散列函数是H(key)=key%7,散列地址只能是0~6,所以分母是7,而不应当用10。故查找失败和查找成功时的平均查找长度分别为:ASLunsucc=(9+8+7+6+5+4+3)/7=42/7=6ASLsucc=16/8=24、设散列函数H(k)=3K%11,散列地址空间为0~10,对关键字序列(32,13,49,24,38,21,4,12)按下述两种解决冲突的方法构造散列表:(1)线性探测再散列(2)链地址法,并分别求出等概率下查找成功时和查找失败时的平均查找长度。【解答】.(1)散列地址012345678910关键字412493813243221比较次数11121212ASLsucc=(1+1+1+2+1+2+1+2)/8=11/8ASLunsucc=(1+2+1+8+7+6+5+4+3+2+1)/11=40/11(2)ASLsucc=(1*5+2*3)/8=11/8ASLunsucc=(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)voidPrint(rectypeh[])∥按关键字第一个字母在字母表中的顺序输出各关键字{inti,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}∥for}∥end(2)intASLHash(rectypeh[])∥链地址解决冲突的散列表查找不成功时平均查找长度{inti,j;count=0;∥记查找不成功的总的次数LinkedListp;for(i=1;i≤26;i++){p=h[i];j=1;∥按我们约定,查找不成功指到空指针为止。while(p!=null){j++;p=p->next;}count+=j;}return(count/26.0);}【注】值得指出,对用拉链法求查找失败时的平均查找长度有两种观点。其一,认为比较到空指针算失败。例如,若本题散列地址h[i](1≤i≤26)为空指针,则认为比较1次失败;若散列地址h[i](1≤i≤26)为非空指针,例如,h[i](1≤i≤26)链表中只有一个结点,则认为比较2次后失败,我们持这种观点。还有另一种观点:他们认为只有和关键字比较才计算比较次数,而和空指针比较不计算比较次数。照这种观点,上面两种情况失败时的比较次数分别为0和1。有一个100*100的稀疏矩阵,其中1%的元素为非零元素,现要求用散列表作存储结构。(1)请设计一个散列表(2)请写一个对你所设计的散列表中给定行值和列值存取矩阵元素的算法;并对算法所需时间和用一维数组(每个分量存放一个非零元素的行值、列值和元素值)作存储结构时存取元素的算法进行比较。【题目分析】非零元素个数是100,负载因子取0.8,表长125左右,取表长p为127,散列地址为0到126。散列函数用H(k)=(3*i+2*j)%127,i,j为行值和列值。#definem127typedefstruct{inti,j;ElemTypev;}triple;voidCreatHT(tripleH[m])∥生成稀疏矩阵的散列表,表中元素值初始化为0{for(k=0;k<100;k++){scanf(&i,&j,&val);∥设元素值为整型h=(3*i+2*j)%m;∥计算散列地址while(HT[h].v!=0))h=(h+1)%m;∥线性探测散列地址HT[h].i=i;HT[h].j=j;HT[h].v=val;∥非零元素存入散列表}∥for}∥算法CreatHT结束ElemTypeSearch(tripleHT[m],inti,i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论