顺序表的查找

article/2025/10/12 15:37:52

前言

首先在这里要解释一下,为什么将顺序表这一种数据结构分为多篇文章去编写。首先我的笔记是根据王道老师的计算机考研——数据结构的视频课程去学习的。其次,我觉得将一种数据结构的知识放在一篇文章中,文章会显得过于冗长,容易打击学习的积极性和自信心。考虑到以上这些点,特此将文章分开上传。方便大家可以根据王道老师的视频课进行配套观看。并且我会将有联系的几篇文章分别在开头和结尾附上链接(传送门)方便大家去跳转和阅读,也是我觉得既保持了知识的连贯性,又尽量的保证了不打击大家的学习积极性!

以上的废话有点多我们赶紧进入主题,在经过上一篇文章(顺序表的插入和删除)的学习后,我们紧接着学习顺序表的基本操作——查找。

顺序表的按位查找

含义

就是通过提供的位置查找到指定位置上元素的值。比如:我想要找到第i位数据元素,那么可以直接找到第i位的数据元素的值。

静态分配实现

如果是通过静态分配的方式实现的顺序表,其实对于按位查找的实现就很简单:

#define MaxSize 10          // 定义最大长度typedef struct{ElemType data[MaxSize]; // 用静态的“数组”存放数据元素int length;             // 顺序表的当前长度
}SqList;                    // 顺序表的类型定义(静态分配方式)ElemType GetELem(SqList L,int i){return L.data[i-1];
}

GetElem()中的i参数表示需要查找的下标的位序。如果你是使用静态分配的方式实现顺序表,那么数据元素就是都存放在data数组中,那么想要找到第几位元素就可以直接使用数组的下标直接找出,但是要注意数组下标是从0开始,因此我们要查找第i位的数据元素,就需要i-1,当然这里你如果想要增强代码的健壮性,那么就可以在GetElem()的开头加上判断i的合法性的语句。

动态分配实现

#define MaxSize 10          // 定义最大长度typedef struct{ElemType *data;			// 用静态的“数组”存放数据元素int length;             // 顺序表的当前长度
}SqList;                    // 顺序表的类型定义(动态分配方式)ElemType GetELem(SqList L,int i){return L.data[i-1];
}

如果你是使用动态分配的方式实现顺序表,那么使用malloc()开辟的一整片区域的开头指针就会返回给*data,虽然说*data是指针,但是也是可以使用访问数组下标的方式去访问。下面我们举例说明就能更明白这里所说的含义。

首先我们使用malloc()申请的一整块连续的空间会将指针返回给*data,这时候*data就会指向一整块连续空间的开头,如下图:

image-20220706160235311

假设上图中的一小块矩形为1B,我们存放的数据元素的单位大小为6B(一个数据元素为6B),那么当我们使用数组下标的方式访问时*data[0],其实就是访问从起始位置开始到第6个矩形的位置(6B)

image-20220706160602341

如果我们存入顺序表的数据元素的类型为int型(int型在内存中占4B),那么如果我们访问*data[0],就是从起始位置开始往后数4个格子,以此类推。

这也就是为什么,我们在之前讲解malloc()函数时,我们要将其返回的指针强制转换成你存放数据元素的指针同类型的指针。

  • (int *)malloc(InitSize*sizeof(int)):这里的(int *)就是将malloc()函数返回的指针强制转换成int型的指针
  • 如果你存放的数据元素是int型(4B),但是你返回的指针是别的6B大小的类型的指针,那么我们在使用访问数组下标的方式,去访问顺序表中的元素时,就会乱套了

时间复杂度

ElemType GetELem(SqList L,int i){return L.data[i-1];
}

按位查找的代码就是上述的代码,所以可以看出按位查找的时间复杂度为:O(1)

也就是我们之前提到过的顺序表的随机存储特性。

  • 因为顺序表中的所有元素都是连续存放的
  • 并且每个元素的大小都相同

这就意味着我们只需要知道起始地址和每个元素的大小,就能快速准确的找到任意一个元素。

顺序表的按值查找

含义

根据所提供的值,在顺序表中找到符合该值的元素并返回。比如:我在表L中找到值为5的元素。

代码实现

#define InitSize 10			// 定义最大长度typedef struct{ElemType *data;			// 用静态的“数组”存放数据元素int MaxSize;			// 顺序表的最大容量int length;             // 顺序表的当前长度
}SqList;                    // 顺序表的类型定义(动态分配方式)int LocateElem(SqList L,ElemType e){for(int i=0;i<L.length;i++)if(L.data[i]==e)return i+1;     // 数组下标为i的元素值等于e,返回其位序:i+1return 0;           // 退出循环说明查找失败
}

上述就是按值查找的代码实现,我们着重讲解LocateElem()

  1. 循环会遍历整个顺序表
  2. 比较遍历过程中的值是否和需要查找的值e相等
    • 若相等,则返回该元素的位序:i+1(下标+1)
    • 若不相等,则继续循环
  3. 如果都没有,则退出函数并且返回0,表示没有查找到一样的值

注意:如果数据类型为基本数据类型(int、char、double、float等)是可以直接使用运算符==去比较的,但是如果是两个结构类型的数据元素就不能直接使用==运算符去比较。

所以,如果你需要比较两个结构类型的数据元素是否相等,你需要分别对应结构类型里面的分量是否相等。比如:a.name == b.name等

时间复杂度

最好情况:目标元素在表头

  • 循环1次,最好时间复杂度 = O(1)

最坏情况:目标元素在表尾

  • 循环n次:最坏时间复杂度 = O(n)

平均情况:假设目标元素出现在任何一个位置的概率相同,都是 1 n \frac{1}{n} n1

  • 目标元素在第1位,循环1次;第2位,循环2次;… 第n位,循环n次
  • 平均循环次数 = 1 1 n + 2 1 n + 3 1 n + . . . + n 1 n = n ( n + 1 ) 2 1 n = n + 1 2 1\frac{1}{n}+2\frac{1}{n}+3\frac{1}{n}+...+n\frac{1}{n}=\frac{n(n+1)}{2}\frac{1}{n}=\frac{n+1}{2} 1n1+2n1+3n1+...+nn1=2n(n+1)n1=2n+1
  • 平均时间复杂度 = O(n)

结束语

已同步更新至个人博客:https://www.hibugs.net/index.php/sqlistsearch/

本人菜鸟一枚,仅分享学习笔记和经验。若有错误欢迎指出!共同学习、共同进步 😃

如果您觉得我的文章对您有所帮助,希望可以点个赞和关注,支持一下!十分感谢~(若您不想也没关系,只要文章能够对您有所帮助就是我最大的动力!)


http://chatgpt.dhexx.cn/article/4aQs1Dav.shtml

相关文章

查找(顺序查找)

在java的介绍中&#xff0c;我们常用的查找有两种 1.顺序查找&#xff1a;&#xff08;案例演示&#xff09; 2.二分查找&#xff1a;【二分法】 案例要求&#xff1a; 有一个数列&#xff1a;白眉鹰王&#xff0c;金毛狮王&#xff0c;紫衫龙王&#xff0c;青翼蝠王&#x…

CDH6.0.1高可用

CDH高可用主要是HDFS和YARN&#xff0c;在保证hdfs数据不丢失的情况下&#xff0c;即使有节点宕机&#xff0c;重启即可也不会有影响。 官网文档 目录 HDFS HAHue 设置Hive 设置YARN HAHive HAHBase HA HDFS HA 进入HDFS -> 操作 -> High Availability。 给备用NameNo…

clickhouse 三种高可用方案

简介 本文介绍三种高可用使用&#xff0c;及验证clickhouse的高可用性&#xff0c;三种方案分别如下&#xff1a; 不管是多分片还是多副本都是以集群方式部署&#xff0c;那么对外暴露多台Clickhouse服务&#xff0c;通常会通过LB方式使每台服务器能够均匀的接受到客户端的请…

【RocketMQ】集群的搭建与高可用

RocketMQ分布式集群是通过Master和Slave的配合达到高可用性的。 Master和Slave的区别&#xff1a;在Broker的配置文件中&#xff0c;参数brokerId的值为0表明这个Broker是Master&#xff0c;大于0表明这个Broker是Slave&#xff0c;同时brokerRole参数也会说明这个Broker是Mas…

Sentry 高可用部署

Sentry 高可用部署&#xff0c;部署分析基于Sentry 10.1.0.dev 05e720a7 对应dockerhub镜像版本分别为&#xff1a; getsentry/snuba:31c967e774759c0548652d986645fdff844e0a39 getsentry/sentry:8549f2a492c803bab77af26e7417272975b9369a getsentry/symbolicator:94cdbb7b54…

HA高可用

什么事应用程序的高可用 高可用性(high availability)通常用来描述一个系统经过专门的设计,从而减少停工的时间,而保持其服务的高度可用性 高可用程序的类型 主从方式(冷备) 两个相同的应用程序,一个对外提供服务,成为主程序,另一个平时不运行为备程序,就是一个主程序的备份,…

harbor高可用部署

harbor高可用简介 harbor目前有两种主流的高可用方案&#xff1a; 双主复制&#xff0c;harbor自带的镜像复制功能多harbor实例共享后端存储 双主复制架构在遇到大镜像时有同步延迟&#xff0c;并且一个实例故障后需要手动重新开启复制策略才能再次同步&#xff0c;下面以阿里…

HADOOP 高可用搭建

首先先说一下大概的步骤&#xff0c;就用四台为例&#xff0c;简单适合新手操作。 流程是&#xff1a;创建虚拟机&#xff0c;配置好&#xff1b;搭建linux系统&#xff1b;安装jdk&#xff08;因为后面好多都依赖jkd&#xff09;&#xff1b;免密登录ssh&#xff1b;安装zook…

高可用详细概念及三种决策方式分析

文章目录 1.基本概念1.计算高可用2.存储高可用高可用状态决策1.独裁式2.协商式3.民主式 1.基本概念 这个定义的关键在于“无中断”&#xff0c;但恰好难点也在“无中断”上面&#xff0c;因为无论是单个硬件还是单 个软件&#xff0c;都不可能做到无中断&#xff0c;硬件会出故…

Nacos实现高可用

由于Nacos暂不支持Arm架构芯片的Mac集群搭建&#xff0c;本小节用Linxu云主机&#xff08;Nacos比较吃内存&#xff0c;2个Nacos服务器集群&#xff0c;至少2G内存&#xff09;环境演示。 通过前面的学习&#xff0c;我们已经了解了如何使用Nacos以及Nacos的功能等&#xff0c;…

浅谈高可用测试

前言 现今的互联网产品越来越注重可靠性&#xff0c;尤其是在生产环境中使用的系统&#xff0c;对高可用性都有一定的要求。而作为产品的提供方&#xff0c;在交付产品之前&#xff0c;也会对高可用进行验收测试。近期跟进过两个产品曾有高可用测试的需求&#xff0c;在此简单…

nginx高可用

Nginx高可用 为什么要使用nginx的高可用&#xff1a;因为nginx作为反向代理服务器时&#xff0c;有可能出现宕机的情况&#xff0c;而由于其反向代理的特性&#xff0c;就会导致其他服务器&#xff08;tomcat等&#xff09;无法被访问&#xff0c;这样项目就停止工作了。但是使…

RabbitMQ高可用

RabbitMQ高可用 各种消息队列对比使用推荐 RabbitMQ 高可用普通集群模式镜像集群模式保证消息队列的幂等性(消息不被重复消费)消息队列的可靠性传输生产者丢失数据RabbitMQ丢失数据消费者丢失数据 保证消息的顺序性消息积压问题 各种消息队列对比 特性ActiveMQRabbitMQRocketM…

系统高可用

系统高可用 1. 什么是高可用&#xff1f;可用性的判断标准是啥&#xff1f;1.1 可用性的判断标准是啥&#xff1f; 2. 哪些情况会导致系统不可用&#xff1f;3. 有哪些提高系统可用性的方法&#xff1f;3.1 注重代码质量&#xff0c;定时Review代码3.2 使用集群&#xff0c;减少…

HBase高可用

一、HBase高可用简介 HBase集群如果只有一个master&#xff0c;一旦master出现故障&#xff0c;将导致整个集群无法使用&#xff0c;所以在实际的生产环境中&#xff0c;需要搭建HBase的高可用&#xff0c;也就是让HMaster高可用&#xff0c;也就是需要再选择一个或多个节点也…

你管这破玩意儿叫高可用

大家好&#xff0c;我是坤哥 今天我们来聊一下互联网三高&#xff08;高并发、高性能、高可用&#xff09;中的高可用&#xff0c;看完本文相信能解开你关于高可用设计的大部分困惑 前言 高可用&#xff08;High availability&#xff0c;即 HA&#xff09;的主要目的是为了保障…

什么是高可用?高可用介绍:

前言&#xff1a; 高可用&#xff08;High availability&#xff0c;即 HA&#xff09;的主要目的是为了保障「业务的连续性」&#xff0c;即在用户眼里&#xff0c;业务永远是正常&#xff08;或者说基本正常&#xff09;对外提供服务的。高可用主要是针对架构而言&#xff0c…

HTML Responsive Web Page

注&#xff1a;参考网站 https://www.w3schools.com HTML Responsive Web Page index.html <!DOCTYPE html> <html><head><link rel"stylesheet" href"style.css"><title>Responsive web page</title><meta lan…

响应式布局【Responsive】 与 自适应布局 【adaptive】、单页面【SPA】 和多页面【MPA】

1、响应式布局 是一个网址能兼容多个terminate【终端】&#xff0c;而不是为每个终端做一个特定的版本 优点&#xff1a; 用户体验好节约开发时间、节省设计seo友好可以适用所有设备屏幕 缺点 设计与风格有局限性《自由度太低&#xff0c;局部性较大》灵活性有所欠缺 基于不…

Bootstrap:Responsive Design with Bootstrap(一)

1.Use Responsive Design with Bootstrap Fluid Containers 现在让我们回到我们的Cat Photo应用。这次&#xff0c;我们将用流行的响应式框架Bootstrap来美化它。 Bootstrap将会根据你的屏幕的大小来调整HTML元素的大小 —— 强调 响应式设计的概念。 通过响应式设计&#x…