【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);
	}
}
posted @ 2021-03-04 22:08  Hyx'  阅读(75)  评论(0)    收藏  举报