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

浙公网安备 33010602011771号