6-1 线性探测法的查找函数

这篇具有很好参考价值的文章主要介绍了6-1 线性探测法的查找函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

函数接口定义:

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文章来源地址https://www.toymoban.com/news/detail-776488.html

裁判测试程序样例:

#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);
    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.

代码实现

// 在散列表 H 中查找关键字 Key 的位置,
// 如果 Key 在 H 中出现,则返回其下标;
// 如果 Key 在 H 中没有出现,则返回 H 中第一个空位置的下标;
// 如果散列表 H 已满,则返回 -1。

Position Find( HashTable H, ElementType Key )
{
    int index = Hash(Key, H->TableSize);  // 计算 Key 的散列值
    int _size = 0;  // 循环计数器

    // 在未遍历整个散列表之前进行循环
    while(_size<H->TableSize)
    {
        // 如果当前位置的状态为空(即未被占用),
        // 或者当前位置的 Data 值等于要查找的关键字 Key,
        // 即查找成功,返回当前位置的下标 index。
        if(H->Cells[index].Info==Empty||H->Cells[index].Data==Key)
            return index;

        // 如果当前位置的 Data 值不等于要查找的关键字 Key,
        // 继续计算下一位置的下标(使用线性探测算法)并继续查找。
        index = (index+1)%H->TableSize;  // 线性探测
        _size ++;  // 增加循环计数器的值
    }

    // 查找失败,返回 -1。
    return ERROR;
}

到了这里,关于6-1 线性探测法的查找函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PTA7-2 求矩阵每行元素的和分数 10作者 张丽华单位 嘉兴南湖学院

    7-2 求矩阵每行元素的和 分数 10 全屏浏览题目 切换布局 作者 张丽华 单位 嘉兴南湖学院 本题要求编写程序,使用指针方式求一个给定的m×n矩阵各行元素之和。 输入格式: 输入第一行给出两个正整数m和n(1≤m,n≤6),再输入m行数据,每行n个整数,每个整数之间用空格分隔

    2024年02月05日
    浏览(73)
  • 【Linear Probing | 线性探测】深度学习 线性层

    【Linear Probing | 线性探测】深度学习 线性层 自监督模型评测方法 是测试预训练模型性能的一种方法,又称为linear probing evaluation 训练后,要评价模型的好坏,通过将最后的一层替换成线性层。 预训练模型的表征层的特征固定,参数固化后未发生改变,只通过监督数据去训练

    2024年02月15日
    浏览(42)
  • 查找算法【哈希表】 - 处理冲突的方法:开放地址法-二次探测法 & 随机探测法 & 再散列法

    查找算法【哈希表】 - 处理冲突的方法:开放地址法-二次探测法 随机探测法 再散列法 【二次探测法】 二次探测法指采用前后跳跃式探测的方法,发生冲突时,向后1位探测,向前1位探测,向后2^2 位探测,向前2^2 位探测……以跳跃式探测,避免堆积。 二次探测的增量序列为

    2024年02月10日
    浏览(42)
  • 线性代数 --- LU分解(Gauss消元法的矩阵表示)

                     首先, LU分解实际上就是用矩阵的形式来记录的高斯消元的过程 。其中,对矩阵A进行高斯消元后的结果为矩阵U,是LU分解后的两个三角矩阵中其中之一。U是一个上三角矩阵,U就是上三角矩阵upper triangle的首字母的大写。         高斯消元的每一步都

    2024年02月02日
    浏览(53)
  • Hash(散列)冲突解决之线性探测再散列和二次探测再散列

    H(key) = key %13,key 为,采用开放地址法中的线性探测再散列解决冲突,依次输入11 个,16,74,60,43,54,90,46,31,29,88,77,构造哈希表 如图,例如 16%13=3,将16放入3号位置,29%13 = 3,将29放入3号位置,而此时3号位已经有元素。 就顺着表往后放,直到6号没

    2024年02月08日
    浏览(46)
  • 【Sklearn】基于线性判别法的数据分类预测(Excel可直接替换数据)

    线性判别分析(Linear Discriminant Analysis,简称LDA)是一种经典的模式识别和分类方法,它的目标是找到一个投影,将数据投影到低维空间,使得不同类别的样本在投影后的空间中有最大的类别间距,同时最小化类内方差。 模型原理如下: 假设有d维的数据,分为K个类别。我们

    2024年02月12日
    浏览(38)
  • mysql创建四张表 分别存储 学生信息 课程信息 分数表 教师信息表

    学生信息表 Student 字段名 字段类型 字段约束 / 含义 Sno Varchar(3) Not null / 学员编号 Sname Varchar(4) Not null / 学员姓名 Ssex Varchar(2) Not null / 性别 Sbirthday Datetime 生日 Classnum Varchar(5) 班级号 CREATE TABLE STUDENT ( SNO VARCHAR(3) NOT NULL, SNAME VARCHAR(4) NOT NULL, SSEX VARCHAR(2) NOT NULL, SBIRTHDAY DATETIME,

    2024年01月18日
    浏览(49)
  • E : B DS二分查找_搜索二维矩阵

    使用二分查找法来判断m*n矩阵matrix中是否存在目标值target。 该矩阵有以下特性: 每行中的整数从左到右升序排列; 每行的第一个整数大于前一行的最后一个整数。 第一行输入m和n,分别表示矩阵的行数和列数,接着输入m*n个整数。 接着,输入查找次数t,接着依次输入t个整

    2024年02月04日
    浏览(42)
  • DS线性表之链表

    我们上一期介绍了顺序表,它的底层就是数组,我们也分别对顺序表的动态版本和静态版本进行了实现!并且分析了顺序表的优缺点,优点是:尾插、尾删效率很高,其时间复杂度是O(1);缺点是:在头部插入、删除的时候效率低,其时间复杂度是O(N);而且即使是动态版本的扩

    2024年02月08日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包