首页 > 试题广场 >

对下面的关键字集{30,15,21,40,25,26,36,

[问答题]

对下面的关键字集{30,15,21,40,25,26,36,37}若查找表的装填因子为0.8,采用线性探测再散列方法解决冲突,做:

1)设计哈希函数;(2)画出哈希表;

3)计算查找成功和查找失败的平均查找长度;(4)写出将哈希表中某个数据元素删除的算法;

解析:

由于装填因子为0.8,关键字有8个,所以表长为8/0.8=10

1)用除留余数法,哈希函数为Hkey=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)计算查找失败时的平均查找长度,必须计算不在表中的关键字,当其哈希地址为i0im-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)     }

发表于 2017-05-23 20:21:10 回复(2)