PAT A1078 Hashing
Sample Input:
4 4
10 6 4 15
Sample Output:
0 1 4 -
-
思路 1:hash二次方探测:
规则:若冲突(设冲突位置为key),不断探测key+1*1、key+2*2...key+step*step
(step:从1一直取到size-1 ? 这里为啥…先挖个坑:以后有时间要总结下各种hash探测的规则和证明~ ~ ~ ~) -
code 1:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 10010;
bool has[maxn];
bool isPrime(int x){
if(x == 1) return false; //!!!:Wrpng 1:求素数不要忘了 0 1!有可能作为边界条件
for(int i = 2; i*i <= x; ++i)
if(x % i == 0) return false;
return true;
}
int getPrime(int x){
while(!isPrime(x)) x++;
return x;
}
vector<char> ans;
int main(){
int m_size, t_size, n, q, step;
scanf("%d %d", &m_size, &n);
t_size = getPrime(m_size);
bool flag;
for(int i = 0; i < n; ++i){
scanf("%d", &q);
if(i != 0) printf(" ");
int key = q % t_size;
//-------------搞麻烦了!!--------------------//见后面优化
if(has[key] == false){
has[key] = true;
printf("%d", key);
}else{
step = 1;
while(step < t_size){
int next =