PAT(Advanced) 1078 Hashing 二次探测散列 C++实现
题目链接
题目大意
给定值不同的正整数序列,将所有数插入哈希表中,并输出它们在哈希表中的位置,若无法插入则打印-
来代替位置。哈希函数为
H
(
k
e
y
)
=
k
e
y
%
T
S
i
z
e
H(key)=key \% TSize
H(key)=key%TSize,采用二次探测散列法来解决冲突,哈希表长度为大于等于给定长度MSize
的最小质数
算法思路
根据题意,求得哈希表大小MSize
,遍历给定序列,根据哈希函数
H
(
k
e
y
)
=
k
e
y
%
T
S
i
z
e
H(key)=key \% TSize
H(key)=key%TSize求得指定元素在哈希表中的位置印输出,出现冲突采用二次探测散列法解决,直到找到插入位置或找不到插入位置,找不到插入位置则输出-
AC代码
#include<bits/stdc++.h>
using namespace std;
bool prime(int x) {
if (x == 1) {
return false;
}
for (int i = 2; i <= sqrt(x); i++) {
if (x % i == 0) {
return false;
}
}
return true;
}
int main(int argc, char* argv[]) {
int MSize, N;
scanf("%d%d", &MSize, &N);
while (!prime(MSize)) {
MSize++;
}
vector<bool> hash(MSize);
for (int i = 0; i < N; i++) {
int key;
scanf("%d", &key);
int position = key % MSize;
if (!hash[position]) {
hash[position] = true;
printf("%d", position);
} else {
// 二次探测散列法
for (int offset = 1; hash[position] && offset < MSize; offset++) {
position = (key + offset * offset) % MSize;
}
// 找不到则输出 '-'
if (hash[position]) {
printf("-");
} else {
printf("%d", position);
hash[position] = true;
}
}
if (i != N - 1) {
printf(" ");
} else {
printf("\n");
}
}
return 0;
}
样例输入
4 4
10 6 4 15
样例输出
0 1 4 -
鸣谢
最后
- 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!