一、实验目的
熟练掌握哈希表的构造方法,深刻理解哈希表与其他结构表的实质性差别。
二、实验内容
程序的功能是对一批关键字集合采用除留余数法和线性探测再散列的方法解决冲突来建立相应的哈希表和完成查找过程及平均查找长度的计算。
【问题描述】
研究哈希(HAXI)表查找技术的两个重要问题是:构造HAXI函数和处理冲突。现在要求针对某个数据集合中的关键字设计一个哈希表(选择合适的哈希函数和处理冲突的方法),完成HAXI表的建立、查找,并计算HAXI表查找成功的平均查找长度。HAXI函数的构造方法有多种,其中除留余数法是一种最简单和最常用的方法。
考虑具体问题的关键字集合,如{19,14,23,1,68,20,84,27,55,11,10,79}这样一组数据和给定的哈希表长m 或哈希表的装填因子a,选用除留余数法和线性探测再散列技术解决冲突所形成的哈希表以及该哈希表在查找成功时的平均查找长度ASL。
【数据描述】
HAXI表是根据设定的HAXI函数和处理冲突的方法将一组关键字映射到一个有限的连续的地址区间上,并以关键字在地址区间的“象”作为记录在表中的存储位置。因此我们可以采用动态分配的顺序存储结构表示HAXI表。
typedef struct {
KeyType key ;
}ElemType; //元素类型的定义
ElemType *HAXI;//动态分配的哈希表的首地址
【算法描述】
1、选择合适的哈希函数H( key)=key % p(P为小于或等于HAXI 表长的最大质数);
2、计算各个关键字的直接哈希函数值;
3、根据处理冲突的方法建立哈希表,并输出;
4、在哈希表中进行查找,输出查找的结果,以及所需和记录关键字比较的次数,并计算和输出在等概率情况下查找成功的平均查找长度。
#include <stdlib.h>
#include <stdio.h>typedef struct { int key ;}ElemType;int zhishu(int m){ int i,p,flag; for(p=m ; p>=2 ; p--) /*p为不超过m的最大素数*/ { flag=1; for(i=2;i<=p/2;i++) { if(p %i==0) flag=0; if(flag==0) break; } if (flag==1) break; } return p; }ElemType* shuru(ElemType *biao,int n){ int i,elem; biao=(ElemType *)malloc(n*sizeof(ElemType)); printf("\n请输入元素:\n"); for(i=0;i<n;i++){ scanf("%d",&elem); biao[i].key=elem; } for(i=0;i<n;i++){ printf("%d\t",biao[i].key); } return biao; }ElemType* creatbiao(ElemType *st,ElemType *haxi,int n,int m){ int i,j; haxi=(ElemType *)malloc(m*sizeof(ElemType)); for(i=0;i<m;i++){ haxi[i].key=0; } for(i=0;i<n;i++){ j=st[i].key%zhishu(m); while(true){ if(haxi[j].key==0){ haxi[j].key=st[i].key; break; }else{ j=(j+1)%m; } } } for(i=0;i<m;i++){ printf("%d\t",haxi[i].key); } return haxi; }int chazhao(ElemType *haxi,int elem,int m){ int i=0,time=0; i=elem%zhishu(m); while(true){ if(haxi[i].key==elem){ return time+1; }else{ i=i+1; time=time+1; } printf("zheli"); if(haxi[i].key==0||i==m){ break; } } return -1;}int main(){ int n,m,time,elem,sum=0 ,i; ElemType *st,*haxi; printf("\n输入哈希表要输入的元素的个数和表长:\n"); scanf("%d%d",&n,&m); st=shuru(st,n); haxi=creatbiao(st,haxi,n,m); while(true){ printf("\n要查找元素:\n"); scanf("%d",&elem); time=chazhao(haxi,elem,m); if(time==-1){ printf("haha,没找到!!!"); }else{ printf("\n辛辛苦苦找了%d次\n",time); } printf("\n继续1退出0:\n"); scanf("%d",&elem); if(elem==0) break; } for(i=0;i<n;i++){ elem=st[i].key; time=chazhao(haxi,elem,m); sum=sum+time; } printf("\n平均查找长度为:%5.2f\n",(float)sum/n); return 0; }