实验内容
- Hash表的建立(除留余数法)
- 查找
- 利用线性探索再散列处理冲突
数据结构定义
算法思想及算法设计
(除留余数法)查找之前先进行Hash函数的下标转换,若该下标位置处的关键字与key值相等时,返回当前下标;若不相等,移向下一个位置,再次进行判断,如果新下标为空或者最终又回到原始下标时,返回-1,表示未找到。
实验代码
头文件及数据定义
#include<iostream>
#include<string.h>
#define OK 1
#define ERROE 0
#define MAXSIZE 100
using namespace std;
typedef int Status;
typedef int ElemType;
typedef int Index;
typedef struct
{
ElemType* elem;
int count;
int sizeindex;
}HashTable;
int n;
基本功能函数
Status InitHT(HashTable&H,int n)
{
H.elem=new ElemType[n];
H.count=n;
for(int i=0;i<n;++i)
H.elem[i]=-1;
return OK;
}
int Hash(ElemType key)
{
return key%n;
}
void Insert(HashTable&H,int key)
{
int address=Hash(key);
while(H.elem[address]!=-1)
address=(address+1)%n;
H.elem[address]=key;
}
Index Search(HashTable&H,int key)
{
int address=Hash(key);
while(H.elem[address]!=key)
{
address=(address+1)%n;
if(H.elem[address]==-1||address==Hash(key))
return -1;
}
return address;
}
void Traverse(HashTable&H)
{
for(int i=0;i<H.count;++i)
cout<<H.elem[i]<<' ';
cout<<endl;
}
主函数
int main()
{
int address;
int add[MAXSIZE];
memset(add,0,sizeof(add));
HashTable H;
cout<<"共输入几个数据:";
cin>>n;
InitHT(H,n);
cout<<"依次输入数据:";
for(int i=0;i<n;++i)
{
cin>>add[i];
Insert(H,add[i]);
}
Traverse(H);
cout<<"请输入查找元素:";
int key;
cin>>key;
address=Search(H,key);
if(address!=-1)
cout<<"该元素的下标为"<<address;
else
cout<<"不存在";
return 0;
}
分析与总结
哈希表存储的是键值对,其查找的时间复杂度与元素数量多少无关。
哈希表在查找元素时是通过计算哈希码值来定位元素的位置从而直接访问元素的,因此,哈希表查找的时间复杂度为O(1)。