【数据结构实验】查找(一)基于散列表的查找算法

文章目录

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

1. 引言

本实验将通过C语言实现基于散列表的查找算法

2. 实验原理

2.1 散列表

  散列表(Hash Table)是一种常见的数据结构,通过使用哈希函数将关键字映射到一个固定大小的数组中。这样可以通过计算关键字的哈希值,将其直接映射到数组的索引,实现快速的数据查找。

2.2 线性探测法

  哈希函数是散列表中的关键组成部分,它接受一个关键字并返回其在数组中的索引。一个好的哈希函数应该具有以下特性:

  • 一致性:对于相同的输入,始终返回相同的输出。
  • 均匀性:哈希值在数组范围内均匀分布,避免冲突。

2.3 冲突解决

  由于哈希函数的输出范围有限,不同的关键字可能映射到相同的索引位置,造成冲突。冲突解决的方法有很多,包括链地址法、开放地址法等。

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",};int B[30]={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};

(二)输出要求

  1. 输出散列表每个槽 HEADi对应的单链表;
  2. 编程计算并输出查找成功时的平均查找长度。

3.2 算法实现

  1. 数据结构定义:

    typedef struct P{char *data;struct P *next;
    }P;
    

       定义了一个结构体 P,包含了一个字符串类型的数据域 data 和一个指向下一个节点的指针 next,用于构建散列表的基本节点结构。

  2. 散列表数组:

    P* HEAD[32];
    

       数组 HEAD中的每个元素是一个指向链表头部的指针~这是一个散列表,共有 32 个槽(桶)。

  3. Create 函数:

    void Create(char *A, int K)
    {int i = K;P *p = (P*)malloc(sizeof(P));p->data = A;p->next = HEAD[i];HEAD[i] = p;
    }
    

       Create 函数用于在散列表中插入数据。给定字符串 A 和整数 K,根据 K 计算数组的索引,将数据插入到对应的链表的头部。

  4. Output 函数:

    void Output()
    {P *p;int i;for (i = 0; i < 32; i++){printf("HEAD: %2d", i);if (HEAD[i] != NULL){p = HEAD[i];for (; p != NULL; p = p->next)printf(" —>%s", p->data);}else printf("空");printf("\n");}
    }
    

       Output 函数用于输出整个散列表的内容。对于每个槽,输出链表中的所有节点。

  5. Find 函数:

    int Find(char *ch, int K){int time = 0;int i = K;P *p = HEAD[i];while (p){time++;if (p->data == ch) return time;p = p->next;}return 0;
    }
    

       Find 函数用于在散列表中查找特定数据。给定字符串 ch 和整数 K,根据 K 计算数组的索引,然后在对应链表中查找字符串。如果找到,返回查找次数;否则,返回 0。

  6. 主函数:

    int main()
    {// 数据初始化char *A[30] = { /* ... */ };int B[30] = { /* ... */ };int i, f, times = 0;float sum = 0;// 创建散列表for (i = 0; i < 30; i++){Create(A[i], B[i]);}// 输出散列表Output();// 查找并计算平均查找长度for (i = 0; i < 30; i++){f = Find(A[i], B[i]);if (f){times++;sum += f;}}printf("查找成功时的平均查找长度为:%f", sum / times);return 0;
    }
    

3.3 代码整合

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct P{char *data;struct P *next;
}P;
P* HEAD[32];
void Create(char *A,int K)
{int i=K;P *p=(P*)malloc(sizeof(P));p->data=A;p->next=HEAD[i];HEAD[i]=p;// printf("%d %s\n",i,p->A);
}
void Output()
{P *p;int i;for(i=0;i<31;i++){printf("HEAD: %2d",i);if(HEAD[i]!=NULL){p=HEAD[i];for(;p!=NULL;p=p->next)printf(" —>%s",p->data);}else printf("空");printf("\n");}
}
int Find(char *ch,int K){int time=0;int i=K;P *p=HEAD[i];while(p){time++;if(p->data==ch) return time;p=p->next;}return 0;
}
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",};int B[30]={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 i,f,times=0;float sum=0;for(i=0;i<30;i++){Create(A[i],B[i]);}Output();for(i=0;i<30;i++){f=Find(A[i],B[i]);if(f){//printf("查找成功");times++;sum+=f;}//else  printf("查找失败");}printf("查找成功时的平均查找长度为:%f",sum/times);return 0;
}

4. 实验结果

在这里插入图片描述

HEAD:  0>THEY
HEAD:  1>ON —>A
HEAD:  2>WITH
HEAD:  3>BUT
HEAD:  4空
HEAD:  5>WAS
HEAD:  6>THIS
HEAD:  7>BE —>IN
HEAD:  8空
HEAD:  9>I —>THAT —>OF
HEAD: 10空
HEAD: 11>AND
HEAD: 12空
HEAD: 13>HAD —>HE
HEAD: 14空
HEAD: 15>AN
HEAD: 16空
HEAD: 17空
HEAD: 18>HIS —>AS
HEAD: 19空
HEAD: 20空
HEAD: 21>NOT —>AT
HEAD: 22>FROM —>ARE
HEAD: 23空
HEAD: 24空
HEAD: 25>THE
HEAD: 26>HAVE —>IS
HEAD: 27>BY —>FOR —>TO
HEAD: 28空
HEAD: 29>OR —>IT
HEAD: 30空
查找成功时的平均查找长度为:1.466667

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

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

相关文章

Django 通过 Trunc(kind) 和 Extract(lookup_name) 参数进行潜在 SQL 注入 (CVE-2022-34265)

漏洞描述 Django 于 2022 年6月4 日发布了一个安全更新&#xff0c;修复了 Trunc&#xff08;&#xff09; 和 Extract&#xff08;&#xff09; 数据库函数中的 SQL 注入漏洞。 参考链接&#xff1a; Django security releases issued: 4.0.6 and 3.2.14 | Weblog | Djang…

在 Linux 中重命名文件和目录

目录 前言 使用 mv 命令重命名文件和目录 通过组合 mv、find 和 exec 命令重命名与某个模式匹配的多个文件 使用 rename 命令轻松重命名多个文件 总结 前言 在这篇基本命令行教程中&#xff0c;你将学习在 Linux 终端重命名文件和目录的各种方法。 如何在 Linux 终端中重命…

Vue框架学习笔记——键盘事件

文章目录 前文提要键盘事件&#xff08;并不是所有按键都能绑定键盘事件&#xff09;常用的按键不同的tab和四个按键keyCode绑定键盘事件&#xff08;不推荐&#xff09;Vue.config.keyCode.自定义键名 键码 神奇的猜想div标签和click.enterbutton标签和click.enter 前文提要 …

基于卷积优化算法优化概率神经网络PNN的分类预测 - 附代码

基于卷积优化算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于卷积优化算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于卷积优化优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

1.前端--基本概念【2023.11.25】

1.网站与网页 网站是网页集合。 网页是网站中的一“页”&#xff0c;通常是 HTML 格式的文件&#xff0c;它要通过浏览器来阅读。 2.Web的构成 主要包括结构&#xff08;Structure&#xff09; 、表现&#xff08;Presentation&#xff09;和行为&#xff08;Behavior&#xff…

『亚马逊云科技产品测评』活动征文|AWS 域名注册、启动与连接 EC2 新实例、端口开放详细教程

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 目录 一、AWS 域名注册 二、AWS 域名解析 三、个人网站 ICP 备案 …

Nacos安装使用

Nacos安装使用 官方下载地址: https://github.com/alibaba/nacos/releases 官方文档地址: https://nacos.io/zh-cn/docs/quick-start.html Nacos介绍 Nacos是阿里巴巴开源的一款支持服务注册与发现&#xff0c;配置管理以及微服务管理的组件。用来取代以前常用的注册中心&a…

第二十章 解读PASCAL VOC2012与MS COCO数据集(工具)

PASCAL VOC2012数据集 Pascal VOC2012官网地址&#xff1a;http://host.robots.ox.ac.uk/pascal/VOC/voc2012/ 官方发表关于介绍数据集的文章 《The PASCALVisual Object Classes Challenge: A Retrospective》&#xff1a;http://host.robots.ox.ac.uk/pascal/VOC/pubs/everi…

CH01_适应设计模式

Iterator模式&#xff08;迭代器模式&#xff09; 迭代器模式&#xff08;Iterator&#xff09;,提供一种方法&#xff0c;顺序访问一个聚合对象中各个元素&#xff0c;而不是暴露该对象的内部表示。 类图结构 说明 Iterator&#xff08;迭代器&#xff09; 该角色负责定义按…

深入理解 Django 中的事务管理

概要 在数据库操作中&#xff0c;事务是确保数据完整性和一致性的关键机制。Django 作为一个强大的 Python Web 框架&#xff0c;提供了灵活而强大的事务管理功能。理解和正确使用 Django 中的事务对于开发高质量的 Web 应用至关重要。本文将深入探讨 Django 的事务管理机制&a…

2.多行输入【2023.11.24】

1.问题描述 编写一个Python程序&#xff0c;将字符串 ‘Hello World!’ 存储在变量 str1 中&#xff0c;将字符串 ‘Hello Python!’ 存储在变量 str2 中&#xff0c;然后使用 print 语句分别将它们在不同行打印出来。 2.解决思路 使用print()函数即可 3.代码实现 str1&qu…

1.5 C语言之字符输入输出

1.5 C语言之字符输入输出 一、概述二、字符计数三、行计数四、单词计数五、练习 一、概述 字符文本流&#xff0c;是由多行字符构成的字符序列&#xff0c;而每行字符都由0个或多个字符组成&#xff0c;行末是一个换行符。 标准库提供的输入输出模型&#xff0c;用于读取文本内…

前端vue3——html2canvas给网站截图生成宣传海报

文章目录 ⭐前言⭐选择html2canvas实现网页截图&#x1f496; 截图 ⭐图片url截图显示不出来问题&#x1f496; 解决 ⭐最终效果&#x1f496; 定义海报 ⭐总结⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于 前端vue3——html2canvas给网站截图生成宣传…

JVM字节码文件的相关概述解读

Java全能学习面试指南&#xff1a;https://javaxiaobear.cn 1、字节码文件 从下面这个图就可以看出&#xff0c;字节码文件是可以跨平台使用的 想要让一个Java程序正确地运行在JVM中&#xff0c;Java源码就必须要被编译为符合JVM规范的字节码。 https://docs.oracle.com/java…

3. 深入探究文件 IO

3. 深入探究文件 IO 1. Linux 系统如何管理文件1.1 静态文件与inode1.2 文件打开时的状态 2. 返回错误处理与errno2.1 strerror 函数2.2 perror 函数 3. 空洞文件4. O_APPEND 和 O_TRUNC5. 多次打开同一个文件6. 复制文件描述符6.1 dup6.2 dup2 7. 文件共享7.1 同一个进程中多次…

Python 测试框架 Pytest 的入门

简介 pytest 是一个功能强大而易于使用的 Python 测试框架。它提供了简单的语法和灵活的功能&#xff0c;用于编写和组织测试代码。 1、简单易用&#xff1a;pytest 的语法简洁明了&#xff0c;使得编写测试用例更加直观和易于理解。它使用 assert 语句来验证预期结果&#x…

从0到0.01入门 Webpack| 005.精选 Webpack面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

【蓝桥杯】刷题

刷题网站 记录总结刷题过程中遇到的一些问题 1、最大公约数与最小公倍数 a,bmap(int,input().split())sa*bwhile a%b:a,bb,a%bprint(b,s//b)2.迭代法求平方根(题号1021) #include<stdio.h> #include<math.h> int main() {double x11.0,x2;int a;scanf("%d&…

【RTP】RTPSenderAudio::SendAudio

RTPSenderAudio 可以将一个opus帧封装为rtp包进行发送,以下是其过程:RTPSenderAudio::SendAudio :只需要提供payload部分 创建RtpPacketToSend 并写入各个部分 填充payload部分 sender 本身分配全session唯一的twcc序号 if (!rtp_sender_->

时间序列预测实战(十九)魔改Informer模型进行滚动长期预测(科研版本)

论文地址->Informer论文地址PDF点击即可阅读 代码地址-> 论文官方代码地址点击即可跳转下载GIthub链接 个人魔改版本地址-> 文章末尾 一、本文介绍 在之前的文章中我们已经讲过Informer模型了&#xff0c;但是呢官方的预测功能开发的很简陋只能设定固定长度去预测未…