C++ 模拟散列表 || 哈希表的插入与查找 || 开放寻址法

维护一个集合,支持如下几种操作:

I x,插入一个整数 x

Q x,询问整数 x
是否在集合中出现过;
现在要进行 N
次操作,对于每个询问操作输出对应的结果。

输入格式
第一行包含整数 N
,表示操作数量。

接下来 N
行,每行包含一个操作指令,操作指令为 I x,Q x 中的一种。

输出格式
对于每个询问指令 Q x,输出一个询问结果,如果 x
在集合中出现过,则输出 Yes,否则输出 No。

每个结果占一行。

数据范围
1≤N≤105

−109≤x≤109
输入样例:
5
I 1
I 2
I 3
Q 2
Q 5
输出样例:
Yes
No

思想:有点类似于蹲坑,每次插入就看下k那个位置有没有人,有人的话k++找下一个,直到找到空的位置。查找类似,有人且等于x的话就找到了。

#include 
#include 

using namespace std;

const int N = 200003, null = 0x3f3f3f3f;

int n;
int h[N]; //开一个远超数据范围的数组,因此查找只存在两种情况,一种是数在坑位里,或者不存在

int find(int x)
{
    int k = (x % N + N) % N;
    while(h[k] != null && h[k] != x)
    {
        k ++;
        if(k == N) k = 0;
    }
    return k;
}


int main()
{
    scanf("%d", &n);
    
    memset(h, 0x3f, sizeof h);// 初始化哈希表的头结点为 -1,表示空链表
    
    while(n -- )
    {
        char op[2];
        int x;
        scanf("%s%d", op, &x);
        int k = find(x);
        if(op[0] == 'I') h[k] = x;
        else
        {
            if(h[k] != null) printf("Yes\n");
            else printf("No\n");
        }
    }
    return 0;
}

你可能感兴趣的:(力扣,算法笔记,哈希,c++,散列表,开发语言)