题目地址

https://pta.patest.cn/pta/test/16/exam/4/question/680

5-18 Hashing - Hard Version   (30分)

Given a hash table of size NN, we can define a hash function . Suppose that the linear probing is used to solve collisions, we can easily obtain the status of the hash table with a given sequence of input numbers.

However, now you are asked to solve the reversed problem: reconstruct the input sequence from the given status of the hash table. Whenever there are multiple choices, the smallest number is always taken.

Input Specification:

Each input file contains one test case. For each test case, the first line contains a positive integer NN (\le 1000≤1000), which is the size of the hash table. The next line contains NN integers, separated by a space. A negative integer represents an empty cell in the hash table. It is guaranteed that all the non-negative integers are distinct in the table.

Output Specification:

For each test case, print a line that contains the input sequence, with the numbers separated by a space. Notice that there must be no extra space at the end of each line.

Sample Input:

11
33 1 13 12 34 38 27 22 32 -1 21

Sample Output:

1 13 12 21 33 34 38 27 22 32

根据hash表算原始的插入顺序,很有意思的题,mooc讲了思路。
/*
评测结果
时间 结果 得分 题目 编译器 用时(ms) 内存(MB) 用户
2017-07-08 11:46 答案正确 30 5-18 gcc 6 4
测试点结果
测试点 结果 得分/满分 用时(ms) 内存(MB)
测试点1 答案正确 18/18 2 1
测试点2 答案正确 4/4 2 1
测试点3 答案正确 2/2 2 1
测试点4 答案正确 2/2 2 1
测试点5 答案正确 4/4 6 4 刚开始找应该输出的点时,暴力扫描取最小,结果发现第三个点超时
后来改用堆找最小结点
发现还是超时。。。
然后没辙了,找了个带注释的测试点截图,第三个点写到,有非-1的空位 WTF! 改了之后发现这个数据量,用暴力扫最小结点耗时也是十几毫秒,没慢多少,但是按理说还是用堆比较科学。
————————————————
读入hash表-> 表里i位置上的元素,如果算完hash应该插在j位置上,那么从i-1,一直减到j,这些元素都要在i之前插入。
用(i-1+N)%N解决hash表的循环问题 把依赖关系计算完后,此时问题就成了拓扑排序。
再接下来就是怎么找入度为0的结点中,包含元素最小的点了。
此解法建了堆,最开始把入度为0的全部提前压进去,然后开始循环往外取。
取出后断开该结点发出的边与其它点的连接。如果断开后发现其它结点入度变成了0,那么立即把该入度为0的点扔到堆里。
*/
#include<stdio.h>
#define TRUE 1
#define FALSE 0
#define MAXN 1000
#define EMPTY -1
#define INFINITY 6666666 struct HashNode
{
int value;
int visited; //是否访问过
int noCollision; //是否有冲突,建矩阵的时候用
int indegree; //入度
} gHashTable[MAXN]; int gMatrix[MAXN][MAXN];
int Heap[MAXN+1]; //堆
int HeapLength=0; //堆长 void DBG_printHeap() //debug时打印堆的
{
int i;
for(i=1;i<=HeapLength;i++)
{
printf("%d ",gHashTable[Heap[i]].value);
}
printf("+++++\n");
}
void InsertIntoHeap(int a) //插入堆
{
int i;
Heap[++HeapLength]=a;
i=HeapLength;
while(i/2>0)
{
if(gHashTable[Heap[i/2]].value>gHashTable[a].value)
{
Heap[i]=Heap[i/2];
i=i/2;
}
else break;
}
Heap[i]=a;
// DBG_printHeap();
} int DeHeap() //弹出堆顶
{
if(HeapLength==0)
return EMPTY;
int top=Heap[1];
int temp,parent,child;
Heap[1]=Heap[HeapLength--];
temp=Heap[1];
for(parent=1;2*parent<=HeapLength;parent=child)
{
child=parent*2;
if(child!=HeapLength)
{
if(gHashTable[Heap[child]].value>gHashTable[Heap[child+1]].value)
child++;
} if(gHashTable[temp].value>gHashTable[Heap[child]].value)
Heap[parent]=Heap[child];
else break;
}
Heap[parent]=temp;
// DBG_printHeap();
return top;
} void CalcMatrix(int N) //计算依赖关系的邻接矩阵
{
int i,idx,p;
for(i=0;i<N;i++)
{
if(gHashTable[i].noCollision==1 || gHashTable[i].value==EMPTY)
continue;
idx=gHashTable[i].value%N;
p=(i-1+N)%N;
while(p!=idx)
{
if(gHashTable[p].value!=EMPTY)
gMatrix[p][i]=TRUE;
gHashTable[i].indegree++;
p=(p-1+N)%N;
}
gMatrix[idx][i]=TRUE;
gHashTable[i].indegree++;
}
} void DeleteEdges(int idx,int N) //删边
{
int i;
for(i=0;i<N;i++)
{
if(gMatrix[idx][i])
{
// gMatrix[idx][i]=FALSE;
gHashTable[i].indegree--;
if(gHashTable[i].indegree==0)
{
// gHashTable[i].visited=TRUE;
InsertIntoHeap(i);
}
}
}
// gHashTable[idx].visited=TRUE;
} int InitHeapBeforePop(int N) //最开始时扫描结点,把入度为零的扔堆里面
{
int i; for(i=0;i<N;i++)
{
if(gHashTable[i].visited==TRUE || gHashTable[i].indegree!=0)
continue;
else
InsertIntoHeap(i);
}
} int main()
{
int N,i,temp,firstprint;
scanf("%d",&N);
for(i=0;i<N;i++)
{
scanf("%d",&gHashTable[i].value);
if(gHashTable[i].value%N==i)
gHashTable[i].noCollision=TRUE;// 下标和hash值相符,说明没冲突
if(gHashTable[i].value<0)
gHashTable[i].value=EMPTY; //标识空位
if(gHashTable[i].value==EMPTY)
gHashTable[i].visited=TRUE; //把空位的visited置1,后续不处理
}
CalcMatrix(N);
InitHeapBeforePop(N);
firstprint=1; //处理格式问题,第一个字符前面不加空格
while((temp=DeHeap()) != EMPTY)
{
DeleteEdges(temp,N);
if(!firstprint)
putchar(' ');
printf("%d",gHashTable[temp].value);
firstprint=0;
}
}

  

PTA 11-散列4 Hard Version (30分)的更多相关文章

  1. PTA 07-图5 Saving James Bond - Hard Version (30分)

    07-图5 Saving James Bond - Hard Version   (30分) This time let us consider the situation in the movie ...

  2. PTA 7-1 是否完全二叉搜索树 (30分)

    PTA 7-1 是否完全二叉搜索树 (30分) 将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果. ...

  3. PTA二叉搜索树的操作集 (30分)

    PTA二叉搜索树的操作集 (30分) 本题要求实现给定二叉搜索树的5种常用操作. 函数接口定义: BinTree Insert( BinTree BST, ElementType X ); BinTr ...

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

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

  5. 11-散列4 Hashing - Hard Version (30 分)

    Given a hash table of size N, we can define a hash function H(x)=x%N. Suppose that the linear probin ...

  6. JavaScript数据结构-11.散列

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. PTA 最大子列和问题(10 分)

    最大子列和问题(10 分) 给定K个整数组成的序列{ N​1​​, N​2​​, ..., N​K​​ },“连续子列”被定义为{ N​i​​, N​i+1​​, ..., N​j​​ },其中 1≤ ...

  8. 纯数据结构Java实现(11/11)(散列)

    欢迎访问我的自建博客: CH-YK Blog.

  9. 07-图5 Saving James Bond - Hard Version (30 分)

    This time let us consider the situation in the movie "Live and Let Die" in which James Bon ...

随机推荐

  1. 如何检查SQL Server索引填充因子

    假如您有一个盛满水的玻璃杯,您要尝试再向这个玻璃杯中加水.结果会怎样呢?水会溢出来. SQL Server 的情况也是如此.当索引页填充满时,如果尝试添加新行,则 SQL Server 会将大约一半的 ...

  2. tomcat的work目录不是缓存

    最近发现,很多网友喜欢把tomcat的work目录里的东西叫做缓存,其实那不是很恰当,work目录只是tomcat的工作目录,也就是tomcat把jsp转换为class文件的工作目录,这也正是为什么它 ...

  3. destoon登录后跳转到指定网址

    打开module\member\register.inc.php文件搜索:<input type="hidden" name="forward" valu ...

  4. 2018.3.16 Ubuntu 解决中文乱码问题

    一.乱码的样子类似: °²Àï¿ü ÒÁ¸ñÀ³Ï£ÑÇ˹,°²Àï¿ü ÒÁ¸ñÀ³Ï£ÑÇ˹ 这种乱码称为Gedit中文乱码 打开部分Windows下的txt文本文件的时候,中文显示为乱码.但 ...

  5. java abstraction and encapsulation

    How is Abstraction different from Encapsulation? Abstraction happens at class level design. It resul ...

  6. Vue中npm run build报“Error in parsing SVG: Unquoted attribute value”

    自己做的一个Vue项目,在打包时老是报这个错误 # Error in parsing SVG: Unquoted attribute value 查了查网上说的,都说报错原因是压缩和抽离CSS的插件中 ...

  7. Python SciPy Sparse模块学习笔记

    1. sparse模块的官方document地址:http://docs.scipy.org/doc/scipy/reference/sparse.html   2. sparse matrix的存储 ...

  8. NOIP模拟赛 篮球比赛1

    篮球比赛1(basketball1.*) Czhou为了提高机房里各种神牛的身体素质,决定在每次训练后举行篮球比赛.为了保持比赛公平,Czhou要将神牛们分成两队.首先神牛们赛前都要排成固定的队伍:然 ...

  9. C#基础-判断语句

    switch语句 Console.WriteLine("请输入月份"); string strInput = Console.ReadLine(); switch(strInput ...

  10. windows 2008r2+php5.6.28环境搭建详细过程

    安装IIS7 安装php 网站验证 安装IIS7 1.打开服务器管理器(开始-计算机-右键-管理-也可以打开),添加角色 直接下一步 勾选Web服务器(IIS),下一步,有个注意事项继续下一步(这里我 ...