数据结构 哈希表设计

实验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

 

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 汉语拼音发音教学视频_钢琴手把手教学视频

    汉语拼音发音教学视频_钢琴手把手教学视频pycharm汉化pycharm怎么改成汉语,手把手教学,超详细(汉语插件安装教程)首先,打开pycharm。然后点击左上角File(文件)会弹出如下页面继续点击蓝色位置Settings…(设置)会弹出一个页面如下:继续点击蓝色位置Plugins(插件)在搜索栏中输入chinese,如图然后安装第二个(可以滑动找一下),点击Install(安装),会加载一下下载进度条,然后变成这样:安装之后点击绿色按钮RestartIDE,会弹出点击蓝色按钮Restart,然后pycharm会重启,重启后

    2022年8月26日
    6
  • C# ManualResetEvent

    C# ManualResetEvent原文链接http://dotnetpattern.com/threading-manualreseteventManualResetEvent和AutoResetEvent一样,是另外一种.NET线程同步技术。ManualResetEvent被用于在两个或多个线程间进行线程信号发送。多个线程可以通过调用ManualResetEvent对象的WaitOne方法进入等待或阻塞状态。当…

    2022年7月13日
    21
  • 世界各个地区WIFI 2.4G及5G信道划分表(附无线通信频率分配表)

    目前主流的无线WIFI网络设备802.11a/b/g/n/ac:传统802.111997年发布两个原始数据率:1Mbps和2Mbps跳频展频(FHSS)或直接序列展布频谱(DSSS)三个不重叠的信道中,工业、科学、医学(ISM)频段频率为2.4GHz最初定义的载波侦听多点接入/避免冲撞(CSMA-CA)802.11a1999年发布提供多种调制类型的数据传输率:6、9、12、18、24…

    2022年4月5日
    528
  • idea2021.8.2激活码(JetBrains全家桶)

    (idea2021.8.2激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~BCEBXQ3A4G-eyJsaWNlbnNlSWQiOi…

    2022年3月22日
    52
  • 数据库学习笔记【自学教程】—— 如何建立数据库

    数据库学习笔记【自学教程】—— 如何建立数据库PS:本项目将在D盘下创建名为Test的文件夹(D:/Test)。如若想修改文件位置,需在后续代码中一并修改。点击工具栏“新建查询”或者使用快捷键Ctrl+N==>打开查询分析器SQLServer中,一个数据库至少包括两个文件。一个是主数据文件,一个是日志文件。一、建立数据库1)通过语句建立数据库新建一个名为“教师授课管理数据库”的数据库,代码如下:CREATEDATABASE教师授课管理数据库ON(NAME=T…

    2025年11月26日
    3
  • 经典的20道AJAX面试题[通俗易懂]

    经典的20道AJAX面试题[通俗易懂]1、什么是AJAX,为什么要使用Ajax(请谈一下你对Ajax的认识)什么是ajax:AJAX是“AsynchronousJavaScriptandXML”的缩写。他是指一种创建交互式网页应用的网页开发技术。Ajax包含下列技术:基于web标准(standards-basedpresentation)XHTML+CSS的表示;使用DOM(DocumentObjectM…

    2022年8月27日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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