PTA 11-散列2 Hashing (25分)
题目地址
https://pta.patest.cn/pta/test/16/exam/4/question/679
5-17 Hashing (25分)
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 \% TSizeH(key)=key%TSizewhere TSizeTSize 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: MSizeMSize(\le 10^4≤104) and NN (\le MSize≤MSize) which are the user-defined table size and the number of input numbers, respectively. Then NN distinct positive integers are given in the next line. All the numbers in a line are separated 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 -
难点在于计算什么情况下是实在插不进去的
/*
评测结果
时间 结果 得分 题目 编译器 用时(ms) 内存(MB) 用户
2017-07-07 18:23 答案正确 25 5-17 gcc 31 1
测试点结果
测试点 结果 得分/满分 用时(ms) 内存(MB)
测试点1 答案正确 12/12 2 1
测试点2 答案正确 3/3 2 1
测试点3 答案正确 5/5 1 1
测试点4 答案正确 5/5 31 1 此题是用平方探测法解决冲突。
为了解决不可插入问题,用了一个链表来存尝试过的下标。如果之前尝试过不成功的下标又出现一次,说明实在是插不进去了。
*/
#include<stdio.h>
#include<stdlib.h>
#define DBG printf
#define MAXN 20000
#define EMPTY -1
typedef struct Collisions* pCollisions; //冲突结点的结构体它的指针类型
struct Collisions{
int value;
pCollisions next;
}; int gHashTable[MAXN]; void InitHashTable() //把表初始化一下
{
int i;
for(i=0;i<MAXN;i++)
gHashTable[i]=EMPTY;
} int SearchCollisionsNode(pCollisions P,int x) //在链表中搜索有没有曾经访问过x下标
{
while(P!=NULL)
{
if(P->value==x)
return 1;
else P=P->next;
}
return 0;
} pCollisions CreateCollisionNode(int N) //创建一个储存着冲突数据下标的结点
{
pCollisions P=malloc(sizeof(struct Collisions));
P->next=NULL;
P->value=N;
return P;
} void DestroyCollision(pCollisions P) //回收内存
{
if(P==NULL)
return;
else DestroyCollision(P->next);
free(P);
} int FindNextPrime(int n) //找个比n大的质数
{
if(n==1) //在这里有个坑,第二个测试点卡表大小填1的时候。
return 2;
int i,isPrime;
while(1)
{
isPrime=1;
for(i=2;i<n;i++)
if(n%i==0)
{
isPrime=0;
break;
}
if(isPrime)
return n;
else n++;
}
} void Insert(int x,int M) //插入hash表
{
struct Collisions head;
head.next=NULL;
int idx,collCount=0;
pCollisions P;
while(gHashTable[idx=(x+collCount*collCount)%M]!=EMPTY)
{
if(SearchCollisionsNode(head.next,idx)==1)
{
printf("-");
DestroyCollision(head.next);
return;
}
else
{
collCount++;
P=CreateCollisionNode(idx);
P->next=head.next;
head.next=P;
}
}
gHashTable[idx]=x;
printf("%d",idx);
DestroyCollision(head.next);
} int main()
{
int i,M,N,temp;
scanf("%d %d",&M,&N);
M=FindNextPrime(M);
InitHashTable(); //容易漏的地方,初始化表
// DBG("got Prime M=%d\n",M);
for(i=0;i<N;i++)
{
scanf("%d",&temp);
Insert(temp,M);
if(i!=N-1)
printf(" ");
}
}
PTA 11-散列2 Hashing (25分)的更多相关文章
- PTA 字符串关键字的散列映射(25 分)
7-17 字符串关键字的散列映射(25 分) 给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数H(Key)将关键字Key中的最后3个字符映射为整数,每个字符占5位:再用除留余 ...
- PTA 逆散列问题 (30 分)(贪心)
题目链接:https://pintia.cn/problem-sets/1107178288721649664/problems/1107178432099737614 题目大意: 给定长度为 N 的 ...
- 11-散列2 Hashing (25 分)
The task of this problem is simple: insert a sequence of distinct positive integers into a hash tabl ...
- PTA甲级1094 The Largest Generation (25分)
PTA甲级1094 The Largest Generation (25分) A family hierarchy is usually presented by a pedigree tree wh ...
- pat09-散列1. Hashing (25)
09-散列1. Hashing (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue The task of ...
- PAT 甲级 1078 Hashing (25 分)(简单,平方二次探测)
1078 Hashing (25 分) The task of this problem is simple: insert a sequence of distinct positive int ...
- PTA 10-排序5 PAT Judge (25分)
题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/677 5-15 PAT Judge (25分) The ranklist of PA ...
- PTA 05-树7 堆中的路径 (25分)
题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/713 5-5 堆中的路径 (25分) 将一系列给定数字插入一个初始为空的小顶堆H[] ...
- PTA 04-树5 Root of AVL Tree (25分)
题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/668 5-6 Root of AVL Tree (25分) An AVL tree ...
随机推荐
- A winner is a dreamer who never gives up
A winner is a dreamer who never gives up. 成功者是坚持梦想不放弃的人.(Nelson Mandela)
- android上部署tensorflow
https://www.jianshu.com/p/ddeb0400452f 按照这个博客就可以 https://github.com/CrystalChen1017/TSFOnAndroid 这个博 ...
- JQuery EasyUI学习记录(三)
1.jQuery EasyUI messager使用方式 1.1 alert方法 $(function(){ //1.alert方法---提示框 $.messager.alert("标题&q ...
- 在ASP.NET项目中的web.config文件里配置数据库连接并在程序代码中获取连接字符串
1.在<connectionStrings> 标签里添加连接 <connectionStrings> <add name="ConnectionName&q ...
- django logging日志优先级
原创博文 转载请注明出处! 参考官方文档:https://docs.djangoproject.com/en/2.1/topics/logging/ Loggers¶ A logger is the ...
- cesium底图加载底图切换 基于天地图服务
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Linux 常用命令(三)
一.less --分页查看文件:方面查阅(编辑)大文件 说明:支持方向键盘和鼠标向上向下浏览 -N 显示行号 二.head --output the first part of files 默认显示 ...
- Python3爬虫一之(urllib库)
urllib库是python3的内置HTTP请求库. ython2中urllib分为 urllib2.urllib两个库来发送请求,但是在python3中只有一个urllib库,方便了许多. urll ...
- JAVA基础篇—HashMap
/class Depositor package 银行储户; public class Depositor { private String id; private String name; priv ...
- exp分析
1 from pwn import* 2 3 local =1 4 debug = 1 5 6 if local: 7 p = process('./pwn1') 8 else: 9 p = remo ...