資料結構實驗之查詢七:線性之雜湊表 (SDUT 3379)
阿新 • • 發佈:2018-12-16
#include <stdio.h> #include <string.h> #include <stdlib.h> int a[3500]; int Hash[3500]; int main() { int n,p,t; while(~scanf("%d%d",&n,&p)) { memset(Hash,-1,sizeof(Hash)); for(int i = 0; i < n; i ++) { scanf("%d", &a[i]); } for(int i = 0; i < n; i ++) { t = a[i] % p; if(Hash[t] == a[i]) a[i] = t; //如果在這個之前存過,而且沒有經過線性探測,就是存在的她自己,那麼就不用再找其他的了 else if(Hash[t] == -1) // 如果沒有數,也不用探測,直接存入 { Hash[t] = a[i]; a[i] = t; } else //如果這個位置有數了,就需要一個一個往後找 { for(t = t + 1;;t ++) { if(Hash[t % p] == a[i]) // 先判斷往後找的這個地方是不是已經存過這個數了,如果存過了,就不用再存放了 { a[i] = t % p; break; } if(Hash[t % p] == -1) //這個數第一次出現,需要存起來 { Hash[t%p] = a[i]; a[i] = t % 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; }