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

文章目录

  • 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.hqwc.cn/news/218342.html

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

相关文章

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

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

一盏茶的时间,入门 Node.js

一、.什么是 Node.js&#xff1f; Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时&#xff0c;用于构建高性能、可伸缩的网络应用。 它采用事件驱动、非阻塞 I/O 模型&#xff0c;使其在处理并发请求时表现出色。 二、安装 Node.js 首先&#xff0c;让我们从 Node.…

Stable-Diffusion——Windows部署教程

Windows 参考文章&#xff1a;从零开始&#xff0c;手把手教你本地部署Stable Diffusion Webui AI绘画(非最新版) 一键脚本安装 默认环境安装在项目路径的venv下 conda create -n df_env python3.10安装pytorch&#xff1a;&#xff08;正常用国内网就行&#xff09; python -…

发布鸿蒙的第一个java应用

1.下载和安装华为自己的app开发软件DevEco Studio HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者 2.打开IDE新建工程&#xff08;当前用的IDEA 3.1.1 Release&#xff09; 选择第一个&#xff0c;其他的默认只能用(API9)版本&#xff0c;搞了半天才发现8&#xff…

微机原理_4

一、单项选择题&#xff08;本大题共 15 小题&#xff0c;每小题 3 分&#xff0c;共 45 分。在每小题给出的四个备选项中&#xff0c;选出一个正确的答案&#xff0c;请将选定的答案填涂在答题纸的相应位置上。) 1在产品研制的过程中,通常采用( )类型的存储芯片来存放待调试的…

WordPress安装AWS插件实现文本转语音功能

适用于 WordPress 的 AWS 插件示例演示了内容创建者如何轻松地为所有书面内容添加文本转语音功能。随着语音搜索的不断增加&#xff0c;以音频格式提供更多网站内容变得至关重要。通过添加语音功能&#xff0c;网站访客可以通过在线音频播放器和播客应用程序等新渠道使用您的内…

mysql高级知识点

一、mysql架构 连接层&#xff1a;负责接收客户端的连接请求&#xff0c;可以进行授权、认证(验证账号密码)。服务层&#xff1a;负责调用sql接口&#xff0c;对sql语法进行解析&#xff0c;对查询进行优化&#xff0c;缓存。引擎层&#xff1a;是真正进行执行sql的地方&#x…

3.2 CPU的自动化

CPU的自动化 改造1-使用2进制导线改造2根据整体流程开始改造指令分析指令MOV_A的开关2进制表格手动时钟gif自动时钟gif 根据之前的CPU内部结构改造,制造一个cpu控制单元 改造一 之前的CPU全由手动开关自己控制,极度繁琐,而开关能跟二进制一一对应, 开:1, 关:0图1是之前的, …

Selenium实战指南:安装、使用技巧和JavaScript注入案例解析

背景 ​ 最近一段时间我会重新开一个关于selenium的专题&#xff0c;由浅入深的给大家讲一下selenium&#xff0c;同时回顾一下之前学的内容&#xff0c;selenium可以实现模拟登录&#xff0c;动态数据获取&#xff0c;获取动态cookie等等&#xff0c;还有可以写一些抢p的脚本…

Vue打包错误UnhandledPromiseRejectionWarning: CssSyntaxError

错误详情如下&#xff1a; building for production...Error processing file: static/css/app.3d5caae7aaba719754d7d5c30b864551.css (node:33011) UnhandledPromiseRejectionWarning: CssSyntaxError: /Users/yt/Documents/BM/sims-plus/sims-website/static/css/app.3d5caa…

ELK+kafka+filebeat企业内部日志分析系统

1、组件介绍 1、Elasticsearch&#xff1a; 是一个基于Lucene的搜索服务器。提供搜集、分析、存储数据三大功能。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasticsearch是用Java开发的&#xff0c;并作为Apache许可条款下的开放源码发布…

Kafka 如何实现顺序消息

版本说明 本文所有的讨论均在如下版本进行&#xff0c;其他版本可能会有所不同。 Kafka: 3.6.0Pulsar: 2.9.0RabbitMQ 3.7.8RocketMQ 5.0Go1.21github.com/segmentio/kafka-go v0.4.45 结论先行 Kafka 只能保证单一分区内的顺序消息&#xff0c;无法保证多分区间的顺序消息…