题目

The task of this problem is simple: insert a sequence of distinct positive integers into a hash table first.Then try to find another sequence of integer keys from the table and output the average search time (the number of comparisons made to find whether or not the key is in the table). 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, N, and M, which are the user-defined table size, the number of input numbers, and the number of keys to be found, respectively. All the three numbers are no more than 104. Then N distinct positive integers are given in the next line. All the numbers in a line are separated by a space and are no more than 105.

Output Specification:

For each test case, in case it is impossible to insert some number, print in a line “X cannot be inserted.”where X is the input number. Finally print in a line the average search time for all the M keys, accurate up to 1 decimal place.

Sample Input:

4 5 4

10 6 4 15 11

11 4 15 2

Sample Output:

15 cannot be inserted.

2.8

题目分析

  1. 如果输入的hash table的大小MS不是质数,需要找到不小于MS的最小质数
  2. 将输入的一系列数散列存放于hash表,使用二次探测解决hash冲突,hash函数为H(key)=(key+step*step)%TSize,若不可插入,打印"X cannot be inserted"
  3. 再输入一系列数,在hash表中查找其是否存在,统计平均查找时间(=平均查找长度),并打印

解题思路

  1. 二次探测散列存储元素于hash表中
  2. 二次探测在hash表中查找输入数字,记录总查找长度求平均值

知识点

  1. 二次探测
int step=0;
while(step<MS&&hash[(key+step*step)%MS]!=key&&hash[(key+step*step)%MS]!=0)step++; //二次探测

易错点

  1. 二次探测在hash表中查找输入数字时,特殊情况-数字在hash表中查找不到时step会一直探测到MS而不是MS-1(为了与另外一种情况区分:step探测到MS-1时探测成功(即:要查找的元素存储于H(key)=(key+(MS-1)*(MS-1))%Tsize的位置))

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 MS,N,M,key;
scanf("%d %d %d",&MS,&N,&M);
while(!isPrime(MS))MS++; //size 若不是质数,重置为质数
int hash[MS]= {0};
for(int i=0; i<N; i++) {
scanf("%d",&key);
int step=0;
while(step<MS&&hash[(key+step*step)%MS]!=0)step++; //二次探测
if(step==MS)printf("%d cannot be inserted.\n", key); //不可插入
else hash[(key+step*step)%MS]=key; //可插入
}
double ans=0;
//第一个点测试错误,第一次遇到打印结果完全一样,但是不通过的情况
for(int i=0; i<M; i++) {
scanf("%d", &key);
int step=0;
while(step<MS&&hash[(key+step*step)%MS]!=key&&hash[(key+step*step)%MS]!=0)step++; //二次探测
ans+=(step+1); //如果hash(key)正好命中,比较次数为0+1;如果需要二次探测,比较次数=step+1;如果是二次探测找不到的情况,比较次数=MS+1与临界step=MS-1时探测到的情况做区分
}
printf("%.1f", ans/(M*1.0));
return 0;
}

PAT Advanced 1145 Hashing – Average Search Time (25) [哈希映射,哈希表,平⽅探测法]的更多相关文章

  1. PAT 甲级 1145 Hashing - Average Search Time (25 分)(读不懂题,也没听说过平方探测法解决哈希冲突。。。感觉题目也有点问题)

    1145 Hashing - Average Search Time (25 分)   The task of this problem is simple: insert a sequence of ...

  2. PAT 甲级 1145 Hashing - Average Search Time

    https://pintia.cn/problem-sets/994805342720868352/problems/994805343236767744 The task of this probl ...

  3. 1145. Hashing - Average Search Time (25)

    The task of this problem is simple: insert a sequence of distinct positive integers into a hash tabl ...

  4. [PAT] 1143 Lowest Common Ancestor(30 分)1145 Hashing - Average Search Time(25 分)

    1145 Hashing - Average Search Time(25 分)The task of this problem is simple: insert a sequence of dis ...

  5. PAT 1145 Hashing - Average Search Time [hash][难]

    1145 Hashing - Average Search Time (25 分) The task of this problem is simple: insert a sequence of d ...

  6. PAT 1145 Hashing - Average Search Time

    The task of this problem is simple: insert a sequence of distinct positive integers into a hash tabl ...

  7. 1145. Hashing - Average Search Time

      The task of this problem is simple: insert a sequence of distinct positive integers into a hash ta ...

  8. PAT_A1145#Hashing - Average Search Time

    Source: PAT A1145 Hashing - Average Search Time (25 分) Description: The task of this problem is simp ...

  9. PAT-1145(Hashing - Average Search Time)哈希表+二次探测解决冲突

    Hashing - Average Search Time PAT-1145 需要注意本题的table的容量设置 二次探测,只考虑正增量 这里计算平均查找长度的方法和书本中的不同 #include&l ...

随机推荐

  1. spring源码 RootBeanDefinition类的根接口AttributeAccessor

    /** * Interface defining a generic contract for attaching and accessing metadata * to/from arbitrary ...

  2. HDU - 4576 Robot(概率dp+滚动数组)

    题意:所有的格子围成一个圈,标号为1~n,若从格子1出发,每次指令告知行走的步数,但可能逆时针也可能顺时针走,概率都是1/2,那么问走了m次指令后位于格子l~r(1≤l≤r≤n)的概率. 分析: 1. ...

  3. UVA - 1614 Hell on the Markets(奇怪的股市)(贪心)

    题意:输入一个长度为n(n<=100000)的序列a,满足1<=ai<=i,要求确定每个数的正负号,使得所有数的总和为0. 分析: 1.若总和为0,则未加符号之前,所有数之和必为偶数 ...

  4. BZOJ:2190: [SDOI2008]仪仗队

    题解:欧拉函数 #include<iostream> #include<cstdio> #include<cstring> using namespace std; ...

  5. java题求代码,4、现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: int newArr[]={1,3,4,5,6,6,5,4,7,6,7,5}

    public class TEST { public static void main(String[] args) { int [] oldArr= {1,3,4,5,0,0,6,6,0,5,4,7 ...

  6. SpringMVC使用可以访问静态资源,但是导致Controller访问失败

    如果在web.xml 拦截配置如下: <!-- Spring MVC servlet --> <servlet> <servlet-name>SpringMVC&l ...

  7. 查看 vps 进程网络流量

    弄好了 vps 以后,感觉网络流量走的有点多,决定查查看到底什么情况. 首先安装 sar 来看看各个设备消耗的流量 apt-get install sysstat sar 的参数 DEV 表示网口, ...

  8. 吴裕雄--天生自然C++语言学习笔记:C++ 基本语法

    C++ 程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互. 对象 - 对象具有状态和行为.例如:一只狗的状态 - 颜色.名称.品种,行为 - 摇动.叫唤.吃.对象是类的实例. 类 - 类可 ...

  9. C# 互操作性入门系列(三):平台调用中的数据封送处理

    好文章搬用工模式启动ing ..... { 文章中已经包含了原文链接 就不再次粘贴了 言明 改文章是一个系列,但只收录了2篇,原因是 够用了 } --------------------------- ...

  10. 2020/1/31 PHP代码审计之目录穿越漏洞

    0x00 目录穿越 目录穿越(Directory Traversal)攻击是黑客能够在Web应用程序所在的根目录以外的文件夹上,任意的存取被限制的文件夹,执行命令或查找数据.目录穿越攻击,也与人称为P ...