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

Posted lytwajue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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;
}

??


以上是关于[Codevs 1230]元素查找(手写哈希表)的主要内容,如果未能解决你的问题,请参考以下文章

AC日记——元素查找 codevs 1230

codevs1230 元素查找

1230 元素查找

1230 元素查找

STL万岁。。 CODEVS 1230。

哈希表详解