数据结构 哈希表设计
实验6 哈希表设计
一、实验目的
熟练掌握哈希表的构造方法,深刻理解哈希表与其他结构表的实质性差别。
二、实验内容
程序的功能是对一批关键字集合采用除留余数法和线性探测再散列的方法解决冲突来建立相应的哈希表和完成查找过程及平均查找长度的计算。
【问题描述】
研究哈希(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>
#include <math.h>
#include <conio.h>
#define NULL 0
typedef int KeyType;
typedef struct {
KeyType key ;
}ElemType;
int haxi(KeyType key,int m){
/*根据哈希表长m, 构造除留余数法的哈希函数haxi*/
int i,p,flag;
for (p=m ; p>=2 ; p--) /*p为不超过m的最大素数*/
{ for (i=2,flag=1;i<=p/2 &&flag;i++)
if (p %i==0) flag=0;
if (flag==1) break;
}
return key%p; /*哈希函数*/
}
void inputdata(ElemType **ST,int n ){
/*从键盘输入n个数据,存入数据表ST(采用动态分配的数组空间)*/
KeyType key;
int i;
(*ST)=(ElemType*)malloc(n*sizeof(ElemType));
printf("\nPlease input %d data:",n);
for (i=0;i<n;i++)
scanf("%d",&((*ST)[i].key));
}
void createhaxi(ElemType **HAXI,ElemType *ST,int n,int m){
/*根据数据表ST,构造哈希表HAXI*,n,m分别为数据集合ST和哈希表的长度*/
int i,j;
(*HAXI)=(ElemType*)malloc(m*sizeof(ElemType));
for (i=0;i<m;i++) (*HAXI)[i].key=NULL; /*初始化哈希为空表(以0表示空)*/
for (i=0;i<n;i++){
j=haxi(ST[i].key,m); /*获得直接哈希地址*/
while ((*HAXI)[j].key!=NULL) j=(j+1)%m;/*用线性探测再散列技术确定存放位置*/
(*HAXI)[j].key=ST[i].key; /*将元素存入哈希表的相应位置*/
}
}
int search(ElemType *HAXI,KeyType key,int m,int *time){
/*在表长为m的哈希表中查找关键字等于key的元素,并用 time记录比较次数,
若查找成功,函数返回值为其在哈希表中的位置,否则返回-1*/
int i;
*time=1;
i=haxi(key,m);
while (HAXI[i].key!=0 && HAXI[i].key!=key) {i++; ++*time;}
if (HAXI[i].key==0) return -1;
else return i;
}
main(){
ElemType *ST,*HAXI;
KeyType key;
int i,n,m,stime,time;
char ch;
printf("\nPlease input n && m(n<=m)"); /*输入关键字集合元素个数和HAXI表长*/
scanf("%d%d",&n,&m);
inputdata(&ST,n); /*调用函数,输入n个数据*/
createhaxi(&HAXI,ST,n,m); /*建立哈希表*/
/*输出已建立的哈希表*/
printf("\nThe haxi Table is\n");
for (i=0;i<m;i++) printf("%5d",i);
printf("\n");
for (i=0;i<m;i++) printf("%5d",HAXI[i].key);
/*哈希表的查找,可进行多次查找*/
do {
printf("\nInput the key you want to search:");
scanf("%d",&key);
i=search(HAXI,key,m,&time);
if (i!=-1) {printf("\nSuccess,the position is %d ",i);/*查找成功*/
printf("\nThe time of compare is %d",time);
}
else{ printf("\nUnsuccess"); /*查找失败*/
printf("\nThe time of compare is %d",time);
}
printf("\nContinue(y/n):\n"); /*是否继续查找yes or no*/
ch=getch();
}
while (ch=='y' || ch=='Y') ;
/*计算表在等概率情况下的平均查找长度,并输出*/
for (stime=0,i=0;i<n;i++) {
search(HAXI,ST[i].key,m,&time);
stime+=time;
};
printf("\nThe Average Search Length is%5.2f",(float)stime/n);
ch=getch();
}
测试数据:
按运行提示输入数据(关键字集合)ST,建立HAXI表,然后进行多次查找。
Please input n && m(n<=m):12 15
19 14 23 01 68 20 84 27 55 11 10 79
The haxi Table is:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
14 1 68 27 55 19 20 84 79 23 11 10
Input the key you want to search:27
Success,the position is 4
The time of compare is 4;
Continue(y/n):y
Input the key you want to search:68
Success,the position is 3
The time of compare is 1;
Continue(y/n):n
The Average Search Length is 2.5
数据结构 哈希表设计相关推荐
- 数据结构哈希表的实现与设计
数据结构哈希表查找姓名的课程设计 有没有大神能帮忙写一下这道题,课设的题目.用C++语言 问题描述:针对某公司中花名设计哈希表,并完成相应的建表和查表程序,基本要求: (1)假设花名为汉字拼音形式.名 ...
- 数据结构-----------------------哈希表(最通俗易懂的文章)
哈希表 简要 通俗来讲,哈希表是通过函数 (映射关系) 来直接寻找表中存储的关键字,哈希表也是一种数据结构,它是表结构的一种升级拓展,哈希就是一种函数映射,表是一种数据结构,那么合起来就叫哈希表 那么 ...
- 数据结构——哈希表的详解与实现
数据结构--哈希表(HashTable) 1.前言 当我们频繁的查找数据中的某个元素时,我们通常会选择数组来存放数据,因为数组的的内存是连续的,可以直接通过下标访问数据,但是它添加和删除数据比较麻 ...
- 算法笔记(三)特殊数据结构——哈希表、有序表、并查集、KMP、Manacher、单调栈、位图、大数据类题
layout: post title: 算法笔记(三)特殊数据结构--哈希表.有序表.并查集.KMP.Manacher.单调栈.位图.大数据类题 description: 算法笔记(三)特殊数据结构- ...
- java hashtable 数据结构_数据结构--哈希表(Java)
数据结构--哈希表(Java) 介绍 哈希表 底层是 数组加链表 或者是 数组加二叉树 ,一个数组里面有多个链表,通过散列函数来提高效率 代码 package cn.guizimo.hashtab; ...
- Python中常用的数据结构---哈希表(字典)
Python中常用的数据结构-哈希表(字典) 常用的数据结构有数组.链表(一对一).栈和队列.哈希表.树(一对多).图(多对多)等结构. 在本目录下我们将讲解,通过python语言实现常用的数据结构. ...
- 【数据结构】人名查询哈希表设计(链地址法)
文章目录 核心代码 链表节点定义 链地址法处理冲突 查询函数 完整代码下载 核心代码 哈希表使用「链地址法」解决地址冲突的方式,其数据结构就采用 数组+链表 ,数组的每一个元素都是一个链表节点,当地址 ...
- 数据结构 - 哈希表(散列表)
一.概念 散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构.也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快 ...
- 数据结构 — 哈希表
目录 文章目录 目录 哈希表 哈希表 哈希表,又称为散列表,是根据键值对(Key/Value)进行访问的数据结构,它让 Value 经过哈希函数的转换映射到哈希表对应的位置上,查找效率非常高.哈希索引 ...
- 哈希表数据结构_Java数据结构哈希表如何避免冲突
前言 一.哈希表是what? 这是百度上给出的回答: 简而言之,为什么要有这种数据结构呢? 因为我们想不经过任何比较,一次从表中得到想要搜索的元素.所以就构造出来了哈希表,通过某种函数(哈希函数)使元 ...
最新文章
- dns (域名系统)
- Pacbio 纯三代组装复活草基因组
- CCF青年精英大会(YEF2021)即将召开
- DCMTK:查询/检索服务类用户(C-FIND操作)
- 服务中添加mysql服务_Windows平台下在服务中添加MySQL
- solor快速_快速简单高效的搭建 SolrCloud 集群
- Linux上搭建Samba,实现windows与Linux文件数据同步
- 被弃用的 Docker 未死:带着 1.05 亿美元融资“回归”,估值高达 21 亿
- 中兴路西藏北路到浦东国际机场路线(ddmap20100114)
- 有道云怎么换行_markdown换行语法 有道云笔记markdown怎么换行?
- 备忘录模式-Memento
- WordPress采集插件-WordPress文章自动采集发布
- CentOS8.4搭建PXE启动Ubuntu-server20.04(UEFI)
- 【WIN10】PS/2 标准键盘鼠标带感叹号(代码10,39)(适用于红米G)
- 基于SIMULINK的AWGN信道仿真
- 学习笔记-Leaflet加载北京地铁线路
- css打印适应纸张_使用原生css+js+html实现打印A4纸张的功能页面
- Java 处理资源的try语句 (try-with-resources, TWR)
- Kaggle教程 机器学习中级7 Data Leakage
- ssm框架前后端数据交互完整示例
热门文章
- 不择手段背单词、新东方词根词缀词典、超级新华字典、英语词根词缀记忆大全词典
- 运维学习部分基础知识概括
- 信息系统项目管理师(2022年) —— 第 11 章 项目风险管理
- ERP原理与应用期末复习
- CCNA中英对照题库(285道选择题)
- 音频soundpool
- 上海计算机等级考试档案记录,【档案区】上海市高等学校计算机等级考试(一级)考试大纲...
- 远程计算机没反映6678,6678 PCIe 与FPGA LINK UP 后 不能获得FPGA的DEVICE_ID和VENDDR_ID
- SQL Server行列转换
- oracle卸载步骤图解,Oracle详细卸载步骤