PAT 09-散列3. Hashing - Hard Version (30)

题目链接:

Hashing-Hard Version

解题思路:

暴力,首先根据题目要求将所有给出节点按字典序(从小到大)排列

循环S(节点总数)次,每次通过遍历数组找到一个未出现过的,且满足条件:只能出现在现有位置上(本可出现在之前位置,但被其他节点占据)的节点

输出节点的值 并标记为出现过即可得到答案

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define M 1005
using namespace std;
struct node
{
    int d;
    int pos;
    int value;
    int used;
} Node[M];
int vis[M];
int n;
int cmp(node a,node b)
{
    return a.value<b.value;
}
int OK(int loc)
{
    int mod=Node[loc].value%n;
    if(Node[loc].d==0&&vis[mod]==0)
    {
        vis[mod]=1;
        return 1;
    }
    else
    {
        for(int i=mod; i!=Node[loc].pos; i=(i+1)%n)
        {
            if(!vis[i])
                return 0;
        }
        vis[Node[loc].pos]=1;
        return 1;
    }
}
int main()
{
    int s;
    scanf("%d",&n);
    s=0;
    int a,mod;
    for(int i=0; i<n; i++)
    {
        vis[i]=0;
        scanf("%d",&a);
        if(a!=-1)
        {
            mod=a%n;
            if(mod<i)
                Node[s].d=i-mod;
            else                          //注意mod>i的情况
                Node[s].d=i+n-mod;
            Node[s].pos=i;
            Node[s].used=0;
            Node[s++].value=a;
        }
    }
    sort(Node,Node+s,cmp);
    for(int i=0; i<s; i++)
    {
        for(int j=0; j<s; j++)
            if(!Node[j].used&&OK(j))
            {
                Node[j].used=1;
                if(i==0)
                    cout<<Node[j].value;
                else
                    cout<<' '<<Node[j].value;
                break;
            }
    }
    cout<<endl;
    return 0;
}
时间: 2024-11-13 09:42:39

PAT 09-散列3. Hashing - Hard Version (30)的相关文章

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

Given a hash table of size N, 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

散列表之完美散列

散列表之完美散列 完美散列perfect hashing 两级散列法 gperf工具来自动生成完美散列函数 gperf的安装 gperf关键字文件的书写格式 gperf应用举例 注意 本文中的所有代码你都可以在这里: https://github.com/qeesung/algorithm/tree/master/chapter11/11-5/gperf(这里会及时更新) 或者是这里: http://download.csdn.net/detail/ii1245712564/8936303 找到

数据结构--散列排序--散列表

散列表 散列查找,我们又回到了查找, 编译的时候,涉及变量及属性的管理: 插入:新变量的定义 查找:变量的引用 实际上是动态查找问题,查找树AVL树. 两个变量名(字符串)比较效率不高.字符串的比较要一个一个的比下去,时间会比较长, 是否可以把字符串转换成数字,再处理,就快多了.就是散列查找的思想. 已知的查找方法: 顺序查找                                          O(N) 二分查找(静态查找,不适合动态查找)   O(log2N) 二叉搜索数    

数据结构学习笔记07散列查找

1.散列表(Hash) 查找的本质: 已知对象找位置. 有序安排对象:全序.半序 直接“算出”对象位置:散列 时间复杂度几乎是常量:O(1),即查找时间与问题规模无关 散列查找法的两项基本工作: 计算位置:构造散列函数确定关键词存储位置: 解决冲突:应用某种策略解决多个关键词位置相同的问题 散列(Hashing) 的基本思想是: ①以关键字key为自变量,通过一个确定的函数 h(散列函数),计算出对应的函数值h(key),作为数据对象的存储地址. ②可能不同的关键字会映射到同一个散列地址上,即h

PAT 1029 旧键盘 (字符串+散列)

旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及实际被输入的文字,请你列出肯定坏掉的那些键. 输入格式: 输入在 2 行中分别给出应该输入的文字.以及实际被输入的文字.每段文字是不超过 80 个字符的串,由字母 A-Z(包括大.小写).数字 0-9.以及下划线 _(代表空格)组成.题目保证 2 个字符串均非空. 输出格式: 按照发现顺序,在一行中输出坏掉的键.其中英文字母只输出大写,每个坏键只输出一次.题目保证至少有 1 个坏键. 输入样例: 7

2020年2月24日09:06:11,Hash散列

问题描述 /** 有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址..),当输入该员工的id时,* 要求查找到该员工的所有信息.* ?要求: 1)不使用数据库,,速度越快越好=>哈希表(散列)* 2)添加时,保证按照id从低到高插入[课后思考:如果id不是从低到高插入,但要求各条链表仍是从低到高,怎么解决?]* 3)使用链表来实现哈希表, 该链表不带表头** */ 代码实现 package day0223 /* * 有一个公司,当有新的员工来报道时,要求将该员工的

散列查找的查找插入及冲突处理方法

处理冲突的方法 1.换个位置:开放地址法 2.同一位置的冲突对象组织在一起:链地址法 开放地址法(Open Addressing): 一旦产生了冲突(该地址已有其他元素),就按某种规则去寻找另一空地址 若发生了第i次冲突,试探的下一个地址将增加di, 基本公式: hi(key) = (h(key)+di) mod TableSize (1≤i<TableSize) di决定了不同解决冲突方案:线性探测.平方探测.双散列 线性探测:di = i +1 +2 +3 平方探测:di = ±i^2 +1

MD5(单向散列算法)原理分析

注:本文章转载于网络. MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2.MD3和MD4发展而来.MD5算法的使用不需要支付任何版权费用. MD5功能:    输入任意长度的信息,经过处理,输出为128位的信息(数字指纹):    不同的输入得到的不同的结果(唯一性):    根据128位的输出结果不可能反推出输入的信息(不可逆): MD5属不属于加密算法:    认为不属于的人是因为他们觉得不能从密文(散列值)反过来得到原文,即没有

转载:散列冲突的解决策略

冲突解决的策略 尽管散列函数的目标是使得冲突最少,但实际上冲突是无法避免的.因此,我们必须研究冲突解决策略.冲突解决技术可以分为两类:开散列方法( open hashing,也称为拉链法,separate chaining )和闭散列方法( closed hashing,也称为开地址方法,open addressing ).这两种方法的不同之处在于:开散列法把发生冲突的关键码存储在散列表主表之外,而闭散列法把发生冲突的关键码存储在表中另一个槽内. 开散列方法: 1.拉链法 开散列方法的一种简单形