DS哈希查找—线性探测再散列
题目描述
定义哈希函数为H(key) = key%11,输入表长(大于、等于11)。输入关键字集合,用线性探测再散列构建哈希表,并查找给定关键字。
–程序要求–
若使用C++只能include一个头文件iostream;若使用C语言只能include一个头文件stdio
程序中若include多过一个头文件,不看代码,作0分处理
不允许使用第三方对象或函数实现本题的要求
输入
测试次数t
每组测试数据为:
哈希表长m、关键字个数n
n个关键字
查找次数k
k个待查关键字
输出
对每组测试数据,输出以下信息:
构造的哈希表信息,数组中没有关键字的位置输出NULL
对k个待查关键字,分别输出:0或1(0—不成功,1—成功)、比较次数、查找成功的位置(从1开始)
样例输入
1
12 10
22 19 21 8 9 30 33 4 15 14
4
22
56
30
17
样例输出
22 30 33 14 4 15 NULL NULL 19 8 21 9
1 1 1
0 6
1 6 2
0 1
#include <iostream>
using namespace std;
class HashTable{
int len;
int keyNum;
int *array;
int H(int key);
public:
HashTable();
~HashTable();
void Show();
void Search(int key);
};
int HashTable::H(int key) {
return key%11;
}
HashTable::HashTable() {
cin>>len>>keyNum;
array = new int[len];
for(int i=0;i<len;i++)
array[i]=0;
for(int i=0;i<keyNum;i++)
{
int key;
cin>>key;
for(int j=0;j<len;j++)
if(array[(H(key)+j)%len]==0) {
array[(H(key)+j)%len] = key;
break;
}
}
}
HashTable::~HashTable() {
delete []array;
}
void HashTable::Show() {
for(int i=0;i<len;i++)
{
if(array[i]==0)
cout<<"NULL";
else
cout<<array[i];
if(i!=len-1)
cout<<" ";
}
cout<<endl;
}
void HashTable::Search(int key) {
for(int j=0;j<len;j++) {
if (array[(H(key) + j) % len] == key) {
cout << "1 " << j + 1 << " " << (H(key) + j) % len + 1<<endl;
break;
}
else if(array[(H(key) + j) % len] == 0)
{
cout << "0 " << j + 1<<endl;
break;
}
}
}
int main()
{
int t;
cin>>t;
while (t--)
{
HashTable myTable;
myTable.Show();
int k;
cin>>k;
while (k--)
{
int key;
cin>>key;
myTable.Search(key);
}
}
return 0;
}
本文介绍了使用线性探测再散列方法构建哈希表的详细过程,包括哈希函数的定义、输入输出说明及样例。在C++或C语言环境下,遵循特定的程序要求,实现关键字集合的哈希存储和查找功能。内容涵盖了测试次数、哈希表长、关键字个数、查找次数等关键信息,并提供了具体的样例输入和输出。
499

被折叠的 条评论
为什么被折叠?



