数据结构 哈希表设计

实验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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 基于VUE + Echarts 实现可视化数据大屏展示效果[通俗易懂]

    基于VUE + Echarts 实现可视化数据大屏展示效果[通俗易懂]中国(寿光)国际蔬菜科技博览会智慧农业系统—LED拼接屏展示前端开发文档上线后呈现效果:一、开发需求及方案制定1、确定现场led拼接屏的宽高比,按照1920px*1080px的分辨率,F11全屏后刚好占满整屏且无滚动条;2、与产品设计确定页面相关功能:第一屏相关功能:实时时间、当地天气、菜博会基本信息、图表数据统计(近三日人流量、…

    2022年6月7日
    103
  • mysql8分区表_MySQL 分区表[通俗易懂]

    mysql8分区表_MySQL 分区表[通俗易懂]MySQL分区就是将一个表分解为多个更小的表。从逻辑上讲,只有一个表或一个索引,但在物理上这个表或者索引可能由多个物理分区组成。每个分区在物理上都是独立的。MySQL数据库分区类型:Range分区:行数据基于属于一个给定连续区间的列值放入分区。List分区:和Range分区类似,只是List分区面向的是离散的值。Hash分区:根据用户自定义的表达式的返回值来进行分区,返回值不能为负数。Key分区:…

    2022年6月11日
    44
  • SQL 扩展事件

    SQL 扩展事件

    2021年11月26日
    48
  • git删除暂存区的内容,删除phpstorm产生的.idea文件夹

    git删除暂存区的内容,删除phpstorm产生的.idea文件夹git删除暂存区的内容,删除phpstorm产生的.idea文件夹

    2022年4月24日
    185
  • 微信小程序跳转到其他网页(外部链接)

    微信小程序跳转到其他网页(外部链接)个人类型和海外类型的小程序不支持web-view标签也就是说个人申请的小程序,就别想跳转了!!!!1.开发的时候,我们难免碰到要跳转到其他网页中去那该怎么实现呢?2.例如我想点击一个按钮,跳转到百度(百度的网页还是在小程序中打开)3.wxml1.index.wxml(按钮页面)&lt;viewclass=’wrapper’&gt;&lt;b…

    2022年5月26日
    479

发表回复

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

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