数据结构散列查找 —— 编程作业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的主要内容,如果未能解决你的问题,请参考以下文章

数据结构散列查找 —— 编程作业02 :Hashing

数据结构散列查找 —— 编程作业03 :QQ帐户的申请与登录

DS博客作业05--查找

浙大版数据结构学习系列内容汇总

数据结构——散列

数据结构基本概念 —— 编程作业 03 :二分查找