2021-11-07 哈希查找

按照以下函数及冲突解决方案构造哈希表,并查询关键字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; 
}

本文章仅供学习和参考!

欢迎交流~

Guess you like

Origin blog.csdn.net/m0_58489132/article/details/121191443