数据结构之哈希表(学习笔记)

本文介绍了散列表的两种实现方法——开放寻址法和拉链法。开放寻址法通过线性探测来解决冲突,一旦发生冲突,则从当前位置开始寻找下一个空闲位置;拉链法则是将多个元素通过链表串联起来,每个散列位置对应一个链表。文章通过具体的C++代码示例展示了两种方法的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开放寻址法:

用一个数组存值,由于可能发生冲突,数组的大小一般开成数据量的2~3倍大于数据量的最小质数(这样的冲突概率最小)。

如果当前位有数的话就往后移动一位,直到没人,如果到最后的话,从头开始找空位。

拉链法:

用一个索引数组把多个链表串联在一起。插入的是链表头与索引之间插入

如果当成蹲坑:
开放寻址法:如果看到一个坑里有人从当前就往后找没人的坑,找到头的话,从0号坑(最起始的坑)接着往后找
拉链法:认准一个坑无论有没有人都在厕所门口排队

开放寻址法

//开放寻址法
#include<iostream>
#include<cstring>
using namespace std;
const int N=200003,null=0x3f3f3f3f;//用null来标记当前位是否有人
int e[N];
int find(int x){
    int k=(x%N+N)%N;
    while(e[k]!=null&&e[k]!=x){
        k++;
        if(k==N)k=0;//如果到最后了,就从开头开始找
    }
    return k;
}//如果x存在的话,返回x的下标,不存在的话返回x应该要存的位置的下标

int main(){
    int n;
    cin>>n;
    memset(e,0x3f,sizeof e);
    while(n--){
        char op[2];int x;
        scanf("%s%d",op,&x);
        int k=find(x);
        if(op[0]=='I')e[k]=x;
        else{
            if(e[k]!=null)cout<<"Yes"<<endl;
            else cout<<"No"<<endl;
        }
    }
    return 0;
}

拉链法:

#include <cstring>
#include <iostream>

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;
    scanf("%d", &n);

    memset(h, -1, sizeof h);

    while (n -- )
    {
        char op[2];
        int x;
        scanf("%s%d", op, &x);

        if (*op == 'I') insert(x);
        else
        {
            if (find(x)) puts("Yes");
            else puts("No");
        }
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值