Hash的二次探测,当hash的长度为n;插入val,当Hash[val]不为0时,选择新地址newval = val +(-) 1*1,val+(-)2*2,val+(-)(n-1)*(n-1);
具体例题见:PAT1078
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int Hash[100000+10]; bool isPrime(int n) { if(n<=1) return false; for(int i=2;i*i<=n;++i) if(n%i==0) return false; return true; } int main() { int tsize,n; scanf("%d%d",&tsize,&n); while(!isPrime(tsize)) ++tsize; bool bFirst = true; for(int i=0;i<n;++i) { int a; scanf("%d",&a); if(bFirst) bFirst = !bFirst; else printf(" "); int di; for(di=0;di<tsize;++di) { int add = (a+(di*di))%tsize; if(Hash[add]==0) { printf("%d",add); Hash[add] = 1; break; } } if(di >= tsize) printf("-"); } printf("\n"); return 0; }
PAT 1145,如果二次探测到n-1后还是没找到,还得加一次。
#include<iostream> #include<cstdio> #include<set> #include<map> #include<vector> #include<iterator> #include<algorithm> #include<cstring> using namespace std; bool isPrime(int n) { for(int i=2;i*i<=n;++i) if(n%i==0) return false; return true; } int getsize(int n) { while(!isPrime(n)) ++n; return n; } int main() { #ifndef ONLINE_JUDGE freopen("test.txt","r",stdin); #endif // ONLINE_JUDGE int msize,n,m; scanf("%d%d%d",&msize,&n,&m); msize = getsize(msize); int Hash[msize]; memset(Hash,0,sizeof(Hash)); for(int i=0;i<n;++i) { int a; scanf("%d",&a); int j; for(j=0;j<msize;++j) if(Hash[(a+j*j)%msize]==0) { Hash[(a+j*j)%msize] = a; break; } if(j>=msize) printf("%d cannot be inserted.\n",a); } int t = m,cnt=0; while(t--) { int a; scanf("%d",&a); for(int i=0;i<=msize;++i) { if(++cnt&&(Hash[(a+i*i)%msize]==a||(Hash[(a+i*i)%msize]==0))) break; } } printf("%.1lf\n",1.0*cnt/m); return 0; }