对下面的关键字集{30,15,21,40,25,26,36,37}若查找表的装填因子为0.8,采用线性探测再散列方法解决冲突,做:
(1)设计哈希函数;(2)画出哈希表;
(3)计算查找成功和查找失败的平均查找长度;(4)写出将哈希表中某个数据元素删除的算法;
由于装填因子为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(0≤i≤m-1)时的查找次数。本例中m=10。故查找失败时的平均查找长度为:
ASLunsucc= (9+8+7+6+5+4+3+2+1+1)/10=4.6 ASLsucc =16/8=2
(4)int Delete(int h[n],int k)
// 从哈希表h[n]中删除元素k,若删除成功返回1,否则返回0 {i=k%7;// 哈希函数用上面(1),即H(key)=key % 7if(h[i]== maxint)//maxint解释成空地址printf(“无关键字%d\n”,k);return (0);} if(h[i]==k){h[i]=-maxint ;return (1);} //被删元素换成最大机器数的负数 else // 采用线性探测再散列解决冲突 {j=i;
for(d=1;d≤n-1;d++) {i=(j+d)%n; // n为表长,此处为10 if(h[i]== maxint)return (0); //maxint解释成空地址if(h[i]==k){ h[i]=-maxint ;return (1);}}//for }
printf(“无关键字%d\n”,k);return (0) }