11-散列2 Hashing (25分)

分析:

/*
 * quadratic probing 平方探测。
 * 增量 <= tableSize/2
 * 正数增量,不考虑负数增量。
*/


代码:

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

bool isPrime(const int &n) {
    if(n < 2) return false;
    if(n > 2 && n%2 == 0) return false;
    int sr = sqrt(n);
    for(int i(3); i <= sr; i += 2) {
        if(n % i == 0) return false;
    }
    return true;
}

int nextPrime(int a) {
    while(!isPrime(a)) ++a;
    return a;
}

//返回是否找到插入位置。若找到,data带回插入位置。
bool isAccessInTable(bool *&table, const int &size, int &data) {
    int i(0);               //增量
    int pos(data%size);     //位置
    int halfSize(size/2);
    while(table[pos] && i <= halfSize) {
        ++i;
        pos = (data + i*i)%size;
    }
    if(i > halfSize) return false;
    //找到插入位置。
    data = pos;
    return true;
}

int main(void) {
    int m, n;
    cin >> m >> n;
    int newSize = nextPrime(m);
    bool *hashTable = new bool[newSize]();
    //处理第一个数据
    int data;
    cin >> data;
    hashTable[data%newSize] = true;
    cout << data%newSize;
    //处理其他数据
    for(int i(1); i < n; ++i) {
        cin >> data;
        if(!isAccessInTable(hashTable, newSize, data)) cout << " -";
        else {
            hashTable[data] = true;
            cout << " " << data;
        }
    }

    return 0;
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值