进阶实验8-2.1 逆散列问题 (30分)

给定长度为 N 的散列表,处理整数最常用的散列映射是 (。如果我们决定用线性探测解决冲突问题,则给定一个顺序输入的整数序列后,我们可以很容易得到这些整数在散列表中的分布。例如我们将 1、2、3 顺序插入长度为 3 的散列表HT[]后,将得到HT[0]=3HT[1]=1HT[2]=2的结果。

但是现在要求解决的是“逆散列问题”,即给定整数在散列表中的分布,问这些整数是按什么顺序插入的?

输入格式:

输入的第一行是正整数 N(≤1000),为散列表的长度。第二行给出了 N 个整数,其间用空格分隔,每个整数在序列中的位置(第一个数位置为0)即是其在散列表中的位置,其中负数表示表中该位置没有元素。题目保证表中的非负整数是各不相同的。

输出格式:

按照插入的顺序输出这些整数,其间用空格分隔,行首尾不能有多余的空格。注意:对应同一种分布结果,插入顺序有可能不唯一。例如按照顺序 3、2、1 插入长度为 3 的散列表,我们会得到跟 1、2、3 顺序插入一样的结果。在此规定:当前的插入有多种选择时,必须选择最小的数字,这样就保证了最终输出结果的唯一性。

输入样例:

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

输出样例:

1 13 12 21 33 34 38 27 22 32
题目要求是给出了hashing的结果,而且是用的linear probing线性探测解决冲突,要求给出初始序列。负数直接跳过,序列中的数都是非负数。所以遍历给出序列,如果说当前位置的s[i] % n等于i那么就是说不存在冲突,如果不相等就是存在冲突的,经过线性探测才存在当前位置,所以从s[i] % n位置到i之前的数都是比是s[i]先进行操作的,如此我们可以找到序列中数的顺序,进行拓扑排序,如果存在多种可能要求输出最小的,所以用优先队列。

代码:
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

int n,s[1000],l[1000],flag;
vector<int> v[1000];
struct cmp {
    bool operator ()(const int &a,const int &b) {
        return s[a] > s[b];
    }
};
int main() {
    scanf("%d",&n);
    for(int i = 0;i < n;i ++) {
        scanf("%d",&s[i]);
    }
    priority_queue<int,vector<int>,cmp> q;
    for(int i = 0;i < n;i ++) {
        if(s[i] < 0) continue;
        if(s[i] % n != i) {
            int d = s[i] % n > i ? i + n : i;
            for(int j = s[i] % n;j < d;j ++) {
                if(s[j % n] < 0) continue;
                v[j % n].push_back(i);
                l[i] ++;
            }
        }
        else q.push(i);
    }
    while(!q.empty()) {
        int temp = q.top();
        q.pop();
        if(flag) putchar(‘ ‘);
        else flag = 1;
        printf("%d",s[temp]);
        for(int i = 0;i < v[temp].size();i ++) {
            int d = v[temp][i];
            l[d] --;
            if(!l[d]) q.push(d);
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/8023spz/p/12303472.html

时间: 2024-10-05 04:56:00

进阶实验8-2.1 逆散列问题 (30分)的相关文章

进阶实验6-3.4 拯救007(升级版) (30分)-BFS

解题思路: 1.先按第一跳距离升序 2.合法第一跳加入队列中 3.(广度优先)访问队列中的结点,每访问一个结点并将其可到达的子孙加入队列中,直至访问至某个结点可以到岸结束 #include <stdio.h> #include <string.h> #include <math.h> #define MaxV 100+5 #define INF 0x3f3f3f3f typedef struct { int x,y; double firstjump; } GNode;

PTA数据结构与算法题目集(中文) 7-43字符串关键字的散列映射 (25 分)

PTA数据结构与算法题目集(中文)  7-43字符串关键字的散列映射 (25 分) 7-43 字符串关键字的散列映射 (25 分) 给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数(将关键字Key中的最后3个字符映射为整数,每个字符占5位:再用除留余数法将整数映射到长度为P的散列表中.例如将字符串AZDEG插入长度为1009的散列表中,我们首先将26个大写英文字母顺序映射到整数0~25:再通过移位将其映射为3:然后根据表长得到,即是该字符串的散列映射位置. 发生冲突时请

案例5-1.3 整型关键字的散列映射 (25分)--散列表(除留余数法+线性探测法)

解题思路: 1.初始化散列表,用于标记散列地址是否已用 2.构造结构体,(关键字去重)记录关键字的值和地址 3.读入数据,判断该关键字是否重复查询 4.用辅助数组记录每个关键字的地址,遍历输出 #include <stdio.h> #include <string.h> typedef struct { int key; int value; } Hash; int main() { int n,p; scanf("%d %d",&n,&p);

没事写个散列玩~

感觉散列的查找性能真心不错,如果使用普通线性结构查找,平均时间是n/2.而刚才用实验,256大小的散列,存储128个数据,平均时间为2次以内.感觉真心NB 1 #include <iostream> 2 #include <vector> 3 #include <string> 4 #include <cstdlib> 5 #include <ctime> 6 7 using namespace std; 8 typedef bool BOOL;

散列、加密、编码 漫谈

散列(又叫Hash)和加密在身份校验.敏感信息传输等应用中用途广泛. 把他们放在一起写的原因是,网上太多资料,将散列和加密的概念混为一谈,误导性极大. 由于编码/解码运算和上述二者有一定的相似之处,因此放在这里一并讲述. 注:本文中,为了表述严谨,所有的"位"代表的是字符个数之意,而bit则指代计算机数据中的基本单位比特. 1.三者的共同点 它们都表述了一种映射关系,将原始数据A映射到新的数据B. 在散列运算中,B一般称之为摘要,英文为digest. 其代表算法有MD5,SHA1, S

HashMap实现 Hash优化与高效散列

OverView Hash table based implementation of the Map interface. This implementation provides all of the optional map operations, and permits null values and the null key. (The HashMap class is roughly equivalent to Hashtable, except that it is unsynch

HBase Rowkey的散列与预分区设计

转自:http://www.cnblogs.com/bdifn/p/3801737.html 问题导读:1.如何防止热点?2.如何预分区?扩展:为什么会产生热点存储? HBase中,表会被划分为1...n个Region,被托管在RegionServer中.Region二个重要的属性:StartKey与EndKey表示这个Region维护的rowKey范围,当我们要读/写数据时,如果rowKey落在某个start-end key范围内,那么就会定位到目标region并且读/写到相关的数据.简单地说

Windows口令安全与破解之--LC4破解本地SAM散列

[实验目的] 1)理解LC4破解本地SAM散列的原理 2)学习LC4破解本地SAM散列的过程 [实验原理] Windows hash由二部分组成,分别是LM HASH&NT HASH.Windows系统关于hash的组成如下: 用户名称:`RID:LM-HASH值:NT-HASH值` LM HASH生成规则: 1.用户的密码被限制为最多14个字符. 2.用户的密码转换为大写. 3.系统中用户的密码编码使用了OEM内码页 4.密码不足14字节将会用0来补全. 5.固定长度的密码被分成两个7byte

Windows口令安全与破解之--saminside破解本地sam散列

[实验目的] 1)理解saminside破解本地sam散列的原理 2)学习psaminside破解本地sam散列的过程 [实验原理] Windows hash由二部分组成,分别是LM HASH&NT HASH.Windows系统关于hash的组成如下: 用户名称:`RID:LM-HASH值:NT-HASH值` LM HASH生成规则: 1.用户的密码被限制为最多14个字符. 2.用户的密码转换为大写. 3.系统中用户的密码编码使用了OEM内码页 4.密码不足14字节将会用0来补全. 5.固定长度