当前位置:网站首页>PAT甲级 1145 哈希 - 平均查找时间
PAT甲级 1145 哈希 - 平均查找时间
2022-08-02 14:23:00 【键盘奏鸣曲】
这个问题的任务很简单:
首先将一个由若干个不同正整数构成的整数序列插入到一个哈希表中,然后尝试从表中查找另一个整数键值序列,并输出平均查找时间(查找时间指查找某个值是否在表中所进行的比较操作的次数)。
哈希函数定义为 H(key)=key%TSize,其中 TSize 是哈希表的最大大小。
利用只具有正增量的二次探测法来解决冲突。
注意,哈希表的大小最好是素数,如果用户给出的最大大小不是素数,则必须将表大小重新定义为大于用户给出的大小的最小素数。
输入格式
第一行包含三个正整数 MSize,N,M,分别表示用户定义的表的大小,插入整数的数量,查找键值的数量。第二行包含 N 个不同的正整数,表示插入序列。
第三行包含 M 个正整数,表示键值序列。
同行数字之间用空格隔开,两个序列中包含的整数均不超过 105。
输出格式
如果无法插入一些数字,则将其按顺序以如下格式输出,每个数字占一行:X cannot be inserted.
其中 X 表示无法插入的数字。最后一行输出 M 次查找的平均查找时间,保留一位小数。
注意: 如果查找了 TSize 次,每次查找的位置上均有数,但都不等于要查找的数,则认为查找时间是 TSize+1。
数据范围
1≤MSize,N,M≤104
输入样例:
4 5 4
10 6 4 15 11
11 4 15 2
输出样例:
15 cannot be inserted.
2.8
我的解法:
#include <bits/stdc++.h>
using namespace std;
const int N = 10010;
int n, m, s;
int h[N];
bool is_prime(int n){
if(n == 1) return false;
for(int i = 2; i * i <= n; i ++ ){
if(n % i == 0) return false;
}
return true;
}
int find(int x, int &count){
int t = x % s;
for(int i = 0; i < s; i ++ ){
int j = (t + i * i) % s;
if(h[j] == 0 || h[j] == x) return j;
else count ++ ;
}
return -1;
}
int main(){
cin >> s >> n >> m;
while(!is_prime(s)) s ++;
for(int i = 0; i < n; i ++ ){
int x, count = 1;
cin >> x;
int t = find(x, count);
if(t == -1) printf("%d cannot be inserted.\n", x);
else h[t] = x;
}
int cnt = 0;
for(int i = 0; i < m; i ++ ){
int x, count = 1;
cin >> x;
int t = find(x, count);
cnt += count;
}
printf("%.1lf", (double) cnt / m);
return 0;
}
收获:
哈希查找和存值用同一个函数
边栏推荐
猜你喜欢
随机推荐
加载事件的用法
【故障诊断】基于PSO_VMD_MCKD方法的风机轴承微弱故障诊断
Redis最新6.27安装配置笔记及安装和常用命令快速上手复习指南
codeforces k-Tree (dp仍然不会耶)
DOM —— 页面的渲染流程
只出现一次的数字||| —— 哈希映射、异或位运算+分治思想
2022-07-23 第六小组 瞒春 学习笔记
The DOM event type
lambda表达式、Stream接口及Optional类
2022-07-16 第五小组 瞒春 学习笔记
nvm管理node版本 nodenpm不是内部或外部命令,也不是可运行的程序
【JS执行机制】
公司最大的内卷,是“管理错位”
XGBoost 和随机森林在表格数据上优于深度学习?
一、QT界面开发 --QT安装
2022-07-29 第六小组 瞒春 学习笔记
The difference and connection between dist, pdist and pdist2 in MATLAB
Nvm,Nrm使用教程
使用 docker 搭建 redis-cluster 集群
为什么四个字节的float表示的范围比八个字节的long要广