PAT Advanced 1078 Hashing (25) [Hash ⼆次⽅探查法]
题目
The task of this problem is simple: insert a sequence of distinct positive integers into a hash table, and output the positions of the input numbers. The hash function is defined to be “H(key) = key % TSize” where TSize is the maximum size of the hash table. Quadratic probing (with positive increments only) is used to solve the collisions. Note that the table size is better to be prime. 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.
Input Specification:
Each input file contains one test case. For each case, the first line contains two positive numbers: MSize(<=10^4) and N (<=MSize) which are the user-defined table size and the number of input numbers, respectively. Then N distinct positive integers are given in the next line. All the numbers in a line areseparated by a space.
Output Specification:
For each test case, print the corresponding positions (index starts from 0) of the input numbers in one
line. All the numbers in a line are separated by a space, and there must be no extra space at the end of
the line. In case it is impossible to insert the number, print “-” instead.
Sample Input:
4 4
10 6 4 15
Sample Output:
0 1 4 –
题目分析
- 输入一系列数字存入哈希表,二次探测解决hash冲突,哈希函数为H(key)=(key+step*step)%size,输出key存放在哈希表的下标,如果不能存入输出"-"
- the size of hash table必须为质数,如果不是质数,取比不小于size最小质数作为size的值
解题思路
- 用数组作为hash table,标记是否在某下标是否已经存放数字(1表示下标已占用)
- 二次探测解决hash冲突,第一次(key+0)%size,第二次key(key+1*1)%size,第三次key(key+2*2)%size....,step取值范围为[0,size-1](step取值范围晴神笔记P217有证明)。注意是H(key)=(key+stepstep)%size,而不是H(key)=key%size+stepstep(会越界)
知识点
- 判断质数
bool isPrime(int num) {
if(num==1)return false; //易错点
for(int i=2; i*i<=num; i++) {
if(num%i==0)return false;
}
return true;
}
易错点
- 1不是质数(若将1视为质数,测试点1不通过)
Code
Code 01
#include <iostream>
using namespace std;
bool isPrime(int num) {
if(num==1)return false;
for(int i=2; i*i<=num; i++) {
if(num%i==0)return false;
}
return true;
}
int main(int argc,char * argv[]) {
int M,N,key;
scanf("%d %d",&M,&N);
while(!isPrime(M))M++; // M重置为质数
int hash[M]= {0}; // 存放输入数字的标记数组,hash[i]==1表示i位置已存放输入数字,已被占用
for(int i=0; i<N; i++) {
scanf("%d", &key);
int step=0;
while(step<M&&hash[(key+step*step)%M]==1) step++; // 二次探测,查找空闲存放位置
if(i!=0)printf(" ");
if(step==M)printf("-"); // 二次探测,没有找到空余位置
else { // 二次探测,查到空余位置
int index = (key+step*step)%M;
hash[index]=1;
printf("%d", index);
}
}
return 0;
}
PAT Advanced 1078 Hashing (25) [Hash ⼆次⽅探查法]的更多相关文章
- pat 甲级 1078. Hashing (25)
1078. Hashing (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue The task of t ...
- PAT 甲级 1078 Hashing (25 分)(简单,平方二次探测)
1078 Hashing (25 分) The task of this problem is simple: insert a sequence of distinct positive int ...
- PAT甲题题解-1078. Hashing (25)-hash散列
二次方探测解决冲突一开始理解错了,难怪一直WA.先寻找key%TSize的index处,如果冲突,那么依此寻找(key+j*j)%TSize的位置,j=1~TSize-1如果都没有空位,则输出'-' ...
- PAT 1078 Hashing[一般][二次探查法]
1078 Hashing (25 分) The task of this problem is simple: insert a sequence of distinct positive integ ...
- PAT甲级1078 Hashing【hash】
题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805389634158592 题意: 给定哈希表的大小和n个数,使用 ...
- 1078. Hashing (25)【Hash + 探測】——PAT (Advanced Level) Practise
题目信息 1078. Hashing (25) 时间限制100 ms 内存限制65536 kB 代码长度限制16000 B The task of this problem is simple: in ...
- PAT 甲级 1078 Hashing
https://pintia.cn/problem-sets/994805342720868352/problems/994805389634158592 The task of this probl ...
- PAT (Advanced Level) 1078. Hashing (25)
二次探测法.表示第一次听说这东西... #include<cstdio> #include<cstring> #include<cmath> #include< ...
- PAT Advanced 1145 Hashing – Average Search Time (25) [哈希映射,哈希表,平⽅探测法]
题目 The task of this problem is simple: insert a sequence of distinct positive integers into a hash t ...
随机推荐
- 【CF1154G】Minimum Possible LCM
题意 给你 \(n\) 个数 \(a_i\) ,求出 \(\text{lcm}\) 最小的一对数. \(n\le 10^6, a_i\le 10^7\) 题解 直接枚举 ,找到当前数最小的两个倍数,统 ...
- UVALive 4287 SCC-Tarjan 加边变成强连通分量
还是强连通分量的题目,但是这个题目不同的在于,问你最少要添加多少条有向边,使得整个图变成一个强连通分量 然后结论是,找到那些入度为0的点的数目 和 出度为0的点的数目,取其最大值即可,怎么证明嘛... ...
- Spark 资源调度包 stage 类解析
spark 资源调度包 Stage(阶段) 类解析 Stage 概念 Spark 任务会根据 RDD 之间的依赖关系, 形成一个DAG有向无环图, DAG会被提交给DAGScheduler, DAGS ...
- MongoDB七-运维技术
复制来自:http://www.cnblogs.com/huangxincheng/archive/2012/03/08/2384571.html 这一篇我们以管理员的视角来看mongodb,作为一名 ...
- P 1024 科学计数法
转跳点:
- 使用GDI+显示OpenCV中的图像IplImage
OpenCV虽然自带了轻量级的界面库HighGUI,但是支持的图像化元素实在是太少了,一般只在前期算法测试时使用.实际产品还是使用MFC库.因此本文记录了如何在GDI+中显示OpenCV中的IplIm ...
- Python模拟登录哔哩哔哩
嘿,各位小伙伴中午好呀,今天要带来点什么干货呢,就从我的实际开发中来给大家带来一个案例吧,如何自动登录哔哩哔哩. ! 接到老大通知,让我自动写一个自动登录哔哩哔哩的脚本,我当然是二话不说直接开怼,咱们 ...
- Android自定义View——多边形网格属性图
1.初始化变量 2.属性图解 3.如果想切换到5.6.7边形等等,则必须修改下面几条数据 4.获取宽和高 5.绘制图形 1.开始画画前:我们要把画笔准备好,这里看代码就能明白意思了,接着把整个 ...
- VScode 修改中文字体
打开vscode ctrl+,打开设置 找到font,第一个是首选的英文字体,第二个是中文字体.
- id就是方法名,如何调用;批量input怎么获取他们的key值作为参数
1.很多Dom的时候,一个个写会比较麻烦,我用ID记载他的方法名: 2.很多input,在数据交互的时候一个个获取会比较繁琐,给一个方法,批量获取. <div id="searchSt ...