打赏

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 }

 

posted @ 2019-04-15 20:50  Onebelieve  阅读(266)  评论(0编辑  收藏  举报