#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}; //【1】原始数据
int hashTable[HASH_LENGTH]= {0}; //【2】哈希表,初始化为0
/***************************************************************************************************************************
模块说明:
将关键字data插入到哈希表中
***************************************************************************************************************************/
template<typename ElemType>void HashInsert(ElemType hashTable[],int iMod,ElemType data)
{
int hashAdd = data%HASH_LENGTH; //【1】计算哈希地址
while(hashTable[hashAdd]) //【2】如果元素的位置已经被占用,则利用冲突的解决方法
{
hashAdd = (++hashAdd)%iMod; //【3】利用【线性探测再散列】法解决冲突
}
hashTable[hashAdd] = data; //【4】找到合适的位置,则将元素进行插入
}
/***************************************************************************************************************************
模块说明:
创建哈希表
***************************************************************************************************************************/
template<typename ElemType>void CreateHashTable(ElemType hashTable[],int iMod,ElemType data[],int iLength)
{
for(int i=0;i<iLength;i++) //【1】循环将原始数据插入到哈希表中
{
HashInsert<int>(hashTable,iMod,data[i]); //【2】调用哈希表的插入函数
}
}
/***************************************************************************************************************************
模块说明:
哈希查找算法
***************************************************************************************************************************/
template<typename ElemType>int HashSearch(ElemType hashTable[],int iMod,ElemType key)
{
int iHashAdd = key%HASH_LENGTH; //【1】计算哈希地址
while(hashTable[iHashAdd]&&hashTable[iHashAdd]!=key) //【2】判断地址是否有冲突
{
iHashAdd = (++iHashAdd)%iMod;
}
if(hashTable[iHashAdd]==0) //【3】如果查找到开放地址,查找失败
{
return -1;
}
else
{
return iHashAdd; //【4】查找成功,则返回对应元素的下标
}
}
/***************************************************************************************************************************
模块说明:
控制台应用程序的入口地址
***************************************************************************************************************************/
int main(int argc,char* argv[])
{
CreateHashTable<int>(hashTable,HASH_LENGTH,srcData,TABLE_LENGTH); //【1】调用函数创建哈希表
std::cout<<"【NOTICE】哈希表中各元素的值:"<<std::endl;
for(int i=0;i<HASH_LENGTH;i++)
{
std::cout<<"【"<<i<<"】"<<hashTable[i]<<std::endl;
}
int iPos = HashSearch<int>(hashTable,HASH_LENGTH,92);
std::cout<<iPos<<std::endl;
if(iPos>0)
printf("查找成功,该关键字位于数组的第%d个位置。\n",iPos);
else
printf("查找失败!\n");
std::system("pause");
return 0;
}
【Data_Structure笔记10】查找算法之【哈希查找或散列表查找法】
最新推荐文章于 2023-05-18 00:02:02 发布