PAT(Advanced) 1078 Hashing 二次探测散列 C++实现
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了PAT(Advanced) 1078 Hashing 二次探测散列 C++实现,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1453字,纯文字阅读大概需要3分钟。
内容图文
![PAT(Advanced) 1078 Hashing 二次探测散列 C++实现](/upload/InfoBanner/zyjiaocheng/609/a1255a7fe74b4a858ebae53e1946f836.jpg)
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 -
鸣谢
最后
- 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!
内容总结
以上是互联网集市为您收集整理的PAT(Advanced) 1078 Hashing 二次探测散列 C++实现全部内容,希望文章能够帮你解决PAT(Advanced) 1078 Hashing 二次探测散列 C++实现所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。