​C语言顺序查找算法以及代码​

通过前面对静态查找表的介绍,静态查找表即为只做查找操作的查找表。

静态查找表既可以使用顺序表表示,也可以使用链表结构表示。虽然一个是数组、一个链表,但两者在做查找操作时,基本上大同小异。

本节以静态查找表的顺序存储结构为例做详细的介绍。

1、顺序查找的实现

静态查找表用顺序存储结构表示时,顺序查找的查找过程为:从表中的最后一个数据元素开始,逐个同记录的关键字做比较,如果匹配成功,则查找成功;反之,如果直到表中第一个关键字查找完也没有成功匹配,则查找失败。

顺序查找的具体实现代码为:

#include <stdio.h>

#include <stdlib.h>

#define keyType int

typedef struct {

        keyType key;//查找表中每个数据元素的值

        //如果需要,还可以添加其他属性

}ElemType;

typedef struct{

        ElemType *elem;//存放查找表中数据元素的数组

        int length;//记录查找表中数据的总数量

}SSTable;

//创建查找表 v

oid Create(SSTable **st,int length){

        (*st)=(SSTable*)malloc(sizeof(SSTable));

        (*st)->length=length;

        (*st)->elem =(ElemType*)malloc((length+1)*sizeof(ElemType));

        printf("输入表中的数据元素:\n");

        //根据查找表中数据元素的总长度,在存储时,从数组下标为 1 的空间开始存储数据

        for (int i=1; i<=length; i++) {

                scanf("%d",&((*st)->elem[i].key));

        }

}

//查找表查找的功能函数,其中key为关键字

int Search_seq(SSTable *st,keyType key){

        st->elem[0].key=key;//将关键字作为一个数据元素存放到查找表的第一个位置,起监视哨的作用

        int i=st->length;

        //从查找表的最后一个数据元素依次遍历,一直遍历到数组下标为0

        while (st->elem[i].key!=key) {

                i--;

        }

        //如果 i=0,说明查找失败;反之,返回的是含有关键字key的数据元素在查找表中的位置

        return i;

}

int main() {

        SSTable *st;

        Create(&st, 6);

        getchar();

        printf("请输入查找数据的关键字:\n");

        int key;

        scanf("%d",&key);

        int location=Search_seq(st, key);

        if (location==0) {

        printf("查找失败");

        }else{

                printf("数据在查找表中的位置为:%d",location);

        }

        return 0;

}

可运行代码中设置了一个固定长度为 6 的顺序表,例如在查找表为{1,2,3,4,5,6}找到关键字为 1 的数据元素的位置,则运行效果为:

输入表中的数据元素:
1 2 3 4 5 6
请输入查找数据的关键字:
2
数据在查找表中的位置为:2

同时,在程序中初始化创建查找表时,由于是顺序存储,所以将所有的数据元素存储在数组中,但是把第一个位置留给了用户用于查找的关键字。例如,在顺序表{1,2,3,4,5,6}中查找数据元素值为 7 的元素,则添加后的顺序表为:

顺序表中的监视哨

图 1 顺序表中的监视哨

顺序表的一端添加用户用于搜索的关键字,称作“监视哨”

图 1 中监视哨的位置也可放在数据元素 6 的后面(这种情况下,整个查找的顺序应有逆向查找改为顺序查找)。

放置好监视哨之后,顺序表遍历从没有监视哨的一端依次进行,如果查找表中有用户需要的数据,则程序输出该位置;反之,程序会运行至监视哨,此时匹配成功,程序停止运行,但是结果是查找失败。

2、顺序查找的性能分析

查找操作的性能分析主要考虑其时间复杂度,而整个查找过程其实大部分时间花费在关键字和查找表中的数据进行比较上。

所以查找算法衡量好坏的依据为:查找成功时,查找的关键字和查找表中的数据元素中进行过比较的个数的平均值,称为平均查找长度(Average Search Length,用 ASL 表示)。

例如,对于具有 n 个数据元素的查找表,查找成功的平均查找长度的计算公式为:

Pi 为第 i 个数据元素被查找的概率,所有元素被查找的概率的和为 1;Ci 表示在查找到第 i 个数据元素之前已进行过比较的次数。若表中有 n 个数据元素,查找第一个元素时需要比较 n 次;查找最后一个元素时需要比较 1 次,所以有 Ci = n – i + 1 。

一般情况,表中各数据元素被查找的概率是未知的。假设含有 n 个数据元素的查找表中,各数据被查找的概率是相同的,则:

换算后,得:

如果对于查找表中各个数据元素有可能被查找的概率提前已知,就应该根据其查找概率的大小对查找表中的数据元素进行适当的调整:被查找概率越大,离查找出发点 i 越近;反之,越远。这样可以适当的减少查找操作中的比较次数。

上边的平均查找长度是在假设查找算法每次都成功的前提下得出的。而对于查找算法来说,查找成功和查找失败的概率是相同的。所以,查找算法的平均查找长度应该为查找成功时的平均查找长度加上查找失败时的平均查找长度。

对于含有 n 个数据的表来说,每次查找失败,比较的次数都是 n+1。所以查找算法的平均查找长度的计算公式为:

3、总结

本节主要介绍了静态查找表的顺序存储的表示和查找算法的实现,其中使用监视哨对普通的顺序表的遍历算法做了改进,在数据量大的情况下,能够有效提高算法的运行效率。

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

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

相关文章

Windows系统安装MySQL并用Navicat连接的操作流程(详细)

下面我以Win10&#xff0c;64 位操作系统, 基于 x64 的处理器为例&#xff0c;演示MySQL的安装及Navicat连接MySQL的操作流程&#xff0c;非常详细。 一、安装MySQL 第一步&#xff0c;双击安装包&#xff0c;打开安装页面&#xff0c;点击Next 注意这个安装包是5.5.56-win6…

dubbo--03--- dubbo 支持的9种协议

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Dubbo框架特性Dubbo 和 Spring Cloud区别 dubbo 支持的9种协议协议类型1、dubbo 协议 (默认)特性配置常见问题 2、rmi 协议3、hessian 协议4、http 协议特性 5、web…

电脑的内存条是什么?内存条的作用有哪些?

计算机已经是现代生活人们必不可少的一部分&#xff0c;计算机的性能决定因素之一就是内存条&#xff0c;内存条的作用有哪些&#xff1f;这篇文章让你了解内存条的主要作用。 内存条是什么 内存条是什么&#xff0c;它是计算机内部的一种重要硬件组件&#xff0c;用于临时存…

Linux 进程信号

文章目录 信号的概览信号的产生信号的处理信号集操作信号的捕捉补充与说明 信号的概览 信号由软件或硬件产生发送给进程&#xff0c;进程对其做相应处理。信号是进程之间事件异步通知的一种方式&#xff0c;属于软中断。 Linux下的全部信号由指令kill -l查询 Linux 下指令的…

el-table自定义表格数据

如上所示&#xff1a; 表格内的数据是&#xff1a;当前班级所在名次段的人数 / 当前班级1至n名的累计人数 5/12 也就是 5/75 需要变更为&#xff1a; 截至到当前名次段总人数&#xff08;上次考试&#xff09; / 截至到当前名次段总人数&#xff08;本次考试&#xff09…

C++共享和保护——(5)编译预处理命令

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 耕耘者的汗水是哺育种子成长的乳汁&am…

【数据结构】栈的使用|模拟实现|应用|栈与虚拟机栈和栈帧的区别

目录 一、栈(Stack) 1.1 概念 1.2 栈的使用 1.3 栈的模拟实现 1.4 栈的应用场景 1. 改变元素的序列 2. 将递归转化为循环 3. 括号匹配 4. 逆波兰表达式求值 5. 出栈入栈次序匹配 6. 最小栈 1.5 概念区分 一、栈(Stack) 1.1 概念 栈&#xff1a;一种特殊的线性表&…

SpringBoot之分层解耦以及 IOCDI的详细解析

### 3.2 分层解耦 刚才我们学习过程序分层思想了&#xff0c;接下来呢&#xff0c;我们来学习下程序的解耦思想。 解耦&#xff1a;解除耦合。 #### 3.2.1 耦合问题 首先需要了解软件开发涉及到的两个概念&#xff1a;内聚和耦合。 - 内聚&#xff1a;软件中各个功能模块内…

3d抄数逆向建模服务造纸机械叶轮三维扫描曲面建模-CASAIM

在造纸机械中&#xff0c;叶轮是重要的组成部分&#xff0c;造纸机械叶轮在使用过程中会承受较大外力的摩擦&#xff0c;长期使用容易导致外观变形破损&#xff0c;从而降低叶轮的工作效率和精度。因此&#xff0c;定期生产制作同类型的造纸机械叶轮产品&#xff0c;以用于替换…

YOLOv5改进 | SPPF | 将RT-DETR模型AIFI模块和Conv模块结合替换SPPF(全网独家改进)

一、本文介绍 本文给大家带来是用最新的RT-DETR模型中的AIFI模块来替换YOLOv5中的SPPF。RT-DETR号称是打败YOLO的检测模型&#xff0c;其作为一种基于Transformer的检测方法&#xff0c;相较于传统的基于卷积的检测方法&#xff0c;提供了更为全面和深入的特征理解&#xff0c…

2023.12.17Linux基础命令

ls -l详细信息 -a所有 springcloud微服务 ctrlalt鼠标左键&#xff0c;从虚拟机中回到本机 执行这两条语句 拿到远程主机的ip地址之后就要试图连接 要实现连接&#xff0c;就要有远程连接的软件 ssh和http一样&#xff0c;也是一种协议 SSH 是 Secure Shell&am…

GD32F4中断向量查询

中断向量表 中断向量对应函数 __Vectors DCD __initial_sp ; Top of StackDCD Reset_Handler ; Reset HandlerDCD NMI_Handler ; NMI HandlerDCD HardFault_Handler ;…