数据结构散列查找 —— 编程作业04 :Hashing - Hard Version
Posted 大彤小忆
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构散列查找 —— 编程作业04 :Hashing - Hard Version相关的知识,希望对你有一定的参考价值。
数据结构系列内容的学习目录 → \\rightarrow →浙大版数据结构学习系列内容汇总。
题目描述: 给定一个大小为N的哈希表,定义一个哈希函数H(x)=x%N,假设使用线性探测来解决冲突,我们可以很容易地获得给定输入数字序列的哈希表的状态。
但是,现在要求您解决相反的问题:从哈希表的给定状态重建输入序列。每当有多个选择时,总是取最小的数。
输入格式: 每个输入文件包含一个测试用例。
对于每个测试用例,第一行包含一个正整数N (≤1000),是哈希表的大小。
下一行包含N个整数,用空格隔开。负整数表示哈希表中的空单元格。保证表中所有非负整数都是不同的。
输出格式: 对于每个测试用例,打印一行包含输入序列的代码,用空格分隔数字。
请注意,每行的末尾都不能有多余的空格。
输入样例:
11
33 1 13 12 34 38 27 22 32 -1 21
输出样例:
1 13 12 21 33 34 38 27 22 32
解题思路:
■ 先给出散列映射的结果,反求输入顺序:当元素x被映射到H(x)位置,发现这个位置已经有y了,则y一定是在x之前被输入的。
代码实现:
#include<iostream>
using namespace std;
#include<queue>
#include<vector>
#include<map>
#define INF -100000
#define MaxVertex 1005
int G[MaxVertex][MaxVertex];
int Indegree[MaxVertex]; // 入度
int value[MaxVertex]; // 存值
int N; // 总值
priority_queue<int, vector<int>, greater<int> > q; // 定义最小堆
map<int, int> m;
// 插入边
void InsertEdge()
{
for (int i = 0; i < N; i++)
{
if (value[i] >= 0)
{
m.insert(pair<int, int>(value[i], i)); // 存下标与值的映射关系
int remainder = value[i] % N; // 余数
if (remainder == i)
Indegree[i] = 0;
else if (remainder != i)
{
Indegree[i] = (i - remainder < 0) ? (i - remainder + N) : (i - remainder);
for (int j = remainder; j != i; j = (j + 1) % N)
G[j][i] = 1;
}
}
}
}
// 建图
void BuildGraph()
{
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
G[i][j] = INF;
InsertEdge();
}
// 拓扑排序
void TopSort()
{
for (int i = 0; i < N; i++)
if (!Indegree[i] && 0 < value[i])
q.push(value[i]);
bool flag = true;
while (!q.empty())
{
int tmpValue = q.top();
int v = m[tmpValue]; // 找回下标
q.pop();
if (flag)
flag = false;
else
cout << " ";
cout << tmpValue;
for (int w = 0; w < N; w++)
if (G[v][w] != INF) // 如果连通
{
if (--Indegree[w] == 0)
q.push(value[w]);
}
}
}
int main()
{
cin >> N;
int i = 0;
for (int i = 0; i < N; i++)
cin >> value[i];
BuildGraph();
TopSort();
cout << endl;
system("pause");
return 0;
}
测试: 输入样例的测试效果如下图所示。
以上是关于数据结构散列查找 —— 编程作业04 :Hashing - Hard Version的主要内容,如果未能解决你的问题,请参考以下文章