[Codevs 1230]元素查找(手写哈希表)

题目连接:http://codevs.cn/problem/1230/

说白了就是要我们自己手写一个哈希表的数据结构来实现添加和查找功能,map也能直接过(我第一次写就是用map骗AC的)

提一下个人理解的哈希表的实现(下面说的是线性寻址法),如果有误还请各位大神不吝指教

用一个数组模拟哈希表,函数f(x)=数字x在哈希表中出现的下标的最小可能值,一般f(x)=x mod t,t就是哈希表的长度

下面就是一个哈希表的示例,如果遍历哈希表时指针走出了哈希表的终点,就进入起点重新遍历

对于每次向哈希表中添加一个数x,从下标f(x)开始查找,以上文所说的遍历方式查找,直到找到装有x这个数的哈希表元素,返回查找成功(哈希表中有x这个数)。如果遍历过程中遇到了空的哈希表的一个元素就返回查找失败(哈希表中没有x这个数)。

插入元素的过程类似于查找,向哈希表中插入数字x时,首先从下标f(x)开始查找,直到找到第一个为0的哈希表元素,将数字x插入进去。

下面是此题代码:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>

#define MAXN 1000008
#define MOD 1000007

using namespace std;

int hashTable[MAXN];

void update(int x) //将数字x加入哈希表
{
    int num=x;
    x%=MOD;
    while(1)
    {
        if(!hashTable[x])
        {
            hashTable[x]=num;
            return;
        }
        if(hashTable[x]!=num)
        {
            x++;
            if(x==MAXN) x=0;
        }
        else return;
    }
}

bool query(int x) //查找哈希表中是否有数字x
{
    bool found=false;
    int num=x;
    x%=MOD;
    while(1)
    {
        if(!hashTable[x]) return false;
        if(hashTable[x]!=num)
        {
            x++;
            if(x==MAXN) x=0;
        }
        else return true;
    }
}

int main()
{
    int n,m,x;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        update(x+1);
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%d",&x);
        if(query(x+1)) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}



时间: 2024-10-28 02:00:10

[Codevs 1230]元素查找(手写哈希表)的相关文章

1230 元素查找

1230 元素查找 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 给出n个正整数,然后有m个询问,每个询问一个整数,询问该整数是否在n个正整数中出现过. 输入描述 Input Description 第一行两个整数 n 和m. 第二行n个正整数(1<=n<= 100000) 第三行m个整数(1<=m<=100000) 输出描述 Output Description 一共m行,若出现则输出YES,否则输出NO

手写哈希类

1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<math.h> 4 #define Mod 100007 //取模的大小,哈希表的大小... 5 #define Max 50 //存放的总数 6 typedef long long LL; 7 class Hash //手写哈希 8 { 9 public: 10 int hs[Mod]; //哈希值 设定的哈希函数为 原值 % Mod ,所以哈希值有可能是 0 ~

HDU 5183 Negative and Positive (NP) (手写哈希)

题目链接:HDU 5183 Problem Description When given an array \((a_0,a_1,a_2,?a_{n?1})\) and an integer \(K\), you are expected to judge whether there is a pair \((i,j)(0≤i≤j<n)\) which makes that \(NP?sum(i,j)\) equals to \(K\) true. Here \(NP?sum(i,j)=a_i?

手写9x9乘法表,冒泡排序

手写9x9乘法表,冒泡排序 9x9乘法表 class Demo {public static void main(String[] args) {for(int x = 0;x <= 9; x++) {for(int y = 1;y <= x; y++) {System.out.print(y+"*"+x+"="+x*y+"\t");}System.out.println();}}} 冒泡排序 public class BubbleS

2019 上海网络赛G 手写哈希map+字符串hash

https://nanti.jisuanke.com/t/41415 因为对于询问$\sum |s|<=1e5$,因此$|s|$的种类数$<=\sqrt{1e5}$ 我们分组标记,就变成了$\sqrt{1e5}$次询问了,我们暴力去跑, 复杂度$1e5\sqrt{1e5}*hashmap$ 暴力+哈希+$unordermap$计数,嗯,果然TLE了 然后手写一个$hashmap$,跑的飞快... #include<bits/stdc++.h> #define ull unsigne

redisTemplate写哈希表遇到的坑

在使用spring的redisTemplate进行redis哈希表的相关操作时,遇到了下面比较奇怪的情况: 1.删掉哈希表所属的key之后,重新get这个key的值,得到的不是null,而是一个空的map 2.直接get一个不存在的key,得到的不是null,而是一个空的map 3.set进去一个null值值后,重新set一个非空的map,这个key对应的仍然是一个null 那先看一下我写的setHash和getHashTable这两个方法: 1.首先setHashTable public vo

【CODEVS 1553】互斥的数 哈希表

题目描述 Description 有这样的一个集合,集合中的元素个数由给定的N决定,集合的元素为N个不同的正整数,一旦集合中的两个数x,y满足y = P*x,那么就认为x,y这两个数是互斥的,现在想知道给定的一个集合的最大子集满足两两之间不互斥. 输入描述 Input Description 输入有多组数据,每组第一行给定两个数N和P(1<=N<=10^5, 1<=P<=10^9).接下来一行包含N个不同正整数ai(1<=ai<=10^9). 输出描述 Output D

AC日记——元素查找 codevs 1230

1230 元素查找 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 给出n个正整数,然后有m个询问,每个询问一个整数,询问该整数是否在n个正整数中出现过. 输入描述 Input Description 第一行两个整数 n 和m. 第二行n个正整数(1<=n<= 100000) 第三行m个整数(1<=m<=100000) 输出描述 Output Description 一共m行,若出现则输出

codevs1230元素查找(hash)

1230 元素查找 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 给出n个正整数,然后有m个询问,每个询问一个整数,询问该整数是否在n个正整数中出现过. 输入描述 Input Description 第一行两个整数 n 和m. 第二行n个正整数(1<=n<= 100000) 第三行m个整数(1<=m<=100000) 输出描述 Output Description 一共m行,若出现则输出YES,否则输出NO