C++数据结构10:哈希表

1、哈希表概念

哈希表(Hash Table)是一种基于哈希函数(Hash Function)实现的数据结构,用于实现高效的键值对存储与查找。它通过将“键”(Key)映射到表中的“桶”(Bucket)或“槽”(Slot),来快速检索与之相关的“值”(Value)。哈希表的核心思想是通过哈希函数将键转换为一个固定大小的数组索引,从而使得对数据的插入、查找、删除等操作能够在常数时间内完成。

2、实战例子

维护一个数组,能实现数据插入和查询。

#include <iostream>
#include <cstring>
using namespace std;

const int N = 1e5 + 10;
int idx = 0, h[N], ne[N], val[N];

void Insert(int x) {
    int k = (x % N + N) % N;  // 计算哈希值,保证非负;
    val[idx] = x;
    ne[idx] = h[k];  // 连接链表;指向链表第一个元素(代替h[k])
    h[k] = idx ++;  // 插入到链表头; h[k]指向最新的元素索引;
}

bool find(int x) {
    int k = (x % N + N) % N;  // 计算哈希值,保证非负
    for (int i = h[k]; i != -1; i = ne[i]) {  // 遍历链表;相同的哈希值可能会有不同的值
        if (val[i] == x) return true;
    }
    return false;
}

int main() {
    int n;
    cin >> n;
    memset(h, -1, sizeof h);  // 初始化哈希表
    while (n--) {
        char op;
        cin >> op;
        if (op == 'I') {
            int x;
            cin >> x;
            Insert(x);  // 插入操作
        } else if (op == 'Q') {
            int x;
            cin >> x;
            cout << (find(x) ? "Yes" : "No") << endl;  // 查找操作
        }
     }
    return 0;
}

难点1:插入操作

相同的哈希值k,索引通过单链表进行关联;

这里的插入就是在单链表头部插入;

 难点2:int k = (x % N + N) % N;   // 计算哈希值,保证非负;

x可正可负,因此取余之后需要加上N,保证这个数是正的;

所有的数被映射到0~N-1,也就是最多有N个桶;

给定x,计算其k,然后到对应桶里面去遍历就知道它在不在。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值