【数据结构----笔记2】查找算法之【哈希查找或散列查找】
/*____________________________________________________________________________________________________________
【1】哈希算法描述:
【哈希法】又称【散列法】、杂凑法或关键字地址计算法等,相应的表称为哈希表、散列表、杂凑表等
【基本思想】:首先在元素的关键字k和元素的存储位置p之间建立一个对应关系H,使得p=H(k),H称为【哈希函数】
【创建哈希表时】把关键字为k的元素直接存入地址为H(k)的单元;以后当查找关键字为k的元素时,再利用哈希函数
计算出该元素的存储位置:p=H(k),从而达到按关键字直接存取元素的目的。
【2】哈希法主要包括以下两方面的内容:
(1)如何构造哈希函数
(2)如何处理冲突
【3】哈希函数的构造方法
(1)数字分析法
()平方取中法
()分段叠加法
()除留余数法
()伪随机数发
【4】处理冲突的方法
(1)开放定址法
<1>线性探测再散列
<2>二次探测再散列
<3>伪随机探测再散列
(2)再哈希法
(3)链地址法
_______________________________________________________________________________________________________________*/
#include<iostream>
using namespace std;
#define HASH_LENGTH 13 //创建哈希表的长度
#define TABLE_LENGTH 8 //原始数组的长度
int srcData[TABLE_LENGTH]={56,68,92,39,95,62,29,55}; //原始数据
int hashTable[HASH_LENGTH]={0}; //哈希表,初始化为0
/*___________________________________________________________________________________________________________
模块说明:
将关键字data插入到哈希表中
____________________________________________________________________________________________________________*/
template<typename ElemType>void HashInseart(ElemType hashTable[],int iMod,ElemType data)
{
int hashAdd = data%iMod; //计算哈希地址
while(hashTable[hashAdd]) //如果元素的位置已被占用,则利用冲突的解决办法
{
hashAdd = (++hashAdd)%iMod; //利用【线性探测再散列】法解决冲突
}
hashTable[hashAdd] = data; //找到合适的位置,则将元素进行插入
}
/*____________________________________________________________________________________________________________
模块说明:
创建哈希表
____________________________________________________________________________________________________________*/
template<typename ElemType>void CreateHashTable(ElemType hashTable[],int iMod,ElemType data[],int Length)
{
for(int i=0;i<Length;i++) //循环将原始数据插入到哈希表中
{
HashInseart<int>(hashTable,iMod,data[i]); //调用哈希表的插入函数
}
}
/*__________________________________________________________________________________________________________
模块说明
哈希查找法
___________________________________________________________________________________________________________*/
template <typename ElemType>ElemType HashSearch(ElemType hashTable[],int iMod,ElemType key)
{
int iHashAdd=key%HASH_LENGTH; //计算哈希地址
while(hashTable[iHashAdd]&&hashTable[iHashAdd]!=key) //判断地址是否有冲突
{
iHashAdd = (++iHashAdd)%iMod;
}
if(hashTable[iHashAdd]==0)
{
return -1;
}
else
{
return iHashAdd;
}
}
/*____________________________________________________________________________________________________________
模块说明
控制台应用程序,我们的函数从这里开始
_____________________________________________________________________________________________________________*/
int main()
{
CreateHashTable<int>(hashTable,HASH_LENGTH,srcData,TABLE_LENGTH); //调用函数创建哈希表
std::cout<<"【注意:】哈希表中各元素值如下:"<<std::endl;
for(int i=0;i<HASH_LENGTH;i++)
{
cout<<hashTable[i]<<" ";
}
std::cout<<endl;
int iPos = HashSearch<int>(hashTable,HASH_LENGTH,92);
std::cout<<"查找值的所在位置:"<<iPos<<std::endl;
if(iPos>0)
{
std::cout<<"查找成功,该关键字位于数组第"<<iPos<<"位置"<<std::endl;
}
else
{
std::cout<<"查找不成功"<<std::endl;
}
system("pause");
return 0;
}