1078 Hashing (25point(s)) Easy only once *哈希表的问题,散列表取值范围

基本思想:

主要是hash表中的平方探测法得问题;

 

关键点:

注意一个问题,平方探测法并不能完美解决散列问题;

并且在这个题目中,平方探测法的step取值为step=1*1,2*2,.....,(n-1)*(n-1),其中n为散列表长度;

 

#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<vector> 
#include<string>
#include<math.h>
#include<algorithm>
#include<cstring>
using namespace std;
using std::vector;

const int maxn = 11111;
vector<int>vec;
bool ar[maxn];

bool isprime(int n) {
	if (n == 0 || n == 1)
		return false;
	for (int i = 2; i <= int(sqrt(n)); i++) {
		if (n%i == 0) {
			return false;
		}
	}
	return true;
}

int main() {
	fill(ar,ar+maxn,false);
	int s, n;
	int m;
	scanf("%d %d", &n, &s);
	for (int i = 0; i < s; i++) {
		scanf("%d", &m);
		vec.push_back(m);
	}
	while (!isprime(n)) {
		n++;
	}
	//cout << "n->" << n << endl;
	for (int i = 0; i < vec.size(); i++) {
		int nt = vec[i];//各个元素
		int index = nt % n;
		if (!ar[index]) {
			ar[index] = true;
			if (i == 0)
				printf("%d", index);
			else
				printf(" %d", index);
			//cout <<999 <<index << endl;
		}
		else {
			int j;
			for (j=1; j < n; j++) {
				index = (nt + j * j) % n;
				//cout <<endl<< i << "->" << index<<endl;
				if (!ar[index]) {
					ar[index] = true;
					if (i == 0)
						printf("%d", index);
					else
						printf(" %d", index);
					break;
				}
			}
			if (j >= n) {
				if (i == 0)
					printf("-");
				else
					printf(" -");
			}
		}
	}
	system("pause");
	return 0;
}

  

posted @ 2020-02-05 21:07  暮云林凌  阅读(119)  评论(0)    收藏  举报