码迷,mamicode.com
首页 > 其他好文 > 详细

哈希表

时间:2018-09-02 02:05:28      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:max   没有   优化   key   输入   技术   lin   alt   分享   

哈希表利用了与字符串哈希类似的思想。

优点:快

缺点:占空间

在储存数据时,计算出相应的哈希值,并存在对应的哈希值的下标中。

如果出现重复的哈希值,不要惊慌,不是基数取得不好,而是因为数字的范围过大。

这是我们利用类似于链表的思想,在一个哈希值下存储多个哈希一样的数据。

例子如下:

技术分享图片

    “^”代表指向为空,第一列的数字为计算出来的哈希值

其中操作过程非常简单,只需要开一个数组a代表哈希值

然后用邻接表的思想来存数据,查询的时候只需要基础操作就可以了(具体看代码)

取哈希值具体有三种,我有时间再写没时间就算了。

应用

输入n,m代表输入n个数,有m次询问,每次询问如果出现过就输出"YES",否则输出"No"

样例输入:

5

1 1 2 2 3

5

1 2 3 4 5

样例输出

YES

YES

YES

NO

NO

 

下面给出代码,请认真看注释:

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
inline int min(int a,int b){return a<b?a:b;}
inline int max(int a,int b){return a>b?a:b;}
inline int rd()
{
    int x=0,f=1;
    char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c==-) f=-1;
    for(;isdigit(c);c=getchar()) x=x*10+c-0;
    return x*f;
}
inline void write(int x)
{
     if(x<0) putchar(-),x=-x;
     if(x>9) write(x/10);
     putchar(x%10+0);
}
int head[100006],nxt[1000006],dis[100006];//head[x]代表哈希值为x的数据的编号
//nxt和dis都是邻接表里的基础操作 
int stk[100006];//为了优化时间存的计算出来过的哈希值 
int total=0,top=0;//total邻接表,top是出现过几个不同的哈希值 
void init()
{
    total=0;
    while(top) head[stk[top--]]=0;//初始化,多组数据时要用 
}
int ha(int x){ return x%19260817;}//计算哈希值 
void add_key(int k)
{
    int h=ha(k);
    for(int i=head[h];i;i=nxt[i]) if(h==dis[i]) return ;//判断一个数如果存过就不用再存了 
    if(head[h]==0) stk[top++]=h;//如果还没有出现过这个哈希值,就存进栈 
    total++;
    nxt[total]=head[h];//邻接表操作 
    head[h]=total;
    dis[total]=k;
    return ;
}
void check(int k)
{
    int h=ha(k);
    for(int i=head[h];i;i=nxt[i])//是否存过 
    {
        if(k==dis[i])
        {
            printf("YES\n");
            return ;
        }
    }
    printf("NO\n");
    return ;
}
int main()
{
    int n;
    int m;
    n=rd();
    init();
    for(int i=1;i<=n;i++)
    {
        int x=rd();
        add_key(x);
    }
    m=rd();
    for(int i=1;i<=n;i++)
    {
        int x=rd();
        check(x);
    }
    return 0;
}

完结撒花??ヽ(°▽°)ノ?

 

哈希表

标签:max   没有   优化   key   输入   技术   lin   alt   分享   

原文地址:https://www.cnblogs.com/WWHHTT/p/9572160.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!