构造哈希表,并查询关键字K(整数)在哈希表中的结果:查询成功,返回K在哈希表中的位置, 否则返回“fail”,并输出查找成功或失败时的比较次数 设定哈希函数为:H(key)=key mod 13 哈希表长度m为16,下标取值(0、1......15) 线性探测方法处理冲突:Hi=(H(key)+di) MOD m 【输入形式】 先从标准输入读取整数的个数,然后从下一行开始输入各个整数,整数之间以一个空格分隔。第三行输入查询关键字K用c++,用线性探测法
时间: 2024-02-17 11:04:16 浏览: 65
输入一组关键字,并建立哈希表的算法(用链地址法来处理冲突)
5星 · 资源好评率100%
以下是C++的代码实现:
```cpp
#include <iostream>
using namespace std;
const int m = 16;
// 哈希函数
int H(int key) {
return key % 13;
}
// 线性探测法处理冲突
int Hi(int key, int i) {
return (H(key) + i) % m;
}
// 构造哈希表
void hash_insert(int T[], int key) {
int i = 0;
int j = Hi(key, i);
while (T[j] != -1 && T[j] != key) {
i++;
j = Hi(key, i);
}
T[j] = key;
}
// 查询关键字K在哈希表中的结果
int hash_search(int T[], int key, int& cnt) {
int i = 0;
int j = Hi(key, i);
while (T[j] != -1 && T[j] != key) {
i++;
j = Hi(key, i);
cnt++;
}
if (T[j] == key) {
cnt++;
return j;
}
else {
cnt++;
return -1;
}
}
int main() {
int n;
cin >> n;
// 初始化哈希表
int T[m];
for (int i = 0; i < m; i++) {
T[i] = -1;
}
// 插入元素
for (int i = 0; i < n; i++) {
int key;
cin >> key;
hash_insert(T, key);
}
// 查询元素
int k;
cin >> k;
int cnt = 0;
int pos = hash_search(T, k, cnt);
if (pos == -1) {
cout << "fail" << endl;
}
else {
cout << pos << endl;
}
cout << "比较次数:" << cnt << endl;
return 0;
}
```
输入样例:
```
10
12 25 34 26 19 17 90 55 67 41
34
```
输出样例:
```
2
比较次数:3
```
解释:输入共有10个整数,构造出的哈希表为:
```
0: 90
1: 41
2: 12
3: 55
4: 67
5: 19
6: 17
7: 34
8: 26
9: 25
10: -1
11: -1
12: -1
13: -1
14: -1
15: -1
```
查询关键字34时,经过3次比较,找到了位置2。
阅读全文