• 线性探测法:如遇到了冲突,用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 <stdio.h>#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 -1
Position 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);elseprintf("%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;
}

线性探测法的查找函数相关推荐

  1. 线性探测法的查找函数 (20 分)

    6-22 线性探测法的查找函数 (20 分) 试实现线性探测法的查找函数. 函数接口定义: Position Find( HashTable H, ElementType Key ); 其中HashT ...

  2. 【数据结构】哈希表——线性探测法、链地址法、查找成功、查找不成功的平均长度

    一.哈希表 1.概念 哈希表(Hash Table)也叫散列表,是根据关键码值(Key Value)而直接进行访问的数据结构.它通过把关键码值映射到哈希表中的一个位置来访问记录,以加快查找的速度.这个 ...

  3. 【除留余数法定义hash函数+线性探测法解决hash冲突】数据结构实验之查找七:线性之哈希表

    Think: 1知识点:除留余数法定义hash函数+线性探测法解决hash冲突 数据结构实验之查找七:线性之哈希表 Time Limit: 1000MS Memory Limit: 65536KB P ...

  4. 查找算法【哈希表】 - 处理冲突的方法:开放地址法-线性探测法

    查找算法[哈希表] - 处理冲突的方法 无论如何设计散列函数,都无法避免发生冲突. 如果发生冲突,就需要处理冲突. 处理冲突的方法分为3种: 开放地址法 链地址法 建立公共溢出区. [开放地址法] 开 ...

  5. 散列表查找——线性探测法

    //散列表查找--线性探测法 #include<iostream> #include<stdlib.h> using namespace std; void print(int ...

  6. 计算散列表查找成功和查找不成功的平均查找长度(利用线性探测法处理冲突)

    散列表 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.映射函数叫做 ...

  7. 第十五周项目二-----用哈希法组织关键字之线性探测法

    /*烟台大学计算机与控制工程学院 作者:孙潇 时间:2015年12月11日 问题描述: 已知一个关键字序列为if.while.for.case.do.break.else.struct.union.i ...

  8. 数据结构 散列表 除留余数法 线性探测法解决冲突

    已知9名学生的信息,每个学生信息包括编号和姓名.学生信息为11,王红,22,刘军,47,王亮,92,张强,16,吴迪,3,李伟,7,赵磊,29,钱鹤,8,孙芳.用散列表实现以编号为关键码的查找.散列函 ...

  9. C++数据结构——小明的通讯录(哈希表线性探测法)

    小明的通讯录 小明上中学了,为了方便和家里以及同学联系,爸爸终于给小明买了一台手机.该手机的存储容量可以扩充,因此,可以存储的电话号码数量没有限制. 小明的手机有一个特殊的功能,对于打进或拨出的电话, ...

最新文章

  1. 在云中进行灾难恢复的五种有效方式
  2. Arxiv最新论文,深度学习热点论文,Arxiv每日更新
  3. python知识:用turtle绘制樱桃树
  4. 2018-行远自迩,登高自卑
  5. html Selection
  6. python中lxml模块的使用
  7. android 判断是否是标点符号_Java 中文字符判断 中文标点符号判断
  8. FBI树(信息学奥赛一本通-T1365)
  9. spring-chapter02-IoC Container
  10. Timus 1079. Maximum
  11. 关于Mysql 查询所有表的实时记录用于对比2个MySQL 库的数据是否异步
  12. 制作 jvm 火焰图
  13. 我们的眼睛用得太狠了
  14. mysql init 崩溃_MySQL · 引擎特性 · InnoDB崩溃恢复
  15. WEBSHELL权限提升技巧
  16. Go 语言中三个点的用法
  17. 波浪下划线怎么设置_如何在word中的文字下面加波浪线
  18. MapServer 之 发布网络地图服务(WMS-Web Map Service)
  19. 【STM32单片机】推箱子游戏设计
  20. 效率倍增!12 个必知必会的 Python 数据处理技巧!

热门文章

  1. 如何订阅(Subscribe)现有功能包节点的话题,介绍实现思路
  2. matlab QR分解
  3. 前苹果工程师吐槽:“Siri” 代码过时且复杂,不可能变得像 ChatGPT 一样强大...
  4. 微软模式转型,遭遇严重挫折
  5. dorado7.x UploadAction存在的诡异问题
  6. Golang 新手入门教程(二):Go 常用开发工具介绍
  7. CLion 快捷键总结
  8. html 判断是否顶层,为什么很多人都不考虑买顶楼! 看了这些您就知道了!
  9. 配置yum源(removing mirrorlist with no valid mirrors Cannot find a valid baseurl for repo)
  10. flutter 阿里云上传文件