【AcWing 840题解】模拟散列表

AcWing 840. 模拟散列表
【题目描述】
【AcWing 840题解】模拟散列表_第1张图片
在查看解析之前,先给自己一点时间思考哦!
【AcWing 840题解】模拟散列表_第2张图片
【题解】
这是一个经典的集合操作问题,可以使用哈希表来高效地实现集合的插入和查询操作。

哈希表设计:
哈希表的大小为 N = 200003,这样可以减少冲突的概率(选取质数作为哈希表的大小有助于减少哈希冲突)。
通过哈希碰撞解决,采用线性探测法(即在发生冲突时逐步检查下一个位置),直到找到空位或匹配的位置。
哈希表的初始值设为null = 0x3f3f3f3f,代表位置为空,避免与实际的元素x重复。
【参考代码】

#include 
#include 
using namespace std;

const int N = 200003, null = 0x3f3f3f3f;  // 哈希表的大小和空值表示
int h[N];  // 哈希表

// 查找元素 x 是否存在
int find(int x) {
    // 计算哈希值,确保值为非负数
    int k = (x % N + N) % N;  // 哈希值
    // 线性探测,检查哈希表是否已经存储该元素
    while(h[k] != null && h[k] != x) {
        k++;  // 如果当前位置已被占用且不是目标元素,继续向后查找
        if(k == N)  // 如果查找到数组末尾,则回绕到数组开头
            k = 0;
    }
    return k;  // 返回找到的位置
}

int main() {
    int n; 
    cin >> n;
    
    // 初始化哈希表,所有位置设为 null
    memset(h, 0x3f, sizeof h);
    
    while(n--) {
        string op; 
        int x;  
        cin >> op >> x;
        
        // 查找该元素的位置
        int k = find(x);
        
        if(op == "I")
            h[k] = x;  // 将元素 x 插入哈希表中
        
        if(op == "Q") {
            if(h[k] != null)  // 如果该位置不为空,说明元素存在
                cout << "Yes" << endl;
            else
                cout << "No" << endl;  // 否则,元素不存在
        }
    }
    
    return 0;
}

你可能感兴趣的:(散列表,哈希算法,算法)