题目描述 定义哈希函数为H(key) = key%11,输入表长(大于、等于11)。输入关键字集合,用线性探测再散列构建哈希表,并查找给定关键字。输入 测试次数t 每组测试数据为: 哈希表长m、关键字个数n n个关键字 查找次数k k个待查关键字 输出 对每组测试数据,输出以下信息: 构造的哈希表信息,数组中没有关键字的位置输出NULL 对k个待查关键字,分别输出:0或1(0—不成功,1—成功)、比较次数、查找成功的位置(从1开始)使用C++代码解题
时间: 2024-01-22 08:18:23 浏览: 62
以下是使用C++实现的代码:
```
#include <iostream>
#include <vector>
using namespace std;
// 定义哈希函数
int H(int key, int m) {
return key % m;
}
// 线性探测再散列构建哈希表
vector<int> hashTable(int m, int n, vector<int> keys) {
vector<int> T(m, -1); // 初始化哈希表,-1表示该位置没有关键字
for (int i = 0; i < n; i++) {
int j = 0, k = H(keys[i], m);
while (j < m && T[k] != -1) { // 线性探测查找下一个空位置
j++;
k = (k + 1) % m;
}
if (j == m) { // 哈希表已满,无法插入
cout << "哈希表已满,插入失败!" << endl;
return vector<int>(0);
} else {
T[k] = keys[i]; // 插入关键字
}
}
return T;
}
// 查找关键字
vector<int> searchKeys(vector<int> T, int k, vector<int> searchKeys) {
vector<int> result;
for (int i = 0; i < k; i++) {
int j = 0, key = searchKeys[i], pos = H(key, T.size());
while (T[pos] != -1 && T[pos] != key && j < T.size()) { // 线性探测查找关键字
j++;
pos = (pos + 1) % T.size();
}
if (T[pos] == key) { // 查找成功
result.push_back(1); // 标记为成功
result.push_back(j + 1); // 比较次数
result.push_back(pos + 1); // 成功位置
} else { // 查找失败
result.push_back(0); // 标记为失败
result.push_back(j + 1); // 比较次数
result.push_back(0); // 失败位置为0
}
}
return result;
}
int main() {
int t;
cin >> t; // 输入测试次数
while (t--) {
int m, n, k;
cin >> m >> n; // 输入哈希表长和关键字个数
vector<int> keys(n);
for (int i = 0; i < n; i++) {
cin >> keys[i]; // 输入关键字集合
}
vector<int> T = hashTable(m, n, keys); // 构造哈希表
if (T.empty()) { // 哈希表构造失败
continue;
}
for (int i = 0; i < m; i++) {
if (T[i] == -1) { // 该位置没有关键字
cout << "NULL ";
} else {
cout << T[i] << " ";
}
}
cout << endl;
cin >> k; // 输入待查关键字个数
vector<int> searchKeys(k);
for (int i = 0; i < k; i++) {
cin >> searchKeys[i]; // 输入待查关键字
}
vector<int> result = searchKeys(T, k, searchKeys); // 查找关键字
for (int i = 0; i < k; i++) {
if (result[i * 3] == 1) { // 查找成功
cout << "1 " << result[i * 3 + 1] << " " << result[i * 3 + 2] << endl;
} else { // 查找失败
cout << "0 " << result[i * 3 + 1] << " " << result[i * 3 + 2] << endl;
}
}
}
return 0;
}
```
输入格式为:
```
测试次数t
哈希表长m 关键字个数n
n个关键字
待查关键字个数k
k个待查关键字
```
输出格式为:
```
构造的哈希表信息
每个待查关键字的信息,包括0或1、比较次数、查找成功的位置
```
阅读全文