【数据结构----笔记2】查找算法之【哈希查找或散列查找】

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32211827/article/details/77777663


/*____________________________________________________________________________________________________________
【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;
}









猜你喜欢

转载自blog.csdn.net/qq_32211827/article/details/77777663