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,然后到对应桶里面去遍历就知道它在不在。