您的位置:首页 > 其它

1078. Hashing (25)

2015-11-24 18:07 417 查看
1.题目中提到MSize的最大值为10000,而比10000大的最小的一个质数为10007,刚开始误以为是10001,卡了一下

2.Quadratic probing即平方探测,公式为h(x)=(Hash(x)+j*j)% MSize,Hash(x)=x%MSize

//#include<string>
//#include <iomanip>
//#include<stack>
//#include<unordered_set>
//#include <sstream>
//#include "func.h"
//#include <list>
#include<unordered_map>
#include<set>
#include<queue>
#include<map>
#include<vector>
#include <algorithm>
#include<stdio.h>
#include<iostream>
#include<string>
#include<memory.h>
#include<limits.h>
#include<stack>
using namespace std;
/*
4 4
10 6 4 15

5 4
10 6 4 15
6 4
10 6 4 15

*/
int main(void)
{

int mSize, n;
cin >> mSize >> n;
vector<bool> prime(10008, true);
prime[0] = false;
prime[1] = false;
for (int i = 2; i < prime.size(); i++)
{//处理质数
if (prime[i])
{
for (int j = 2; j*i < prime.size(); j++)
prime[j*i] = false;
}
}

if (!prime[mSize])
{//如果mSize不为质数,则把mSize改为比mSize大的最小质数
for (int i = mSize + 1; i < prime.size(); i++)
{
if (prime[i])
{
mSize = i;
break;
}
}
}
vector<int> num(n);
for (int i = 0; i < n; i++)
{
scanf("%d", &num[i]);
}
vector<bool> exist(mSize, false);
vector<int> position(n, -1);
for (int i = 0; i < n; i++)
{
int pos = num[i] % mSize;//直接哈希地址
for (int j = 0; j < mSize; j++)
{//二次探测
int tmpPos = (pos + j*j) % mSize;
if (!exist[tmpPos])
{//如果有空位
exist[tmpPos] = true;
position[i] = tmpPos;
break;
}
}
}
for (int i = 0; i < n; i++)
{
if (position[i] != -1)
printf("%d", position[i]);
else
printf("-");
if (i != n - 1)
printf(" ");
}
cout << endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: