目录
1,题目描述
- distinct:确定无疑的; 确实的; 确切的;清晰的; 清楚的; 明白的; 截然不同的;
- quadratic:平方的,二次方的;
- prime:主要的; 首要的; 基本的; 质数;
Sample Input:
4 4
10 6 4 15
Sample Output:
0 1 4 -
题目描述
向哈希表中插入正数,利用平方探测法解决冲突,输出输入数据所在位置;
输入
- 第一行:初始哈希表的大小M,待插入数据数目N;
- 第二行:N个正数;
注意
- If the maximum size given by the user is not prime, you must re-define the table size to be the smallest prime number which is larger than the size given by the user:若哈希表的初始大小M不是质数,将其重新定义为比M大的最小质数;
- Then N distinct positive integers are given:N个不同的正数;
2,思路
- 检查哈希表初始规格是否为质数,不是则找出最小质数;
- 设计插入函数(简化主函数逻辑),并返回插入位置;
3,AC代码
参考了柳神的题解,进一步改进了代码:
#include<bits/stdc++.h>
using namespace std;
int M, N, num; //M初始大小 N数字个数
int table[10100] = {0}; //题目给的数据是正数 所以可用0表示没有
bool isPrime(int num){
if(num == 1) return false;
for(int i = 2; i <= sqrt(num); i++){
if(num % i == 0) return false;
}
return true;
}
void insert(int key){
int pos, i;
for(i = 0; i <= M; i++){
pos = (key + i * i) % M;
if(table[pos] == 0){
table[pos] = key;
printf("%d", pos);
return ;
}
}
if(i > M) printf("-");
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif // ONLINE_JUDGE
cin>>M>>N;
if(N == 0) return 0;
while(!isPrime(M)) M++;
for(int i = 0; i < N; i++){
scanf("%d", &num);
if(i != 0) printf(" ");
insert(num);
}
return 0;
}
4,解题过程
第一搏
4不是最小的质数,故将表的大小重新设置为5;
根据H(key)=key%TSize,10%5=0、6%5=1、4%5=4、15%5=0(0,0+1^2,0+2^2,0+3^2即0,1,4均被占,所以输出'-');
#include<bits/stdc++.h>
using namespace std;
bool isPrime(int num){
if(num == 1 || num == 2) return true;
for(int i = 2; i <= sqrt(num); i++){
if(num % i == 0) return false;
}
return true;
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif // ONLINE_JUDGE
int M, N;//M初始大小 N数字个数
cin>>M>>N;
while(!isPrime(M)) M++;
int table[M] = {0};//题目给的数据是正数 所以可用0表示没有
int num, pos;
scanf("%d", &num);
table[num % M] = num;//第一个数必定有位置存放
printf("%d", num % M);
for(int i = 1; i < N; i++){
scanf("%d", &num);
pos = num % M;
int j = 1;
while(pos < M && table[pos] != 0){//有冲突
pos = num % M + j * j;
j++;
}
if(pos < M){
table[pos] = num;
printf(" %d", pos);
}else printf(" -");
}
return 0;
}
第二搏
1不是质数!!!
第三搏
向大佬求助:@日沉云起【pat甲级1078 Hashing (25)(25 point(s))】
不但要加平方,还要对M取余。。。(数据结构老师,我对不起您,〒▽〒)