/*************************
题意:
手动模拟哈希表
该哈希表的大小必须是一个质数,如果不是,找一个比它大并且最近的质数做表长。
并且该哈希表是用 二次线性探测解决冲突的
即K = (k + i*i)%len ,注意,i<len !,即i大于等于表长后,才认为是找不到了
************************/
/***********************
解题思路:
模拟起来很简单,但是关键在于理解二次探测
注意点:
1. 0、1都是不是质数
2. 二次探测公式不要遗漏取余符号%
3. i>=n 时,才认为是查不到了
*************************/
/***********************
笔记:
*********************/
#include<iostream>
#include<stdio.h>
#include<string>
#include<vector>
#include<queue>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
#include<stack>
#include<map>
#include<set>
#include<unordered_map>
using namespace std;
#define M 12000
#define INF 0x7ffffff
int Hash[M];
bool jugeprim(int num){
if(num==0 || num == 1)
return false;
for(int i=2;i * i <=num; i ++ ){
if(num % i == 0)
return false;
}
return true;
}
int main(){
int n,m,len;
scanf("%d%d",&n, &m);
if(!jugeprim(n)){
while(!jugeprim(++n));
}
int i,j;
int num, k, K;
memset(Hash,0,sizeof(Hash));
for(i = 0;i < m;i++){
scanf("%d",&num);
k = num % n;
j = 1;
K = k;
while(j < n && Hash[K]!=0){
K = (k + j*j) % n;
j++;
}
if(j >= n)
printf("-");
else{
printf("%d",K);
Hash[K] = num;
}
if(i==m-1)
cout<<endl;
else cout<<" ";
}
return 0;
}
PAT 1078. Hashing (25) 哈希模拟, 二次线性探测公式, 质数判断
最新推荐文章于 2024-04-19 10:24:51 发布