【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; }
相关文章推荐
- 【Data_Structure笔记11】查找算法之【二叉排序树】
- 【Data_Structure笔记12】查找算法之【基于二叉排序树的查找】
- 【Data_Structure笔记9】查找算法之【顺序查找和折半查找】
- 【Data_Structure笔记3】排序算法之插入排序常见的三种算法
- 【Data_Structure笔记4】排序算法之【交换类排序】
- 【数据结构----笔记2】查找算法之【哈希查找或散列查找】
- 【Data_Structure笔记6】排序算法之【二路归并排序】
- 【Data_Structure笔记8】排序算法之【选择排序---堆排序】
- 【Data_Structure笔记5】排序算法之【选择类排序】
- 【Data_Structure笔记7】排序算法之【链式基数排序】
- [算法 笔记] 查找二叉树上任意两个结点的最近共同祖先(更新版本)
- #数据结构与算法学习笔记#剑指Offer1:二维数组中的查找(JAVA)
- 算法系列笔记10(有关图的算法三—最大流与二分图)
- 算法笔记3-树的查找
- 算法复习笔记:二分查找
- 【Data_Structure笔记2】线性表的链式存储【单链表】
- 算法查找学习笔记
- Data Structures with C++ Using STL Chapter 3算法概述---笔记
- 算法笔记_130:行列递增矩阵的查找(Java)
- java数据结构和算法------哈希查找