☆1078

 开放定址法中的平方探测法使用时是有条件的。对于本题,存在hash不满,但始终无法填入key的情况。

当  step >= msize 时,若还找不到空位,便不可能找到了。

 1 #include <iostream>
 2 #include <cmath>
 3 #include <cstdio>
 4 using namespace std;
 5 
 6 bool isprime(int x){
 7     if(x<=1)return false;
 8     for(int i=2;i<=sqrt(x);i++){
 9         if(x%i==0)return false;
10     }
11     return true;
12 }
13 bool address[10010];
14 
15 int main()
16 {
17     int msize, n;
18     cin>>msize>>n;
19     if(isprime(msize)==false){
20         for(int i=msize+1;;i++){
21             if(isprime(i)){
22                 msize=i;
23                 break;
24             }
25         }
26     }
27 
28 
29     for(int i=0;i<n;i++){
30         int key;
31         cin>>key;
32         if(address[key%msize]==false){
33             address[key%msize]=true;
34             printf("%d",key%msize);
35         }
36         else{
37             //碰撞测试
38             int step=1;
39             while(step<msize){
40                 if(address[(key+step*step)%msize]==false){
41                     address[(key+step*step)%msize]=true;
42                     printf("%d",(key+step*step)%msize);
43                     break;
44                 }
45                 step++;
46             }
47             if(step==msize)printf("-");
48         }
49         if(i<n-1)printf(" ");
50     }
51 
52     return 0;
53 }

 

posted on 2019-02-24 13:51  Vitavi  阅读(81)  评论(0编辑  收藏  举报

导航