Data Structures and Algorithms (English) - 7-18 Hashing - Hard Version(30 分)

简介: Data Structures and Algorithms (English) - 7-18 Hashing - Hard Version(30 分)

题目链接:点击打开链接

 

题目大意:利用线性探测冲突建立Topo图,用Topo排序输出(多个 in[i]==0,输出结点值较小的那个)。

image.png解题思路:关键在于建Topo图遇到冲突时,不是一开始建造的时候位置都为空,而是一开始的时候位置就是Input的位置已经占着了的,以后者规则为基准。因为 int 值可能很大,所以使用 unordered_map 来替换。

如题目中的样例,假设题目中的元素在一个ha[11]的数组中


33 % 11 = 0,ha[0] = 33 ,因此什么事都不做;


1 % 11 = 1,ha[1] = 1, 同上;


13 % 11 = 2,ha[2] = 13, 同上;


12 % 11 = 1,ha[1] != 12,说明发生了冲突,此时1和13一定在12之前进入哈希表(因为线性探测法是逐个向后找空位),所以建立<1,12>、<13, 12>这两条有向边来表明先后顺序;


……// 后面的都类似;


而32 % 11 = 10,ha[10] != 32,又发生了冲突,而此时已经是表的末尾,因此只能重新回到0号位依次探测空位直到8号位,因此需要建立<21, 32>、<33, 32>、<1, 32>...<22, 32>这些有向边


以上步骤是根据哈希表来建立一个有向图。其中建立有向图时,结点我选择的是用下标来表示(因为不知道元素的大小),不过还是用了个 unordered_map 数组来记录下标。


然后就是根据有向图来做一个拓扑排序,排序的时候使用优先队列容器来存储入度为0的元素,方便找到最小的元素。


AC 代码

#include<bits/stdc++.h>#include<cmath>#define mem(a,b) memset(a,b,sizeof a)#define ssclr(ss) ss.clear(), ss.str("")#define INF 0x3f3f3f3f#define MOD 1000000007usingnamespacestd;
typedeflonglongll;
constintmaxn=1009;
intn;
intha[maxn], in[maxn], g[maxn][maxn];
unordered_map<int,int>ump, id;
vector<int>vec;
priority_queue<int,vector<int>,greater<int>>pq;
voidtopo()
{
for(inti=1;i<=n;i++)
if(in[i]==0&&ump[i]>=0) pq.push(ump[i]); // avoid 负数的情况while(!pq.empty())
    {
inttp=pq.top(); pq.pop();
vec.push_back(tp);
for(inti=1;i<=n;i++)
if(g[id[tp]][i] &&--in[i]==0)
pq.push(ump[i]);
    }
}
intmain()
{
intnum,p,pos;
scanf("%d",&n);
p=n;
for(inti=1;i<=n;i++)
    {
scanf("%d",&num);
ump[i]=num;
id[num]=i;
ha[i-1]=i;
    }
for(inti=1;i<=n;i++)
    {
if(ump[i]<0) continue;
for(intj=0;;j++)
        {
pos=(ump[i]+j)%p;
if(ha[pos]==i||ump[ha[pos]]<0) break;
g[ha[pos]][i]=1;
in[i]++;
        }
    }
topo();
for(inti=0;i<vec.size();i++)
printf("%d%c",vec[i],i==vec.size()-1?'\n':' ');
return0;
}
目录
相关文章
|
应用服务中间件 Android开发 nginx
|
Shell Linux
linux shell脚本判断当前登录用户是否为root
linux shell脚本判断当前登录用户是否为root
390 1
|
编译器 Android开发
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
|
存储 缓存 监控
CleanMyMac X 4.11.5 for Mac中文免费激活版下载
CleanMyMacX4.11.5 for Mac是一款适用于Mac OS X的智能清洁和优化工具。它可以扫描系统的每一寸,只需两次单击即可清除千兆字节的垃圾,并像第一天一样帮助您维护Mac的健康并提高性能。
1842 0
CleanMyMac X 4.11.5 for Mac中文免费激活版下载
|
移动开发 JavaScript 小程序
uView Modal 模态框
uView Modal 模态框
430 0
|
存储 NoSQL Java
Redis高级技巧:性能提升100%不是梦
Redis,作为一种广泛使用的高性能键值对数据库,已成为现代应用架构不可或缺的组成部分。其快速的数据处理能力使其在处理大量数据时显得尤为重要。
451 2
|
弹性计算 人工智能 运维
汇量科技使用倚天710云实例 高效处理大流量广告请求
汇量科技为全球移动开发者提供广告技术与营销技术服务,已累计服务全球7000多家互联网企业,其广告推理业务对云实例的CPU性能及内网带宽需求日益提高,通过使用阿里云g8y倚天云实例,实现了性能和网络带宽双双提升。汇量科技顺利承接了大流量广告业务请求,同时,与上一代g6系列对比单机成本更优,综合性价比进一步提升。
汇量科技使用倚天710云实例 高效处理大流量广告请求
UE4/5 使用Sequence录制功能,实现自定义蓝图逻辑的运行
UE4/5 使用Sequence录制功能,实现自定义蓝图逻辑的运行
1112 0
UE4/5 使用Sequence录制功能,实现自定义蓝图逻辑的运行
|
存储
计算机组成原理——大小端模式与边界对齐
计算机组成原理——大小端模式与边界对齐
1047 0
计算机组成原理——大小端模式与边界对齐

热门文章

最新文章