資料結構實驗之查詢五:平方之雜湊表 (SDUT 3377)
阿新 • • 發佈:2018-12-11
Hash表的平方探測思路:如果當前這個沒存放數值,就放進去,如果當前這個地方Hash [ i ] 已經有數值了,就以平方的間隔左右尋找沒有存放數的空白 Hash [ i ]。
#include <bits/stdc++.h> using namespace std; const int inf = 0x3f3f3f3f; int a[2000]; int Hash[2000]; int main() { int n,p; while(~scanf("%d%d",&n,&p)) { for(int i = 0; i < n; i ++) { scanf("%d",&a[i]); } memset(Hash,inf,sizeof(Hash)); //初始化一下。 for(int i = 0; i < n; i ++) { int d = a[i] % p; if(Hash[d] == inf) // 如果這個地方沒有存放資料,可以存放 { Hash[d] = a[i]; a[i] = d; //裡面更改成存放 a[i] 的下標值 } else { for(int j = 1; ; j ++) // 正反向尋找 { int tm = j * j; if(Hash[(d + tm)%p] == inf) // 記住別忘記 MOD p ,因為可能會超過給的表的長度 { Hash[(d + tm)%p] = a[i]; a[i] = (d + tm)%p; break; } else if(Hash[(d -tm)%p] == inf) { Hash[(d - tm)%p] = a[i]; a[i] = (d - tm)%p; break; } } } } for(int i = 0; i < n; i ++) { if(i == 0)printf("%d",a[i]); else printf(" %d",a[i]); } printf("\n"); } return 0; }