基础算法学习--hash表

hash表的作用

  • 将一个大的集合的数存进一个小的区域里

离散化是一种极其特殊的hash表

  • 有开放寻址法和拉链法两种方法,开放寻址法只需要开一个数组,拉链法更接近stl但要多开一个链表

hash表模板(开放寻址法

模拟

#include<iostream>
#include<cstring>

using namespace std;

const int N = 200003;   //若给的1e5,N应为二到三倍的数后的第一个质数(2e5 || 3e5 后第一个质数)
const int null = 0x3f3f3f3f;    //无穷大的数,默认为空位

//hash数组
int h[N];

//查找x应该存到的位置
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(){
    //求质数的过程
    // for(int i = 200000;;i ++){
    //     bool flag = true;
        
    //     for(int j = 2;j * j <= i;j ++){
    //         if(i % j == 0){
    //             flag = false;
    //             break;
    //         }
    //     }
        
    //     if(flag){
    //         cout << i;
    //         break;
    //     }
    // }
    
    //数组初始化
    memset(h,null,sizeof h);
    
    int n;
    cin >> n;
    
    while(n --){
        char op[2];
        int x;
        
        scanf("%s%d",op,&x);
        
        int k = find(x);    //x应该在的地方
        
        if(op[0] == 'I') h[k] = x;
        else{
            if(h[k] != null) cout << "Yes" << endl;
            else cout << "No" << endl;
        }
    }
    
    return 0;
}
posted @ 2021-04-26 17:38  Xuuxxi  阅读(58)  评论(0)    收藏  举报