按照以下函数及冲突解决方案构造哈希表,并查询关键字K(整数)在哈希表中的结果:查询成功,返回K在哈希表中的位置,
否则返回“fail”,并输出查找成功或失败时的比较次数
设定哈希函数为:H(key)=key mod 13
哈希表长度为16,下标取值(0、1......15)
线性探测方法处理冲突:Hi=(H(key)+di) MOD m (m取值16)
【输入形式】
先从标准输入读取整数的个数,然后从下一行开始输入各个整数,整数之间以一个空格分隔。第三行输入查询关键字K
【样例输入1】
12
19 14 23 01 68 20 84 27 55 11 10 79
55
【样例1输出】
5 3
【样例1说明】
原查找表共12个元素,第二行依次输入元素值19 14 23 01 68 20 84 27 55 11 10 79 ,需利用哈希表查找关键字55。
查询结果:55在哈希表位置5,共比较3次查询成功。
【样例输入2】
12
19 14 23 01 68 20 84 27 55 11 10 79
15
【样例2输出】
fail 12
【样例2说明】
原查找表共12个元素,第二行依次输入元素值19 14 23 01 68 20 84 27 55 11 10 79 ,需利用哈希表查找关键字15。
查询结果:查询失败,共比较12次获取查询结果。
【运行结果如下】
样例1:
样例2:
【代码如下】
#include<iostream>
using namespace std;
struct HashTable{
int key; //关键字项
};
int H(int key)
{
int result=key%13;
return result;
}
void InitHash(HashTable HT[])
{
//创建哈希表
int number;
cin>>number;
int a[16];
for(int i=0; i<number; i++)
cin>>a[i];
for(int i=0; i<16; i++)
HT[i].key=0;
for(int i=0; i<number; i++){
int H0 = H(a[i]);
if (HT[H0].key == 0)
HT[H0].key=a[i];
else
{
for (int j=1; j<16; j++){
int Hj = (H0+j)%16;
if (HT[Hj].key == 0){
HT[Hj].key=a[i];
break;
}//if
}//for
}
}//for
}
int SearchHash(HashTable HT[],int key,int &sum)
{
//哈希查找
int H0 = H(key); //第一个查找位置
if (HT[H0].key == 0)
return -1; //元素不存在
else if(HT[H0].key == key)
return H0; //查找成功
else
{
//线性探测方法处理冲突
for (int i=1; i<16; i++)
{
int Hi = (H0+i)%16;
sum++;
if (HT[Hi].key == 0)
return -1;
else if(HT[Hi].key == key)
return Hi;
}//for
}//else
return 0;
}
int main()
{
HashTable HT[16];
int key;
InitHash(HT);//创建哈希表
cin>>key; //输入查找的元素
int sum=1; //比较次数
int result=SearchHash(HT,key,sum);
if (result != -1)
cout<<result<<" "<<sum;
else
cout<<"fail"<<" "<<sum;
return 0;
}
本文章仅供学习和参考!
欢迎交流~