题目地址

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≤10​4​​) 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分)的更多相关文章

  1. PTA 字符串关键字的散列映射(25 分)

    7-17 字符串关键字的散列映射(25 分) 给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数H(Key)将关键字Key中的最后3个字符映射为整数,每个字符占5位:再用除留余 ...

  2. PTA 逆散列问题 (30 分)(贪心)

    题目链接:https://pintia.cn/problem-sets/1107178288721649664/problems/1107178432099737614 题目大意: 给定长度为 N 的 ...

  3. 11-散列2 Hashing (25 分)

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

  4. PTA甲级1094 The Largest Generation (25分)

    PTA甲级1094 The Largest Generation (25分) A family hierarchy is usually presented by a pedigree tree wh ...

  5. pat09-散列1. Hashing (25)

    09-散列1. Hashing (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue The task of ...

  6. PAT 甲级 1078 Hashing (25 分)(简单,平方二次探测)

    1078 Hashing (25 分)   The task of this problem is simple: insert a sequence of distinct positive int ...

  7. 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 ...

  8. PTA 05-树7 堆中的路径 (25分)

    题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/713 5-5 堆中的路径   (25分) 将一系列给定数字插入一个初始为空的小顶堆H[] ...

  9. 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 ...

随机推荐

  1. Jenkins上svn更新策略说明

  2. BZOJ 2539: [Ctsc2000]丘比特的烦恼

    Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 695  Solved: 260[Submit][Status][Discuss] Description ...

  3. MVC的验证码

    后台: /// <summary> /// 创建验证码的图片 /// </summary> /// <param name="validateCode" ...

  4. Codeforces Round #321 (Div. 2) C Kefa and Park(深搜)

    dfs一遍,维护当前连续遇到的喵的数量,然后剪枝,每个统计孩子数量判断是不是叶子结点. #include<bits/stdc++.h> using namespace std; ; int ...

  5. 一个.java文件内只能写一个class吗

    先给结论:当然不是!! 可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致.一个文件中可以不含public类,如果只有一个非public类,此时可以跟文件名不同. 为 ...

  6. 【0624作业】使用Scanner类输入并显示会员卡号

    package com.work0624; /** * 练习题 * 使用Scanner类输入并显示会员卡号 * @author L */ import java.util.Scanner; publi ...

  7. Luogu [P3367] 模板 并查集

    [模板]并查集 题目详见:[[P3367][模板]并查集] (https://www.luogu.org/problemnew/show/P3367) 这是一道裸的并查集题目(要不然叫模板呢) 废话不 ...

  8. dht 分布式hash 一致性hash区别

    先有一致性hash :一致性哈希,似乎最早提出是在分布式缓存里面的,让节点震荡的时候,影响最小.不过现在已经应用在分布式存储和p2p系统里面. dht 是p2p领域的概念,内有三大概念是由keyspa ...

  9. 数组char a[4] 保存了一个数据,怎么转换为unsigned int呢 ?

    [待解决问题] 浏览: 701次 注意char并不表示字符的 a[0]=0; a[1]=0; a[2]=3; a[3]=0; 那么我要的unsigned int b应该等于: b= 0x0000030 ...

  10. 关于lua 5.3 服务端热更新流程

    脚本的热更新的流程都大同小异, 第一步先保存旧代码的块的数据, 第二部加载新的代码块,第三步将旧代码块的局部和全局数据拷贝到新代码块的对应的 变量中. 在服务器热更新中,主要考虑热更的内容是什么, 一 ...