swust oj 1013
哈希表(开放定址法处理冲突)
1000(ms)
10000(kb)
2698 / 6177
采用除留余数法(H(key)=key %n)建立长度为n的哈希表,处理冲突用开放定址法的线性探测。
输入
第一行为哈希表的长度n; 第二行为关键字的个数; 第三行为关键字集合; 第三行为要查找的数据。
输出
如果查找成功,输出关键字所哈希表中的地址和比较次数;如果查找不成功,输出-1。
样例输入
13 11 16 74 60 43 54 90 46 31 29 88 77 16
样例输出
3,1
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstdlib> 5 #include<cstring> 6 #include<cmath> 7 #include<list> 8 #define rep(i,a,b) for(int i=a;i<b;i++) 9 #define NULLKEY -1 10 #define DELKEY -2 11 using namespace std; 12 typedef int KeyType; 13 typedef struct{ 14 KeyType key; 15 int count; 16 }HashTable; 17 18 void InsertHT(HashTable ha[],int &n,int m,int p,KeyType k) 19 { 20 int i,adr; 21 adr=k%p; 22 if(ha[adr].key==NULLKEY||ha[adr].key==DELKEY) 23 { 24 ha[adr].key=k; 25 ha[adr].count=1; 26 } 27 else 28 { 29 i=1; 30 do{ 31 adr=(adr+1)%m; 32 i++; 33 }while(ha[adr].key!=NULLKEY&&ha[adr].key!=DELKEY); 34 ha[adr].key=k; 35 ha[adr].count=i; 36 } 37 n++; 38 } 39 40 void creatHT(HashTable ha[],int &n,int m,int p,KeyType keys[],int nl) 41 { 42 rep(i,0,m) 43 { 44 ha[i].key=NULLKEY; 45 ha[i].count=0; 46 } 47 n=0; 48 rep(i,0,nl) 49 InsertHT(ha,n,m,p,keys[i]); 50 } 51 52 bool DeleteHT(HashTable ha[],int &n,int m,int p,KeyType k) 53 { 54 int adr; 55 adr=k%p; 56 while(ha[adr].key!=NULLKEY&&ha[adr].key!=k) 57 adr=(adr+1)%m; 58 if(ha[adr].key==k) 59 { 60 ha[adr].key=DELKEY; 61 return true; 62 } 63 else 64 return false; 65 } 66 67 void serchHT(HashTable ha[],int m,int p,KeyType k) 68 { 69 int i=1,adr; 70 adr=k%p; 71 while(ha[adr].key!=NULLKEY&&ha[adr].key!=k) 72 { 73 i++; 74 adr=(adr+1)%m; 75 } 76 if(ha[adr].key==k) 77 cout<<k%p<<","<<i; 78 else 79 cout<<"-1"; 80 } 81 82 int main() 83 { 84 int m,n,k,x; 85 KeyType keys[1000]; 86 HashTable ha[100]; 87 cin>>m>>n; 88 rep(i,0,n) 89 cin>>keys[i]; 90 cin>>k; 91 creatHT(ha,x,m,m,keys,n); 92 serchHT(ha,m,m,k); 93 rep(i,0,n) 94 DeleteHT(ha,x,m,m,keys[i]); 95 return 0; 96 }