哈希(Hash)表

存储结构

1.开放寻址法

在这里插入图片描述

2.拉链法 (添加、查找)

h ( x ) ϵ [ 0 , 1 0 5 ] h(x) \epsilon [0,10^{5}]

  • x x mod 1 0 5 10^{5}
  • 冲突
    在这里插入图片描述
    模板
(1) 拉链法
    int h[N], e[N], ne[N], idx;

    // 向哈希表中插入一个数
    void insert(int x)
    {
        int k = (x % N + N) % N;
        e[idx] = x;
        ne[idx] = h[k];
        h[k] = idx ++ ;
    }

    // 在哈希表中查询某个数是否存在
    bool find(int x)
    {
        int k = (x % N + N) % N;
        for (int i = h[k]; i != -1; i = ne[i])
            if (e[i] == x)
                return true;

        return false;
    }

(2) 开放寻址法
    int h[N];

    // 如果x在哈希表中,返回x的下标;如果x不在哈希表中,返回x应该插入的位置
    int find(int x)
    {
        int t = (x % N + N) % N;
        while (h[t] != null && h[t] != x)
        {
            t ++ ;
            if (t == N) t = 0;
        }
        return t;
    }

C++代码

#include <iostream>
#include <cstring>

using namespace std;

const int N = 100003;

int h[N],e[N],ne[N],idx;

void insert(int x){
    int k = (x % N + N) % N;
    e[idx] = x;
    ne[idx] = h[k];
    h[k] = idx++;
}

bool find(int x){
    int k = (x % N + N) % N;
    for(int i = h[k];i != -1;i = ne[i]){
        if(e[i] == x)
            return true;
    }
    return false;
}

int main(){

    int n;
    cin >> n;
    memset(h,-1,sizeof h);
    while(n--){
        char op[2];
        int x;
        cin >> op >> x;
        if(op[0] == 'I')
            insert(x);
        else{
            if(find(x))
                puts("Yes");
            else
                puts("No");
        }
    }

    return 0;
}

字符串哈希方式

发布了52 篇原创文章 · 获赞 5 · 访问量 2257

猜你喜欢

转载自blog.csdn.net/advjj_058229/article/details/100155722