您的位置:首页 > 其它

【Data_Structure笔记10】查找算法之【哈希查找或散列表查找法】

2017-08-27 21:30 736 查看
#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;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: