• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 数据结构 哈希表设计

数据结构 哈希表设计

作者: 字体:[增加 减小] 来源:互联网 时间:2017-12-31

通过本文主要向大家介绍了数据结构,哈希表等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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

 

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 数据结构 多关键字排序
  • 数据结构 哈希表设计
  • 数据结构 最小生成树
  • 数据结构 数组顺序存储详细介绍
  • 数据结构之数组Array实例详解
  • C语言数据结构 栈的基础操作
  • C语言数据结构二叉树简单应用
  • C语言数据结构中串的模式匹配
  • 数据结构 C语言实现循环单链表的实例
  • 数据结构与算法中二叉树子结构的详解

相关文章

  • 2017-05-28深入理解C++中的文件操作
  • 2017-05-28详解C语言中的常量指针和指针常量
  • 2022-04-30C语言结构体数组详解(带实例演示)
  • 2017-05-28VC++开发中完美解决头文件相互包含问题的方法解析
  • 2017-05-28C语言动态数组的使用实现代码
  • 2017-05-28求素数,用vector存储的实现方法
  • 2017-05-28C/C++函数调用栈的实现方法
  • 2017-05-28C语言实现BMP转换JPG的方法
  • 2017-05-28深入理解memmove()与memcpy()的区别以及实现方法
  • 2017-05-28基于memset()函数的深入理解

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 浅谈C/C++ 语言中的表达式求值
    • static_cast,dynamic_cast,reinterpret_cast和const_cast的区别详解
    • c++中do{...}while(0)的意义和用法
    • 浅析C#与C++相关概念的比较
    • 深入分析C++中执行多个exe文件方法的批处理代码介绍
    • 二叉搜索树的插入与删除(详细解析)
    • 浅析C++中模板的那点事
    • 关于C++中的友元函数的一些总结
    • C++中 map的基本操作
    • 总结IOS中nil、Nil、NULL和NSNull区别

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有