AcWing 840. 模拟散列表

拉链法

#include<cstring>
#include<iostream>
using namespace std ;
const int N=100003;
int h[N],e[N],ne[N],idx;
void insert(int x) {
    int k=(x%N+N)%N;//哈希函数
    //模拟单链表
    e[idx]=x;//先存下来
    ne[idx]=h[k];//指向负1
    h[k]=idx++;//原来的数字指向idx
}
bool find(int x) {
    int k=(x%N+N)%N;
    for(int i=h[k]; i!=-1; i=ne[i]) {
        if(e[i]==x)    return true;
    }
    return false;
}
int main() {
    int n;
    cin>>n;
    memset(h,-1,sizeof h);
    while(n--) {
        char op[2];
        int x;
        cin>>op>>x;
        if(*op==‘I‘) insert(x);
        else {
            if(find(x)) cout<<"Yes"<<endl;
            else cout<<"No"<<endl;
        }
    }
    return 0;
}

开放寻址法

#include <cstring>
#include <iostream>
using namespace std;
const int N = 200003, null = 0x3f3f3f3f;
int h[N];
int find(int x) {
    int t = (x % N + N) % N;//哈希函数
    while (h[t] != null && h[t] != x) { //如果被插入过且不为x
        t ++ ;//往下接着找
        if (t == N) t = 0;//找到头了,从头开始
    }
    return t;//直到找到为止
}
int main() {
    memset(h, 0x3f, sizeof h);
    int n;
    scanf("%d", &n);
    while (n -- ) {
        char op[2];
        int x;
        scanf("%s%d", op, &x);
        if (*op == ‘I‘) h[find(x)] = x;
        else {
            if (h[find(x)] == null) puts("No");//如果没有插入过
            else puts("Yes");
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/QingyuYYYYY/p/11828724.html

时间: 2024-10-27 07:40:04

AcWing 840. 模拟散列表的相关文章

模拟散列表

维护一个集合,支持如下几种操作: “I x”,插入一个数x: “Q x”,询问数x是否在集合中出现过: 现在要进行N次操作,对于每个询问操作输出对应的结果. 输入格式 第一行包含整数N,表示操作数量. 接下来N行,每行包含一个操作指令,操作指令为”I x”,”Q x”中的一种. 输出格式 对于每个询问指令“Q x”,输出一个询问结果,如果x在集合中出现过,则输出“Yes”,否则输出“No”. 每个结果占一行. 数据范围 1≤N≤1051≤N≤105−109≤x≤109−109≤x≤109 输入样

数据结构散列表

散列表 散列表是一个包含关键字的具有固定大小的数组,表的大小记为 tablesize .每个关键字被映射到0到 tablesize 中的某个数,并被放到适当的单元中,这个映射称为散列函数.散列函数应尽可能地在单元之间均匀分配关键字.最后还需要解决关键字冲突的情况,即映射到同一个值. 通常需要均匀的分布关键字,需要我们选择一个适合的散列函数. 关于散列函数可以查看上一篇:常见的散列函数 散列表的负载因子为散列表中的元素个数和散列表大小的比值. 一般选择表的大小为素数,以避免一些特殊性质造成的冲突.

算法——散列表

散列表 算法——散列表 散列表(hash table):键值(key_value)映射,Python提供的哈希列表实现为字典. 作用: 模拟映射关系 便于查找 避免重复 缓存/记住数据,以免服务器再通过处理来生成它们 # hash_table.py 哈希表 # 避免重复 def vote(li): voters = {} for i in li: if i not in voters: voters[i] = True else: print(i + ' has already voted.')

数据结构和算法: 散列表

散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构.也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度.这个映射函数称做散列函数,存放记录的数组称做散列表 散列表的时间复杂度不是严格的O(1), 因为和多种因素有关, 比如散列函数, 还有就是如果采用链表法处理冲突, 那么最坏情况是所有数据都散列到一个链表中, 此时是O(n). hash函数有以下几种简单实现的方法 取余法 常见的对一个数进行取余操作

闭散列表的查找、插入和删除操作的完整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之前的数很少,就会造成空间浪费.大多时

Python数据结构——散列表

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

散列表的实现

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

散列表

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