登录
|
注册
公司
标签
文章
搜索
经典指数
高级结构
类别
公司
职位
年份
其他
添加
原因
删除
691
浏览数
0
收藏数
在用除余法作为散列函数、线性探测解决冲突的散列表中,写一删除关键字的算法,要求将所有可以前移的元素前移去填充被删除的空位,以保证探测序列不致于断裂。
还没有评论
分享到:
举报
纠错
0
/
512字
选择纠错区域
题目内容有错
题目标签有错
提交纠错
切换
提交评论
请先
登录
后评论.
1 个答案
0
0
[题目分析]首先计算关键字的散列地址,若该地址为空,则空操作;若该地址有关键字,但与给定值不等,则用解决冲突的方法去查找给定值;若该地址有关键字且与给定值相等,则实行删除。题目要求将所有可以前移的元素前移去填充被删除的空位,以保证探测序列不断裂。由于用线性探测解决冲突,设被删除元素的散列地址为i,则其余m-1(m为表长)个位置均可能是同义词。查找同义词的操作直到碰到空地址或循环一圈回到i才能结束。为了提高算法效率,减少数据移动,应将最后一个同义词前移填充被删除关键字。 void HsDelete(rectype HS[],K) //在以除余法为散列函数、线性探测解决冲突的散列表HS中,删除关键字K {i=K % P; // 以造表所用的除余法计算关键字K的散列地址 if(HS[i]==null){printf(“散列表中无被删关键字”);exit(0);} // 此处null代表散列表初始化时的空值 switch {case HS[i]==K:del(HS,i,i,K);break; case HS[i]!=K:di=1;j=(i+ di)%m; // m为 表长 while(HS[j]!=null && HS[j]!=K && j!=i)// 查找关键字K {di=di+1; j=(i+di)%m; }// m为 表长if(HS[j]==K)del(HS,i,j,K);else {printf(“散列表中无被删关键字”);exit(0);} }// switch }算法结束 void del(rectype HS[],in i,int j,rectype K)//在散列表HS中,删除关键字K,K的散列地址是i,因解决冲突而将其物理地置于表中j。算法查找关键字K的同义词,将其最后一个同义词移到位置j,并将其同义词的位置置空。 {di=1;last=j;x=(j+di)% m;// 探测地址序列,last记K的最后一个同义词的位置 while(x!=i) //可能要探测一圈 {if(HS[x]==null)break; // 探测到空位置,结束探测 else if(HS[x]%P==i)last=x;// 关键字K的同义词 di=di+1;x=(j+di) % m; // 取下一地址探测 } HS[j]=HS[last]; HS[last]=null; //将哈希地址last的关键字移到哈希地址j} [ 算法讨论] 由于用线性探测解决冲突,可能发生“二次聚集”(两个第一哈希地址不同的记录争夺同一后继哈希地址)。象上面这样处理后,对于哈希地址为i的记录没有问题了,但由于将地址j置空,有可能截断了其它记录的探测通路。最明显的是哈希地址为j的记录就查不到了。解决的办法是继续调整,直到当前哈希表中的每个记录的查找都是正确的为止。这里不再深入讨论。
还没有评论
举报
切换
提交评论
请先
登录
后评论.
撰写答案
提交回答
通往牛逼的路上,请先登录!
扫描后移动端查看本题
我也分享一个题目
×
登录
注册
找回密码
记住登录
登录
快速注册
直接第三方登录
×
保存答案