【1078 25 二次探测】 Hashing
传送门
题意
给定一个哈希函数值\(k\)序列长度\(n\),哈希函数为模\(k\),冲突则用二次平方法搜索,\(k\)要为质数如果不是就换成大于\(k\)的最小的一个质数,计算经过哈希后的下标,如果不能插入输出-
数据范围
\(k\leq 10^{4}\)
\(n\leq k\)
题解
- 二次平方即每次都在原来的哈希值上加\(1^{2},2^{2},3^{2},\cdots\)
- 按照平方检测的定义依次插入即可
Code
#include<bits/stdc++.h>
using namespace std;
int n,k,ht[10010];
bool is_prime(int x){
if(x==1) return 0;
for(int i=2;i<=x/i;i++) if(x%i==0) return 0;
return 1;
}
void insert(int x){
int idx=x%k,tidx=idx;
for(int j=0;j<n;j++){
if(ht[tidx]) tidx=(idx+j*j)%k;
else {
cout<<tidx;
ht[tidx]=x;
return;
}
}
cout<<'-';
}
int main(){
cin>>k>>n;
while(!is_prime(k)) k++;
for(int i=0;i<n;i++) {
int x; cin>>x;
if(i!=0) cout<<' ';
insert(x);
}
}

浙公网安备 33010602011771号