NOJ1184 迷失的邮票 散列表

题意

一共收集了N张邮票,现在丢了2张,剩下N-2张…..原先收集的邮票全部是成对收集的,所以找到哪两种邮票是成单的,输出它们。(确定丢失的邮票不是同一种)

思路

因为编号比较大,可以用hash表压缩成数组可以开的下的大小。压缩直接取模就好。如果冲突就往下一个找。

代码

#include <cstdio>
#include <cstring>
#define MOD 1000007
const int maxn = 1000010;
struct node {
    int cnt;
    int num;
};
node s[maxn];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i = 0 ; i < n-2 ; i ++) {
        int a;
        scanf("%d",&a);//????
        int ahash = a%MOD;
        while(s[ahash].num != a && s[ahash].num != 0) {
            ahash ++;
            ahash = ahash%maxn;
        }
        s[ahash].num = a;
        s[ahash].cnt ++;
    }
    bool first = true;
    for(int i = 0 ; i < maxn ; i ++) {
        if(s[i].cnt%2) {
            if(first) {
                first = false;
                printf("%d",s[i].num);
            }else printf(" %d\n",s[i].num);
        }
    }
    return 0;
}
时间: 2024-08-29 12:02:25

NOJ1184 迷失的邮票 散列表的相关文章

闭散列表的查找、插入和删除操作的完整C代码

/*闭散列表的建立.查找.插入.删除*/ #include <stdio.h> #define NIL -1 //假设关键字为非负整数 #define DEL -2 typedef int KeyType; KeyType HashTable[13]; //便于验证算法,关键字个数假定为不超过13,哈希表长定为13 //关键字插入函数 void InsertHashTable(KeyType k) { for(int i=0; i<13; i++) if( NIL == HashTabl

哈希表/散列表

哈希表/散列表,是根据关键字(key)直接访问在内存存储位置的数据结构. 构造哈希表的常用方法: 直接地址法---取关键字的某个线性函数为散列地址,Hash(Key) = Key或Hash(key) = A*Key + B, A,B为常数. 除留余数法---取关键值被某个不大于散列表长m的数p除后的所得的余数为散列地址. Hash(key) = key % p. 若采用直接地址法(Hash(Key) = Key)存在一定的缺陷. 当Key值特别大时,而Key之前的数很少,就会造成空间浪费.大多时

迷失的邮票

描述 L不但喜欢收集邮票,而且还喜欢成对的收集每一种邮票.为了防止混乱,他用一个正整数对每一种邮票进行编号.然而,有一天他却丢失了某两张邮票.已知这两张邮票属于不同的类型,即它们的编号不一样.L希望你能帮他找到这两张丢失邮票的编号. 输入 每个测试数据的输入第一行是一个正整数n(4<=n<=1000000),表示原来L拥有邮票的张数接下去有n-2行,每一行一个正整数x(1<=x<=2^31-1),表示邮票的编号. 输出 每个测试数据的输出只有一行,两个正整数,表示丢失邮票的编号,小

Python数据结构——散列表

散列表的实现常常叫做散列(hashing).散列仅支持INSERT,SEARCH和DELETE操作,都是在常数平均时间执行的.需要元素间任何排序信息的操作将不会得到有效的支持. 散列表是普通数组概念的推广.如果空间允许,可以提供一个数组,为每个可能的关键字保留一个位置,就可以运用直接寻址技术. 当实际存储的关键字比可能的关键字总数较小时,采用散列表就比较直接寻址更为有效.在散列表中,不是直接把关键字用作数组下标,而是根据关键字计算出下标,这种 关键字与下标之间的映射就叫做散列函数. 1.散列函数

散列表的实现

一,线性探測法 核心:冲突的时候线性的向下寻找可用空间; 缺点:对同一散列地址的争夺现象会出现堆积; 二,二次探測法 核心:冲突的时候探測以下的+_k^2; 缺点:不易探測到整个散列表的全部空间: 三,链地址法 同一地址放置一条链

散列表

散列表的基本思想通过键来直接计算出数据的存放地址,而避免了数组或者其他数据结构的逐个比较查找. 可以在常数时间内实现查找.插入和删除操作,代价是不支持任何有关排序的操作. 键到地址的映射,称作散列函数.散列函数需要满足两个要求:计算简单:冲突少. 不同的情况,可以有不同的散列函数,在此不对散列函数做过多介绍. 冲突:相同的键,通过散列函数,被映射到了相同的地址.下面主要介绍下解决冲突的一些简单方法. 分离链表法:把散列到同一个地址的数据保存在一个链表中.在查询数据时,先通过散列函数求出链表地址,

散列表(数据结构学习笔记)

散列 散列表的一般实现叫散列.是一种以常数平均时间执行插入.删除.查找的技术.理想的散列表结构是一个包含关键字具有固定大小的数组.典型情况是,一个关键字就是一个带有相关值的字符串.把表大小记MaxSize,通常使表在0-MaxSize之间变化.每个关键字都被映射到0-MaxSize之间的某个单元中.这个映射关系就是散列函数.理想情况函数保证任何关键字都映射到不同单元里,实践是不可能的.因数组有限大小,而关键字可无限多.因此要找德散列函数尽可能的使关键字均匀的分布在单元中.如图 git在0号单元,

十三、散列表(哈希表)

散列表 散列表插入分两步: 1. 根据散列函数找到索引 2. 处理索引冲突情况:拉链法和线性探测法 散列表是时间上和空间上作出权衡的一个例子.散列表采用函数映射找索引,查找很快,但是键的顺序信息不会保存(HashSet HashMap的本质) 散列函数 对于每种类型的键我们都学要一个与之对应的散列函数 正整数散列: 常用取余散列:k%M 浮点数散列: 例如0-1之间可以乘以一个M得到0-M-1之前的索引值,但是高位影响比低位大(0.12的1比2的影响更大,不符合均匀性),所以可以将键表示为二进制

算法导论 第十章 基本数据类型 &amp; 第十一章 散列表(python)

更多的理论细节可以用<数据结构>严蔚敏 看几遍,数据结构很重要是实现算法的很大一部分 下面主要谈谈python什么实现 10.1 栈和队列 栈:后进先出LIFO 队列:先进先出FIFO python 中使用list实现在这些功能 栈:压栈 append() 退栈   pop() 队列:   入队 append() 出队 pop(0) 栈: >>> stack = list() >>> stack.append(3) >>> stack.ap