AC840. 模拟散列表--59

输入:

几个

5       
I 1       
I 2
I 3
Q 2       
Q 5
输出:

Yes
No


1拉链法

数组下面拉一个列表,不用怕某个数冲突了,

h[k]一开始是-1没有拉链

2寻址法(推荐,只开一个数组):

find,设置索引k,有哈希值就返回索引给他用,肯定能找到.k=find(x)就是来找有没有地址的;这个k就是后面用的,h[k]=x用来插入的好占据了地方

h[k]装的应该是一个要插入的x

为什么k==0,如图1;防止一上来接近我的0x3f3f3f3f,不能到h[k];为什么不能break,--要看我的目的呀,就是就是要必须找到一个k,一定能找到10的9方呀

为什么要两倍的2的质数

op是字符数组,所以*op代表数组第一个

memset(h,0x3f,sizeof h);为什么不是默认为0x3f3f3f3f.

 while(h[k]!=null&&h[k]!=x)就是判断,还是这个--要看我的目的呀,就是就是要必须找到一个k,一定能找到10的9方呀

什么时候进入while,h[k]!=x,h[k]!=null,哈希值有且==x,]哈希值什么时候重复呢

 h[k]!=x当然没有x啊,

图1,来自up:_小z学长

#include<iostream>
#include <cstring>
using namespace std;

const int N=200003,null=0x3f3f3f3f;
int h[N];

int find(int x){
    int k=(x%N+N)%N;
        while(h[k]!=null&&h[k]!=x)//有了值,并且有了这个一样的值,转到数组开头再找一个索引k给他
        {
            k++;
            if(k==N)k=0;//重新搜索)1
        }
        return k;//h[k]==null&&h[k]==x
}
int main(){
    int n;
    scanf("%d",&n);
    memset(h,0x3f,sizeof h);

    while(n--){
        char op[2];
        int x;
        scanf("%s%d",op,&x);
       int  k=find(x);//给一个k
        if(*op=='I')h[k]=x;
        else if(h[k]!=null)puts("Yes");
        else puts("No");
    }
    return 0;
}
//5
//I 1
//I 2
//I 3
//Q 2
//Yes
//Q 5
//No

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白天的我最菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值