哈希表
对于哈希表的解释,我推荐看这篇文章
哈希表
我在这里就不再赘述了,看OJ的题目吧
两道题一个是用链地址法,一个的开放定址法,其实都差不多,这里我教大家一个取巧的方法。
用数组模拟链表,链地址法是尾插法,开放定址法就是头插法。
也就是说,如果你的链表是顺序输入,那么链地址法就是倒序查找,开放定址法就是顺序查找。
如果你会离散化的话,那就更没问题了,我直接放代码,大家找找不同吧。
链地址法
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#define int long long
#define fr(i,a,b) for(int i=(a);i<(b);i++)
using namespace std;
int a[1000][1000];
signed main(){
int n;
cin >> n;
int k;
cin >> k;
fr(i,0,n){
int x;
cin >> x;
if(a[x%k][0]==0){
a[x%k][0]=x;
}
else{
int j=0;
while(a[x%k][j]!=0){
j++;
}
a[x%k][j]=x;
}
}
int m;
cin >> m;
int j = 0;
int cnt = 1;
while(a[m%k][j]!=0){
j++;
}
if(a[m%k][0]==m){
cout << m%k << "," << 1;
return 0;
}
while(j>0&&a[m%k][j]!=m){
j--;
cnt++;
}
if(a[m%k][j]==m){
cout << m%k << "," << cnt;
}
else{
cout << -1;
}
}
开放定址法
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#define int long long
#define fr(i,a,b) for(int i=(a);i<(b);i++)
using namespace std;
int a[1000][1000];
signed main(){
int k;
cin >> k;
int n;
cin >> n;
fr(i,0,n){
int x;
cin >> x;
if(a[x%k][0]==0){
a[x%k][0]=x;
}
else{
int j=0;
while(a[x%k][j]!=0){
j++;
}
a[x%k][j]=x;
}
}
int m;
cin >> m;
int j = 0;
int cnt = 1;
while(a[m%k][j]!=m&&a[m%k][j]!=0){
cnt++;
j++;
}
if(a[m%k][j]==m){
cout << m%k << "," << cnt;
}
else{
cout << -1;
}
}