Description
定义哈希函数为H(key) = key%11
。输入表长(大于、等于11),输入关键字集合,用二次探测再散列构建哈希表,并查找给定关键字。
Input
测试数据组数 1≤�≤50.
每组测试数据格式如下:
哈希表长 11≤�≤104,关键字个数 1≤�≤�.
接下来 � 个不超过 106 的关键字,同组数据的关键字保证不会重复.
然后为查找次数 1≤�≤50.
最后 � 个待查关键字.
Output
对每组测试数据,输出以下信息:
构造的哈希表信息,数组中没有关键字的位置输出NULL
对k个待查关键字,分别输出:
0或1(0—不成功,1—成功)、比较次数、查找成功的位置(从1开始)
思路:
AC代码:
#include <iostream>
#include <math.h>
using namespace std;
int getHash(int key) {
return key % 11;
}//获取哈希值
void set(int number, int* arr, int x, int m) {
int pos = getHash(number);
if (arr[pos] == -1) {
arr[pos] = number;
}
else {
int k = -1;//用于正负反转
int d = 0; //乘数
int count = 0;
//用二次散列探测方法构建哈希表
while (true) {
if (count % 2 == 0) d++; //相当于每两次,d才加1;
pos += d * d * pow(k, count);
pos %= m; //取余
if (pos < 0) { //因为有负数的情况,所以要加个判断条件
pos += m;
}
if (arr[pos] == -1) {
arr[pos] = number;
break;
}
else {
pos -= d * d * pow(k, count);
}
count++;
}
}
}
//传进来的数有 待查找的值,构建好的哈希表,表的长度
void search(int key, int* arr, int m) {
int cnt = 1;//第一次查询时次数就为1
int pos = getHash(key);//获取哈希值。
//在进行二次探测之前判断一次
if (arr[pos] == -1) {
cout << "0 " << cnt << "\n";
return;
}
if (arr[pos] == key) {
cout << "1 " << cnt << " " << pos + 1 << "\n";
return;
}
int k = 1; //用于正负反转
int d = 1;
int count = 1; //用于正负反转的判断,对count取余得到0说明d的值应该加1了
int temp = (pos + k * d * d) % m;
while (1) {
if (arr[temp] == key) {
cout << "1 " << cnt + 1 << " " << temp + 1 << "\n";
return;
}
//探测位置为空,或回到起始位置 则探测失败
if (arr[temp] == -1 || temp == pos) {
cout << "0 " << cnt + 1 << "\n";
return;
}
//如果探测次数等于表长,也探测失败
if (cnt == m) {
cout << "0 " << cnt << "\n";
return;
}
cnt++; //探测次数加 1
k = -k; //正负反转
if (count % 2 == 0) {
d++;
}
temp = (pos + k * d * d) % m;
if (temp < 0) {
temp += m;
}
count++;
}
}
int main() {
int t = 0;
cin >> t;
int n = 0, m = 0;
int searchNumber;
while (t--) {
cin >> m;
cin >> n;
int* arr = new int[m];
//把表所有位置的值设置为-1,用于后续构建表和查找判断。
for (int i = 0; i < m; i++) {
arr[i] = -1;
}
for (int i = 0; i < n; i++) {
cin >> searchNumber;
set(searchNumber, arr, 1, m);
}
for (int i = 0; i < m; i++) {
if (arr[i] != -1) {
cout << arr[i] << " ";
}
else {
cout << "NULL ";
}
}
cout << endl;
int k;
int key = 0;
cin >> k;
while (k--) {
cin >> key;
search(key, arr, m);
}
}
}