实验七 哈希表查找

实验七 查找
一、哈希表/散列表
简单的来说将数据按规律放,然后按照规律来查找的这么一个存放数据的表

它通过一个关键值的函数将所需的数据映射到表中对应的位置来存放数据和访问数据

这个映射的函数就叫做散列函数

这个存放记录的表就叫做散列表

二、构造哈希表的方法
1、.直接定址法
取关键字的某个线性函数为散列地址,Hash(Key)= Key 或 Hash(Key)= A*Key + B,A、B为常数。

优点:简单没有哈希冲突

缺点:所开辟的空间过大,利用率不高

2、除留余数法
取关键值被某个不大于散列表长m的数p除后的所得的余数为散列地址。Hash(Key)= Key % P。

优点:空间利用率高

缺点:设计复杂,要处理哈希冲突

三、哈希冲突/哈希碰撞
不同的Key值经过哈希函数Hash(Key)处理以后可能产生相同的值哈希地址,我们称这种情况为哈希冲突。任意的散列函数都不能避免产生冲突

四、影响哈希表效率的因素
(1)哈希函数是否均匀

(2)处理冲突的方法

(3)哈希表的负载因子(简单的来说就是填入表中的元素个数/散列表的长度)
在这里插入图片描述
处理哈希冲突的开链法(哈希桶)
闭散列最大的局限性就是空间利用率低,例如载荷因子为0.7,那么仍有0.3的空间未被利用
使用开链法可以使载荷因子为1,每个链上都挂常数个数据,对于哈希表的开链法来说,其开的空间都是按素数个依次往后开的空间
· 那么什么时候扩容呢?当每个链上都挂上数据之后,载荷因子为1的时候,就可以开始扩容了

具体过程如下图所示:
在这里插入图片描述
2.(必做题)实现哈希表的构造和查找算法,要求:用除留余数法构造哈希函数,分别用一次探测再散列、二次探测再散列解决冲突。
线性探测法
若产生冲突则放入下一个空闲区域 但是当数据多 需要发费很多的时间寻找空单元 更糟糕的是,即使表比较空,占据的单元会出现聚集现象,称之为一次聚集 为了解决一次聚集现象 出现了平方探测法

平方探测法
当出现冲突时 寻找空闲区域的步长以平方长度来计算,±i^2 就是 1 -1 4 -4 9 -9 16 -16 25 ……等长度去寻找下一个空白单元,这样的话冲突之间的距离分布相对均匀,解决了一次聚集的现象。但是平方探测法虽然解决了一次聚集的情况但是散列到同一位置的那些元素将探测相同的备选单元(就是冲突占用的单元再发生冲突其寻找空白单元的位置都是一样的,出现了循环) 这就叫做二次聚集

抄来的参考代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#include<math.h>
#include<conio.h>
#include<ctype.h>
#include<windows.h>
#include<time.h>

#define TURE 1
#define FLASE 0
#define ERROR 0
#define OK 1
#define SIZE 100

typedef int ElemType;
typedef struct {
   
	ElemType key;
} keytype;
typedef struct {
   
	keytype elem[SIZE];
	int length;/*当前记录元素的长度*/
	int size;/*哈希表的总长*/
	int select;/*解决冲突方法*/
} hashtable;

int hash(hashtable h,int k) {
   
	return k%(h.size);
}
int hashOnce(hashtable h,int i,int p) {
   
	p+=i;
	return p%(h.size);
}
int d[SIZE];
int hashTwice(hashtable h,int i,int p) {
   
	p+=d[i];
	return p%(h.size);
}
int initHash(hashtable <
  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
哈希表是一种常见的数据结构,用于快速查找和插入数据。它通过将关键字映射到一个确定的位置来实现快速访问。以下是一些哈希表的设计和实现的基本步骤: 1. 选择合适的哈希函数:哈希函数是将关键字映射到哈希表中的索引位置的算法。它应该能够均匀地分布关键字,避免哈希冲突。 2. 创建哈希表结构:哈希表是由一个数组和一个哈希函数组成的。数组用于存储数据,哈希函数用于确定数据在数组中的位置。 3. 插入数据:插入数据时,先通过哈希函数将关键字映射到哈希表中的索引位置,然后将数据存储在该位置。 4. 查找数据:查找数据时,先通过哈希函数将关键字映射到哈希表中的索引位置,然后在该位置查找数据。如果该位置为空,则说明该数据不存在。 5. 解决哈希冲突:由于哈希函数可能会将多个关键字映射到同一个索引位置,因此需要解决哈希冲突。常见的解决方法包括开放地址法和链表法。 6. 调整哈希表大小:当哈希表中的数据量增加时,可能会导致哈希冲突增多,影响哈希表的性能。此时可以通过调整哈希表的大小来解决问题。 7. 删除数据:删除数据时,先通过哈希函数将关键字映射到哈希表中的索引位置,然后将该位置的数据删除。如果该位置为空,则说明该数据不存在。 以上是哈希表的基本设计和实现步骤,当然还有许多细节需要考虑,比如哈希函数的选择和哈希冲突的处理方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值