【数据结构实验】查找(二)基于线性探测法的散列表

news2024/11/18 0:28:05

文章目录

  • 1. 引言
  • 2. 实验原理
    • 2.1 散列表
    • 2.2 线性探测法
  • 3. 实验内容
    • 3.1 实验题目
      • (一)输入要求
      • (二)输出要求
    • 3.2 算法实现
    • 三、实验设计
    • 3.3 代码整合
  • 4. 实验结果

1. 引言

本实验将通过C语言实现基于线性探测法的散列表

2. 实验原理

2.1 散列表

  散列表(Hash Table)是一种常用的数据结构,用于快速存储和查找数据。在散列表中,通过散列函数将关键字映射到一个索引位置,然后将数据存储在该位置上。然而,由于不同的关键字可能映射到相同的索引位置,就会发生散列冲突。线性探测法是一种解决冲突的方法,它在发生冲突时,顺序地检查下一个位置,直到找到一个空闲的位置或者遍历完整个散列表。

2.2 线性探测法

  基于线性探测法的散列表查找是一种解决散列冲突(Hash Collision)的方法之一。具体的线性探测法查找过程如下:

  1. 根据关键字计算散列值,得到初始的索引位置。
  2. 如果该位置为空,表示没有发生冲突,查找失败,返回结果。
  3. 如果该位置不为空,比较关键字是否匹配,如果匹配,则查找成功,返回结果。
  4. 如果不匹配,则继续检查下一个位置(通过线性探测法的方式,即加1),直到找到一个空闲位置或者遍历完整个散列表。
  5. 如果找到空闲位置,表示查找失败,返回结果。
  6. 如果遍历完整个散列表,表示查找失败,返回结果。

  需要注意的是,线性探测法可能会导致聚集(Clustering)现象,即相邻的位置都被占用,导致查找效率下降。为了解决这个问题,可以采用其他的解决冲突方法,如链表法(Chaining)或二次探测法(Quadratic Probing)。

3. 实验内容

3.1 实验题目

   编写算法构造教材图 8.47 的拉链表,输出散列表每个槽对应的单链表,并编程计算查找成功时的平均查找长度。

(一)输入要求

    char *A[30]={
        "THE","OF","AND","TO","A",
        "IN","THAT","IS","WAS","HE",
        "FOR","IT","WITH","AS","HIS",
        "ON","BE","AT","BY","I",
        "THIS","HAD","NOT","ARE","BUT",
        "FROM","OR","HAVE","AN","THEY",
    };
  • 散列函数自选。

(二)输出要求

  1. 输出散列表,空位输出“NULL”;
  2. 编程计算并输出查找成功时的平均查找长度。

3.2 算法实现

三、实验设计

  1. 散列表数组:

    char *TABLE[31] = { "\0" };
    

      数组 TABLE,包含 31 个元素,每个元素是一个字符串指针。

  2. 插入函数 L

    void L(char *TABLE[31], char *K, int M)
    {
        int i = B[N];
        while (TABLE[i])
        {
            sum++;
            if (strcmp(TABLE[i], K) == 0)
                return;
            i = (i + 1) % M;
        }
        if (N < M - 1)
        {
            TABLE[i] = K;
            N++;
            return;
        }
        return;
    }
    

      插入函数 L 用于在散列表中插入数据。当发生冲突时,使用线性探测法沿着数组查找下一个可用的位置。

  3. 主函数:

    int main(){
        char *A[30] = { /* ... */ };
        char *TABLE[31] = { "\0" };
        int i;
        for (i = 0; i < 30; i++){
            L(TABLE, A[i], 31);
        }
        for (i = 0; i < 31; i++){
            if (TABLE[i])
                printf("%d:%s\n", i, TABLE[i]);
            else
                printf("%d:NULL\n", i);
        }
        N = 0;
        sum = 0;
        for (i = 0; i < 30; i++){
            L(TABLE, A[i], 31);
            N++;
        }
        printf("\n平均查找长度为%f", (float)sum / 30);
    }
    

3.3 代码整合

#include<stdio.h>
#include<string.h>
int B[31]={
    25,9,11,27,1,7,9,26,5,13,
    27,29,2,18,18,1,7,21,27,9,
    6,13,21,22,3,22,29,26,15,0
};
int sum=0,N=0;
void L(char *TABLE[31],char *K,int M)
{
    int i=B[N];
    while(TABLE[i])
    {
        sum++;
        if(TABLE[i]==K)	return;
        i=(i+1)%M;
    }
    if(N<M-1)
    {
        TABLE[i]=K;
        N++;
        return;
    }
    return;
}
int main(){
    char *A[30]={
        "THE","OF","AND","TO","A",
        "IN","THAT","IS","WAS","HE",
        "FOR","IT","WITH","AS","HIS",
        "ON","BE","AT","BY","I",
        "THIS","HAD","NOT","ARE","BUT",
        "FROM","OR","HAVE","AN","THEY",
        };
    char *TABLE[31]={"\0"};
    int i;
    for(i=0;i<30;i++){
        L(TABLE,A[i],31);
    }
    for(i=0;i<31;i++){
        if(TABLE[i])
            printf("%d:%s\n",i,TABLE[i]);
        else
            printf("%d:NULL\n",i);
    }
    N=0;
    sum=0;
    for(i=0;i<30;i++){
        L(TABLE,A[i],31);
        N++;
    }
    printf("\n平均查找长度为%f",(float)sum/30);
}

4. 实验结果

在这里插入图片描述

中序遍历:
0:
1:A
2:WITH
3:ON
4:BUT
5:WAS
6:THIS
7:IN
8:BE
9:OF
10:THAT
11:AND
12:I
13:HE
14:HAD
15:OR
16:HAVE
17:AN
18:AS
19:HIS
20:THEY
21:AT
22:NOT
23:ARE
24:FROM
25:THE
26:IS
27:TO
28:FOR
29:IT
30:BY

平均查找长度为3.600000

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1253226.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

车载通信架构 —— 传统车内通信网络CAN(可靠性为王)

车载通信架构 —— 传统车内通信网络CAN(可靠性为王) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非…

cesium轨迹线(闪烁轨迹线)

cesium轨迹线(闪烁轨迹线) 下面有源码 实现思路 使用ellipse方法加载圆型,修改polyline中‘material’方法重写glsl来实现当前效果(cesium版本1.109) 示例代码 index.html <!DOCTYPE html> <html lang="en"><head

SQL Server秘籍:数据分隔解密,数据库处理新境界!

点击上方蓝字关注我 在数据数据过程中经常会遇到数据按照一定字符进行拆分&#xff0c;而在不同版本的SQL SERVER数据库中由于包含的函数不同&#xff0c;处理的方式也不一样。本文将列举2个版本的数据库中不同的处理方法。 1. 使用 XML 方法 在SQL SERVER 2016版本之前&#x…

VMware OpenSLP漏洞解决方案

PS&#xff1a;早期为客户做VMware检测的方法&#xff0c;大家如有遇到可参考 OpenSLP堆溢出漏洞攻击大量ESXI服务器&#xff0c;该漏洞编号为CVE-2021-21974&#xff0c;由 OpenSLP 服务中的堆溢出问题引起 大于以下版本则不受影响 ESXi versions 7.x prior to ESXi7…

LangChain 10思维链Chain of Thought一步一步的思考 think step by step

LangChain系列文章 LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储&#xff0c;读取YouTube的视频文本搜索I…

nodejs+vue+python+PHP+微信小程序-健身俱乐部在线管理平台的设计与实现-安卓-计算机毕业设计

随着经济的发展、财富的累积&#xff0c;人们生活水平、生活质量大幅度提高&#xff0c;生活环境得到明显改善&#xff0c;但是竞争激烈、人们生活压力大、生活节奏快加上饮食习惯和生活方式不合理导致国内 亚健康人群逐年增多。统计数据表明当前我国亚健康人群比例已经超过了7…

Linux-基本指令(1.0)

Linux是一个非常流行的操作的知识&#xff0c;并提供实例帮助读者更好地理解。让我们一起来学习吧&#xff01;系统&#xff0c;也是云计算、大数据、人工智能等领域的重要基础。学习Linux命令是Linux系统管理的基础&#xff0c;也是开发过程中必不可少的技能。本博客将介绍Lin…

思维模型 波纹效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。小变化&#xff0c;大影响。 1 波纹效应的应用 1.1 波纹效应在市场中的应用 2008 年&#xff0c;美国金融危机爆发&#xff0c;导致全球经济陷入衰退。这场危机的起因是美国房地产市场的崩…

【人工智能】Chatgpt的训练原理

前言 前不久&#xff0c;在学习C语言的我写了一段三子棋的代码&#xff0c;但是与我对抗的电脑是没有任何思考的&#xff0c;你看了这段代码就理解为什么了&#xff1a; void computerMove(char Board[ROW][COL], int row, int col) {while (1){unsigned int i rand() % ROW, …

基于 STM32 的温度测量与控制系统设计

本文介绍了如何基于 STM32 微控制器设计一款温度测量与控制系统。首先&#xff0c;我们将简要介绍 STM32 微控制器的特点和能力。接下来&#xff0c;我们将详细讨论温度传感器的选择与接口。然后&#xff0c;我们将介绍如何使用 STM32 提供的开发工具和相关库来进行温度测量和控…

nrm安装及使用

一、介绍 nrm 是一个 Node.js 的 registry 管理工具&#xff0c;它允许你快速地在不同的 npm registry 之间进行切换。通过使用 nrm&#xff0c;你可以方便地将 npm 的 registry 切换为淘宝镜像、npm 官方镜像或者其他定制的镜像&#xff0c;以加快包的下载速度。nrm仓库请点击…

MyBatisPlus入门介绍

目录 一、MyBatisPlus介绍 润物无声 效率至上 丰富功能 二、Spring集成MyBatisPlus 三、SpringBoot集成MyBatisPlus 一、MyBatisPlus介绍 MyBatis-Plus&#xff08;简称 MP&#xff09;是一个MyBatis的增强工具&#xff0c;在MyBatis的基础上只做增强不做改变&#xff0c…

单调栈 模板

class Solution { public: //从后往前的方法 vector<int> dailyTemperatures(vector<int>& temperatures) {int n temperatures.size();vector<int> ans(n);//创建一个大小为n的数组stack<int> st;//这个时候栈中没有任何元素for(int i n-1;i &g…

存算一体还是存算分离?谈谈数据库基础设施的架构选择

从一则用户案例说起 某金融用户问&#xff0c;数据库用服务器本地盘性能好还是外置存储好&#xff1f;直觉上&#xff0c;本地盘路径短性能应该更好。然而测试结果却出乎意料&#xff1a;同等中等并发压力&#xff0c;混合随机读写模型&#xff0c;服务器本地SSD盘合计4万 IOPS…

Spring Boot配置文件 Spring日志文件相关的知识

在上文中&#xff0c;小编带领大家创建了一个Spring Boot项目&#xff0c;并且成功的执行了第一个SPring Boot项目&#xff08;在网页上运行hello world&#xff09; 那么&#xff0c;本文的主要作用便是带领大家走进&#xff1a;Spring Boot配置文件 && Spring日志文件…

图书管理系统源码,图书管理系统开发,图书借阅系统源码三框架设计原理和说明

TuShuManger项目简介和创建 这里一共设计了6个项目,主要是借助三层架构思想分别设计了主要的三层,包括model实体层,Dal数据库操作层,Bll业务调用层,其他有公共使用项目common层,DButitly提取出来的数据库访问层,下面我们分别创建每个项目和开始搭建整个过程 TuShuManger…

STK Components 基础篇

1.开发包 STK Components 访问AGI官网&#xff0c;注册并登录后&#xff0c;从官网下载开发包&#xff1a;https://support.agi.com/downloads/&#xff0c;下载成功后可以申请许可证&#xff0c;AGI会向你注册的邮箱地址发送有效期半年的使用授权许可文件&#xff08;lic文件…

ubuntu+Teslav100 环境配置

系统基本信息 nvidia-smi’ nvidia-smi 470.182.03 driver version:470.182.03 cuda version: 11.4 产看系统体系结构 uname -aUTC 2023 x86_64 x86_64 x86_64 GNU/Linux 下载miniconda https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/?CM&OA https://mi…

Co-DETR:DETRs与协同混合分配训练代码学习笔记

关于论文的学习笔记&#xff1a;Co-DETR:DETRs与协同混合分配训练论文学习笔记-CSDN博客 作者提出了一种新的协同混合任务训练方案&#xff0c;即Co-DETR&#xff0c;以从多种标签分配方式中学习更高效的基于detr的检测器。这种新的训练方案通过训练ATSS和Faster RCNN等一对多标…

机器学习实战第2天:幸存者预测任务

☁️主页 Nowl &#x1f525;专栏《机器学习实战》 《机器学习》 &#x1f4d1;君子坐而论道&#xff0c;少年起而行之 ​ 文章目录 一.任务描述 二.数据集描述 三.主要代码 &#xff08;1&#xff09;主要代码库的说明与导入方法 &#xff08;2&#xff09;数据预处…