构造哈希表,并查询关键字K(整数)在哈希表中的结果:查询成功,返回K在哈希表中的位置, 否则返回“fail”,并输出查找成功或失败时的比较次数
时间: 2024-02-22 16:59:16 浏览: 123
哈希表的建立与查询
构造哈希表的过程如下:
1. 首先确定哈希表的大小,一般为素数,比如取101、103等。
2. 然后确定哈希函数,一般采用取模运算,即将关键字K对哈希表的大小取模,得到一个值作为该关键字在哈希表中的位置。
3. 如果该位置已经被占用,就需要解决冲突,常用的解决冲突的方法有开放定址法、链地址法等。
4. 最后将关键字K插入到哈希表中。
查询关键字K在哈希表中的过程如下:
1. 根据哈希函数计算K在哈希表中的位置。
2. 如果该位置为空,则说明K不在哈希表中,返回“fail”。
3. 如果该位置不为空,比较该位置的值与K的值是否相等,如果相等,说明查找成功,返回该位置,并输出比较次数。
4. 如果该位置的值与K的值不相等,则说明发生了冲突,需要继续查找,常用的冲突解决方法有线性探测、二次探测、双重哈希等。
5. 如果最终仍然没有找到K,则说明K不在哈希表中,返回“fail”,并输出比较次数。
示例代码如下(采用线性探测法解决冲突):
```C++
#include <iostream>
using namespace std;
const int MAX_SIZE = 101; // 哈希表大小
int hashTable[MAX_SIZE]; // 哈希表
int count = 0; // 比较次数
// 哈希函数,采用取模运算
int hash(int key) {
return key % MAX_SIZE;
}
// 插入关键字K到哈希表中
void insert(int key) {
int pos = hash(key);
while (hashTable[pos] != 0) { // 发生冲突
pos = (pos + 1) % MAX_SIZE; // 线性探测
}
hashTable[pos] = key;
}
// 查找关键字K在哈希表中的位置,返回-1表示查找失败
int search(int key) {
int pos = hash(key);
count = 0;
while (hashTable[pos] != 0 && hashTable[pos] != key) { // 发生冲突
pos = (pos + 1) % MAX_SIZE; // 线性探测
count++;
}
if (hashTable[pos] == key) { // 查找成功
count++;
return pos;
} else { // 查找失败
count++;
return -1;
}
}
int main() {
// 构造哈希表
int data[] = {23, 43, 63, 83, 103, 13, 33, 53, 73, 93};
int n = sizeof(data) / sizeof(data[0]);
for (int i = 0; i < n; i++) {
insert(data[i]);
}
// 查询关键字K在哈希表中的位置
int K = 73;
int pos = search(K);
if (pos == -1) {
cout << "fail" << endl;
} else {
cout << "K's position is " << pos << ", compare " << count << " times" << endl;
}
return 0;
}
```
阅读全文