哈希表-开放寻址法-拉链法

Posted 一只特立独行的猫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了哈希表-开放寻址法-拉链法相关的知识,希望对你有一定的参考价值。

开放寻址法和拉链法十分类似,只是处理冲突的方式不一样。拉链法通过在冲突位置开链表解决,开放寻址法通过往后顺次找空位置解决。

拉链法:

#include<iostream>
#include<cstdio>
#include<vector>

using namespace std;

const int N = 1e5+3;

vector<int > h[N];

int _hash(int x){
    return (x%N+N)%N;
}

void insert(int x){
    int p = _hash(x);
    h[p].push_back(x);
}

bool find(int x){
    int p=_hash(x);
    for(int k:h[p]){
        if(k==x)
            return true;
    }
    return false;
}

int main(){
    int t;
    cin>>t;
    while(t--){
        char d[2];
        int x;
        scanf("%s%d",d,&x);
        if(d[0]=='I') insert(x);
        else{
            if(find(x))
                puts("Yes");
            else
                puts("No");
        }
    }
    return 0;
}

开放寻址法:

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

const int N = 1e5+3<<2, null = 0x3f3f3f3f;

int h[N];

int _hash(int x){
    return (x%N+N)%N;
}

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

int main(){
    int t;
    cin>>t;
    memset(h,null,sizeof h);
    while(t--){
        char d[2];
        int x;
        scanf("%s%d",d,&x);
        if(d[0]=='I') h[find(x)] = x;
        else{
            if(h[find(x)]!=null)
                puts("Yes");
            else
                puts("No");
        }
    }
    return 0;
}

以上是关于哈希表-开放寻址法-拉链法的主要内容,如果未能解决你的问题,请参考以下文章

哈希表(开放寻址法)

哈希表(开放寻址法)

20162330 第十二周 蓝墨云班课 hash

哈希表字符串哈希

5月4日:unordermap/set,哈希以及哈希常用的拉链法,开放地址法,以及模板的特化相关应用

哈希表(处理冲突时,拉链法)