博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线性探测法的查找函数
阅读量:3937 次
发布时间:2019-05-23

本文共 2839 字,大约阅读时间需要 9 分钟。

  • 线性探测法:如遇到了冲突,用pos+i(i=1,2,3…)的方式来找到新的未用过的位置。
  • 查找时,如果没有,我们的结束条件就时i>=表的长度。
  • 这样缺点也很突出,就是很多元素会扎堆的出现,降低了效率,我们称为“一次聚集”。为了减轻,我们用了平方查找法。

  • 平方查找法:如遇到了冲突,用pos+i*ipos-i*i(i=1,2,3…)的方式来找到新的未用过的位置。
  • 查找时,如果没有,我们的结束条件就时i>=表的长度/2即可。有证明表示,散列表的长度为4k+3某形式的素数时,可以探查到整个散列空间,这一点很重要。

试实现线性探测法的查找函数。

函数接口定义:

Position Find( HashTable H, ElementType Key );

其中HashTable是开放地址散列表,定义如下:

#define MAXTABLESIZE 100000  /* 允许开辟的最大散列表长度 */typedef int ElementType;     /* 关键词类型用整型 */typedef int Index;           /* 散列地址类型 */typedef Index Position;      /* 数据所在位置与散列地址是同一类型 *//* 散列单元状态类型,分别对应:有合法元素、空单元、有已删除元素 */typedef enum { Legitimate, Empty, Deleted } EntryType;typedef struct HashEntry Cell; /* 散列表单元类型 */struct HashEntry{    ElementType Data; /* 存放元素 */    EntryType Info;   /* 单元状态 */};typedef struct TblNode *HashTable; /* 散列表类型 */struct TblNode {   /* 散列表结点定义 */    int TableSize; /* 表的最大长度 */    Cell *Cells;   /* 存放散列单元数据的数组 */};

函数Find应根据裁判定义的散列函数Hash( Key, H->TableSize )从散列表H中查到Key的位置并返回。如果Key不存在,则返回线性探测法找到的第一个空单元的位置;若没有空单元,则返回ERROR。

裁判测试程序样例:

#include 
#define MAXTABLESIZE 100000 /* 允许开辟的最大散列表长度 */typedef int ElementType; /* 关键词类型用整型 */typedef int Index; /* 散列地址类型 */typedef Index Position; /* 数据所在位置与散列地址是同一类型 *//* 散列单元状态类型,分别对应:有合法元素、空单元、有已删除元素 */typedef enum { Legitimate, Empty, Deleted } EntryType;typedef struct HashEntry Cell; /* 散列表单元类型 */struct HashEntry{ ElementType Data; /* 存放元素 */ EntryType Info; /* 单元状态 */};typedef struct TblNode *HashTable; /* 散列表类型 */struct TblNode { /* 散列表结点定义 */ int TableSize; /* 表的最大长度 */ Cell *Cells; /* 存放散列单元数据的数组 */};HashTable BuildTable(); /* 裁判实现,细节不表 */Position Hash( ElementType Key, int TableSize ){ return (Key % TableSize);}#define ERROR -1Position Find( HashTable H, ElementType Key );int main(){ HashTable H; ElementType Key; Position P; H = BuildTable(); scanf("%d", &Key); P = Find(H, Key); if (P==ERROR) printf("ERROR: %d is not found and the table is full.\n", Key); else if (H->Cells[P].Info == Legitimate) printf("%d is at position %d.\n", Key, P); else printf("%d is not found. Position %d is returned.\n", Key, P); return 0;}/* 你的代码将被嵌在这里 */

输入样例1:(注:-1表示该位置为空。下同。)

11
11 88 21 -1 -1 5 16 7 6 38 10
38
输出样例1:
38 is at position 9.
输入样例2:
11
11 88 21 -1 -1 5 16 7 6 38 10
41
输出样例2:
41 is not found. Position 3 is returned.
输入样例3:
11
11 88 21 3 14 5 16 7 6 38 10
41
输出样例3:
ERROR: 41 is not found and the table is full.

Position Find( HashTable H, ElementType Key ){//函数Find应根据裁判定义的散列函数Hash( Key, H->TableSize )从散列表H中查到Key的位置并返回。//如果Key不存在,则返回线性探测法找到的第一个空单元的位置;//若没有空单元,则返回ERROR.	Position cur,newpos;	int co=0;	newpos=cur=Hash(Key,H->TableSize);	while(H->Cells[newpos].Info!=Empty&&H->Cells[newpos].Data!=Key)		{		co++;		if(co>=H->TableSize) return ERROR;		newpos=(cur+co)%H->TableSize;	}	return newpos;}

转载地址:http://flkwi.baihongyu.com/

你可能感兴趣的文章
在VMware Workstation 中部署VCSA6.5
查看>>
openstack&ceph
查看>>
ME60 双机热备 奇偶mac负载分担
查看>>
oracle11G安装en
查看>>
关于丢失或者损坏etc/fstab文件后
查看>>
VMware-ESXi-6.5 集成第三方驱动方法
查看>>
Oracle RAC on vSphere 安装手册v2
查看>>
V2V迁移
查看>>
BFD
查看>>
docker网络
查看>>
锐捷交换机的多对多镜像口
查看>>
Linux系统修改编码
查看>>
word文档不能显示图片的处理
查看>>
linux的多桌面环境Xephyr
查看>>
初探debian桌面的管理启动
查看>>
七层协议图
查看>>
华为交换机作为AC的条件
查看>>
禁用Ubuntu 15.04登录界面显示客人会话(简单-实用)
查看>>
linux X下安装的软件
查看>>
Linux监测某一时刻对外的IP连接情况
查看>>