散列-PAT.A1078 Hashing

本文介绍了一种使用二次探查法解决哈希冲突的算法实现,通过寻找下一个可用位置来存储元素,并确保了哈希表的负载因子合理。程序首先确定了一个合适的素数大小作为哈希表容量,然后通过二次探查法来处理冲突。

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

注意:本题考察点–二次探查法的上限为所给的用于求余的素数

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<string>
#define maxSize 11111 //设置为10000就会出错

using namespace std;

int judgePrime(int ex) {//判断一个数是否为素数
    int flag = 1;
    if (ex <= 1) return 0;
    for (int i = 2; i <= (int)sqrt(ex * 1.0); i++) {
        if (ex%i == 0) {
            flag = 0;
            break;
        }
    }
    return flag;
}



int main() {
    int n, Tsize;
    cin >> Tsize >> n;
    int test[maxSize];
    int place[maxSize] = { 0 };
    for (int i = 0; i < n; i++) {
        cin >> test[i];
    }

    while (!judgePrime(Tsize)) Tsize++; //扩大到素数

    for (int i = 0; i < n - 1; i++) {
        int temp = test[i] % Tsize;
        int k = 1;
        while (place[temp] && k < Tsize) { temp = (test[i] + k * k) % Tsize; k++; } //循环节为Tsize,二次探查法的上限
        if (k >= Tsize) {
            cout << "- ";
            continue;
        }
        place[temp] = 1;
        cout << temp << " ";
    }
//单独输出最后一个数的序号,保证格式
    int temp = test[n-1] % Tsize;
    int k = 1;
    while (place[temp] && k < Tsize) {
        temp = (test[n-1] + k * k) % Tsize;
        k++; 
    }
    if (k >= Tsize) {
        cout << "-" << endl;
        return 0;
    }
    place[temp] = 1;
    cout << temp;
    cout << endl;

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值