数据结构 哈希表设计

实验6哈希表设计一、实验目的熟练掌握哈希表的构造方法,深刻理解哈希表与其他结构表的实质性差别。 二、实验内容程序的功能是对一批关键字集合采用除留余数法和线性探测再散列的方法解决冲突来建立相应的哈希表和完成查找过程及平均查找长度的计算。【问题描述】    研究哈希(HAXI)表查找技术的两个重要问题是:构造HAXI函数和处理冲突。现在要求针对某个数据集合中的关键字设

大家好,又见面了,我是你们的朋友全栈君。

实验6 哈希表设计

一、实验目的

熟练掌握哈希表的构造方法,深刻理解哈希表与其他结构表的实质性差别。

 

二、实验内容

程序的功能是对一批关键字集合采用除留余数法和线性探测再散列的方法解决冲突来建立相应的哈希表和完成查找过程及平均查找长度的计算。

【问题描述】

    研究哈希(HAXI)表查找技术的两个重要问题是:构造HAXI函数和处理冲突。现在要求针对某个数据集合中的关键字设计一个哈希表(选择合适的哈希函数和处理冲突的方法),完成HAXI表的建立、查找,并计算HAXI表查找成功的平均查找长度。HAXI函数的构造方法有多种,其中除留余数法是一种最简单和最常用的方法。

考虑具体问题的关键字集合,如{19142316820842755111079}这样一组数据和给定的哈希表长m 或哈希表的装填因子a,选用除留余数法和线性探测再散列技术解决冲突所形成的哈希表以及该哈希表在查找成功时的平均查找长度ASL

 

【数据描述】

HAXI表是根据设定的HAXI函数和处理冲突的方法将一组关键字映射到一个有限的连续的地址区间上,并以关键字在地址区间的“象”作为记录在表中的存储位置。因此我们可以采用动态分配的顺序存储结构表示HAXI表。

 

typedef struct {

    KeyType key ;

}ElemType;      //元素类型的定义

ElemType  *HAXI;//动态分配的哈希表的首地址

 

【算法描述】

1、选择合适的哈希函数Hkey=key % pP为小于或等于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

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/127168.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • ODT 学习笔记「建议收藏」

    ODT 学习笔记「建议收藏」珂朵莉,要一直幸福下去哟!warning:本文在大白天书写,脑子可能不大好用。目前代码选自题解,等有时间自己写一下。简介ODT(OldDriverTree(中文译名张舟树),又称ChthollyTree,即众人皆知的珂朵莉树)是一种非常暴力的思想或者做法(注意我没有说是数据结构)简单来说,其核心思想是把一段区间推平(这也是其适用的地方——区间赋值),推平之后,原数列变成一段一段的了(每段的数值相同),然后就可以搞事了。ODT在随机数据下,复杂度近似O(mlogn)O(mlog

  • Linux技术简历项目经验示例(二)[通俗易懂]

    服务器上线搭建系统环境1.根据现有结构部署工具(PXE+kickstart);2.结合应用系统需求定制部署模版;3.制作系统优化等一键执行脚本;4.自动化部署实施;5.根…

  • 阿里云服务器搭建私人云盘

    阿里云服务器搭建私人云盘1、配置安全组端口新建安全组并开放以下端口2、利用Git来搭建私人云盘1、利用Workbench点击立即登录进行远程连接2、安装docker容器docker是一款开源的容器运行工具,提供了一套便捷的服务打包、分发、部署方式。我们将要部署的服务就是通过docker容器来运行的。docker-compose是一款基于docker的容器编排工具。有了它,我们通过一份配置文件就能启动所有需要的服务。依次执行以下命令,通过自动化脚本完成docker..

  • Linux offsetof宏定义

    Linux offsetof宏定义#include&lt;stddef.h&gt;size_t offsetof(type, member) #define offsetof(TYPE, MEMBER)        \           ((size_t)&amp;((TYPE*)0)-&gt;MEMBER) Themacroreturntheoffsetofthe…

  • settimeout()停止_需求方案

    settimeout()停止_需求方案转载https://aotu.io/notes/2017/09/25/manage-setTimeout-an-setInterval/在管理setTimeout&amp;setInterval这两个APIs时,笔者通常会在顶级(全局)作用域创建一个叫 timer 的对象,在它下面有两个数组成员——{sto,siv},用它们来分别存储需要管理的setTimeoutID/…

  • samba文件共享服务配置过程_linuxsmb文件共享

    samba文件共享服务配置过程_linuxsmb文件共享samba文件共享服务

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号