1078. Hashing (25)

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;
}


posted @ 2015-11-24 18:07  siukwan  阅读(140)  评论(0)    收藏  举报