哈希表的构造和查找算法
实现哈希表的构造和查找算法,要求:用除留余数法构造哈希函数,分别用一次探测再散列、二次探测再散列解决冲突。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
/*typedef struct {ElemType *elem;int count;int sizeindex;
}HashTable;*/
typedef struct{int key;
}keytype;typedef struct { keytype elem[100];int length; /*当前的长度*/int size; /*哈希表的总长*/
}hashtable;
int a=0,b=0,select;
int hash2(int i,int t)
{ if(i%2==0)t=t+pow(++a,2);elset=t-pow(++b,2);return t;
}
int hash1(int i,int t)
{
i++;t=i;return t;
}
int hash(hashtable h,int k)
{return k%(h.size);
}
void creat(hashtable *h)
{ int i,j,key,t,p;printf("请输入哈希表的长度,和表中的记录长:");scanf("%d%d",&h->size,&h->length);printf("请选择:\n1。采用线性探测再散列处理冲突\n2。采用二次探测再散列处理冲突"); scanf("%d",&select);for(i=0;i<h->size;i++)//初始化将哈希表中的关键字都置为-1,代表此存储位子为空 h->elem[i].key=-1;printf("input data:\n");for(j=0;j<h->length;j++){ scanf("%d",&key);p=hash(*h,key);if(h->elem[p].key==-1)h->elem[p].key=key;else{ i=0;t=p;while(h->elem[p].key!=-1&&h->elem[p].key!=key&&i<h->size/2){ if(select==2){p=hash2(i,t);i++;}else if(select==1){p=hash1(i,t);i++;}}a=b=0; //此纪录找到储存位置,将a,b参数置0,为下一个记录冲突做准备 h->elem[p].key=key;}}
}
int SearchHash(hashtable H,int k){int p,i=0,t=0;p=hash(H,k); //求得Hash的地址 while(H.elem[p].key!=-1&&(k!=H.elem[p].key))//该地址中有记录,并且关键字不相等 {if(select==2){p=hash2(i,t); // 用二次探测法求的下一个探测的地址 i++; }else if(select==1){p=hash1(i,t); // 用二次探测法求的下一个探测的地址 i++;}}if(k==H.elem[p].key)return p;elsereturn -1;}void printhash(hashtable *h){ int i;for(i=0;i<h->size;i++)printf("%-4.2d",i);printf("\n");for(i=0;i<2*h->size;i++)printf("--");printf("\n");for(i=0;i<h->size;i++)printf("%-4.2d",h->elem[i].key);}
int main(){ hashtable t;int i,key,key1,c;creat(&t);printf("显示哈希表:\n\n");printhash(&t);printf("\n\n当前哈希表记录长为:%d\n",t.length);printf("\n请输入要查找记录的关键字:");scanf("%d",&key);c=SearchHash(t,key);if(c!=-1)printf("该记录的位子是:%d\n",c);elseprintf("没有找到该记录!\n");return 0;}
测试结果如下:
请输入哈希表的长度,和表中的记录长:30 10
请选择:
1。采用线性探测再散列处理冲突
2。采用二次探测再散列处理冲突2
input data:
12 13 14 56 25 35 36 38 37 12
显示哈希表:00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
------------------------------------------------------------------------------------------------------------------------
-01 -01 -01 -01 -01 35 36 37 38 -01 -01 -01 12 13 14 -01 -01 -01 -01 -01 -01 -01 -01 -01 -01 25 56 -01 -01 -01 当前哈希表记录长为:10请输入要查找记录的关键字:14
该记录的位子是:14
哈希表的构造和查找算法相关推荐
- 查找算法【哈希表】 - 散列查找及性能分析
查找算法[哈希表] - 散列查找及性能分析 散列表虽然建立了关键字和存储位置之间的直接映像,但冲突不可避免,在散列表的查找过程中,有的关键字可以通过直接定址1次比较找到,有的关键字可能仍然需要和若干关 ...
- 数据结构:哈希表函数构造和冲突解决方法
哈希表 哈希函数:记录的存储位置和它的关键字之间建立一个确定的对应关系. 冲突:对不同的关键字可能得到同一哈希地址,这种现象称为冲突. 哈希函数构造方法 1.直接定址法 取关键字或关键字的某个线性函数 ...
- 哈希表的构造及解决冲突
1. 数字分析法 如果事先知道关键字集合,并且每个关键字的位数比哈希表的地址码位数多时,可以从关键字中选出分布较均匀的若干位,构成哈希地址.例如,有80个记录,关键字为8位十进制整数d1d2d3-d7 ...
- 哈希表(散列查找)(c/c++)
通过哈希表进行查找的特点是:不需要比较关键字,而是通过哈希函数计算出关键字的位置.一般来讲,为了进行高效率的查找,要求哈希函数简单均匀.空间利用率高.关键字之间的冲突少. 关于散列查找的实现需要着重考 ...
- 数据结构的学生信息哈希表的建立与查找
设有若干个学生的考试成绩,采用除留余数求哈希地址,将学生的信息存储到该地址空间,并且采用线性探测法解决冲突问题. #include <iostream.h>#include <con ...
- 算法就这么回事(一)七大查找算法汇总
前言 查找(search)是在一个数据结合中查找满足给定条件的记录.对于查找问题来说,没有一种算法对于任何情况下都是合适的.有的查找速度比其他算法快,但是需要较多的存储空间(例如 Hash 查找):有 ...
- 【ZZ】详解哈希表的查找
详解哈希表的查找 https://mp.weixin.qq.com/s/j2j9gS62L-mmOH4p89OTKQ 详解哈希表的查找 2018-03-01 算法与数据结构 来自:静默虚空 http: ...
- 查找三 哈希表的查找
要点 哈希表和哈希函数 在记录的存储位置和它的关键字之间是建立一个确定的对应关系(映射函数),使每个关键字和一个存储位置能唯一对应.这个映射函数称为哈希函数,根据这个原则建立的表称为哈希表(Hash ...
- lfu算法实现c语言_哈希查找算法(C语言实现)
上一节介绍了有关哈希表及其构造过程的相关知识,本节将介绍如何利用哈希表实现查找操作.在哈希表中进行查找的操作同哈希表的构建过程类似,其具体实现思路为:对于给定的关键字 K,将其带入哈希函数中,求得与该 ...
最新文章
- oracle中怎样查询用户权限
- 用python画爱心-python画一个玫瑰和一个爱心
- Linux Kernel and Android 休眠与唤醒(中文版)
- Boost::context模块fiber的jump测试程序
- 手动编译php,手动编译安装php7的方式
- 使用CLion在Gtkmm中加载glade文件时的相对路径问题
- 1Python全栈之路系列之MySQL数据库基本操作
- 1.2 Enterprise Library 应用程序块
- 201621123015《Java程序设计》第11周学习总结
- 论各类BI工具的“大数据”特性!
- Linux学习笔记十七——Linux系统启动流程
- CSS文件在jsp 文件中应该放的位置
- Boosting原理学习
- 人间繁华江上明月,乃浮生一梦,惟真情长在——读沈君山《浮生再记》(并转书评)...
- 工业相机视场和分辨率计算
- php输出26个大小写英文字母
- Redis 跳跃表的原理和实现
- 框架使用 - 收藏集 - 掘金
- Vue 扫码及生成二维码
- 小程序长按识别公众号二维码-已实现