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

xiaoxiao2021-02-28  74

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


转载请注明原文地址: https://www.6miu.com/read-97253.html

最新回复(0)