DSA之查找(1):线性表的查找

news2024/11/15 4:33:42

文章目录

  • 0 知识回顾
  • 1 查找
    • 1.1 查找的概念
  • 2 线性表的查找
    • 2.1 顺序查找
      • 2.1.1 顺序查找算法
      • 2.1.2 顺序查找的性能分析
      • 2.1.3 顺序查找的特点
    • 2.2 折半查找(二分)
      • 2.2.1 折半查找算法
      • 2.2.2 折半查找的性能分析
      • 2.2.3 折半查找的特点
    • 2.3 分块查找
      • 2.3.1 分块查找的性能分析
      • 2.3.2 分块查找的特点

0 知识回顾

在这里插入图片描述

1 查找

1.1 查找的概念

Q: 查找是在哪里找?
A :查找表,查找表没有前驱以及后继的关系。
查找表是由同一类型的数据元素(或记录)构成的集合。由于“集合”中的数据元素之间存在着松散的关系,因此查找表是一种应用灵便的结构。
在这里插入图片描述
Q:怎么查找?
A:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素或(记录)。

关键字,即用来标识一个数据元素(或记录)的某个数据项的值,有以下几类关键字:

  • 主关键字:可唯一地标识一个记录的关键字是主关键字;
  • 次关键字:反之,用以识别若干记录的关键字是次关键字。

以下为判断查找是否成功
在这里插入图片描述
以下为看查找的目的
在这里插入图片描述
以下为查找的分类
在这里插入图片描述
以下评价查找算法的性能分析
在这里插入图片描述
以下为查找研究的是什么?
在这里插入图片描述

2 线性表的查找

线性表的查找有以下几种方式:

  1. 顺序查找
  2. 折半查找(二分或者对分查找)
  3. 分块查找

2.1 顺序查找

在这里插入图片描述

//数据元素类型定义
typedef struct
{
	KeyType key;//关键字域
	......//其他域
}ElemType;
//
typedef struct
{
	ElemType *R; //表基址
	int length; //表长
}SSTable; //Sequential Search Table
SSTable ST;//定义顺序表

2.1.1 顺序查找算法

在这里插入图片描述
算法的其他形式:
在这里插入图片描述
在这里插入图片描述
问题: 每执行一次循环都要进行两次比较是否能改进?
改进: 把待查关键key存入表头(“俏兵”、”监视哨”),从一后往前逐个比较,可免去查找过程中每一步都变检测是否查我完毕,从而加快速度。

在这里插入图片描述
设置监事岗的,就只需要比较1次。
在这里插入图片描述

最终算法:
在这里插入图片描述
ST.length()较大时,此改进能使进行一次查找所需的平均时间几乎减少一半。注意此时的for循环是空语句,然后直接返回i的下标就行。

比较次数与key位置有关:

  • 查找第个元素,需要比较n-i+1次
  • 查找失败,需比较n+1次(开始的时候就把要查找的值存入起始节点当做哨兵,所以查找失败就从最后一个往回退,即查找n+1次)

2.1.2 顺序查找的性能分析

在这里插入图片描述
顺序查找的性能:

  • 时间复杂度: O ( n ) O(n) O(n),查找成功时的平均查找长度,设表中的各记录查找概率相等。
    A S L s ( n ) = ( 1 + 2 + . . . + n ) / n = ( n + 1 ) / 2 ASL_s(n) = (1+2+...+n) / n = (n+1) / 2 ASLs(n)=(1+2+...+n)/n=(n+1)/2
  • 空间复杂度:一个辅助空间(哨兵)— O ( 1 ) O(1) O(1)
    在这里插入图片描述

2.1.3 顺序查找的特点

  • 优点:算法简单,逻辑次序无要求,且不同存储结构均适用。
  • 缺点:ASL太长时间效率太低。

2.2 折半查找(二分)

就是先排序,排序好后先判断,从中间判断,判断所要找的数与中间的数的大小,所要找的数比中间的数大,则low = mid + 1,只找右半边;所要找的数比中间的数小,则high = mid - 1,只找左半边。结束的条件为high < low。关于mid除下来不是整数,可以使用取整的符号。
在这里插入图片描述

2.2.1 折半查找算法

在这里插入图片描述

非递归实现的形式:

int Search_Binary(SSTable ST, KeyType key)
{
	low = 1;
	high = ST.length();//区间初值
	while (low <= high)
	{
		mid = (low + high) / 2;
		if (ST.R[mid].key == key)
		{
			return mid;//找到待查元素
		}
		else if (key < ST.R[mid].key) //缩小查找区间
		{
			high = mid - 1; //继续在前半区间进行查找
		}
		else
		{
			low = mid + 1; //继续在后半区间进行查找
		}
	}
	return 0; //顺序表中不存在待查元素
}

递归实现的形式:

int Search_Binary(SSTable ST, keyType key, int low, int high)
{
	if (low > high)
	{
		return 0;//查找不到返回0
	}
	mid = (low + high) / 2;
	if (key == ST.elem[mid].key)
	{
		return mid;
	}
	else if (key < ST.elem[mid].key)//递归,在前半区间进行查找
	{
		Search_Binary(ST, key, low, mid-1);
	}
	else//递归,在后半区间进行查找
	{
		Search_Binary(ST, key, mid+1, high);
	}
}

2.2.2 折半查找的性能分析

在这里插入图片描述

在这里插入图片描述
折半查找的时间复杂度为 O ( l o g n ) O(logn) O(logn)

2.2.3 折半查找的特点

  • 折半查找优点:效率比顺序查找高
  • 折半查找缺点:只适用有序表,且限于顺序存储结构(对线性链表无效)

2.3 分块查找

按照索引顺序表进行查找。
在这里插入图片描述

2.3.1 分块查找的性能分析

在这里插入图片描述
插入删除比较方便。

2.3.2 分块查找的特点

  • 优点:插入和删除比较容易,无需进行大量移动。
  • 缺点:要增加一个索引表的存储空间并对初始索引表进行排序运算。
  • 适用情况:如果线性表既要快速查找又经常动态变化,则可采用分块查找。

在这里插入图片描述

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

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

相关文章

背包问题求具体方案数问题--板子题

12. 背包问题求具体方案 - AcWing题库 思路&#xff1a;先将v[i]和w[i]先输入进去&#xff0c;然后我们进行倒叙dp&#xff0c;这个做的目的就是为了后边我们为了匹配确定路径做好准备&#xff0c;如果我们倒叙输入进去&#xff0c;我们再正序的时候就可以用推导式来进行路径输…

MySql000——MySql的下载和安装

一、下载MySql 二、下载MySQL驱动 三、安装 到此&#xff0c;成功安装

P11 第三章 电阻电路的一般分析——极基础

1、结点电压法列题 结点电压法&#xff0c;回路电流法&#xff0c;网孔电流法都是为了减少列方程数量&#xff0c;都是为了求解分析电路&#xff0c;都是中间解法。 结点电压法解出了结点电压&#xff0c;对于具体分析需求&#xff0c;可能还需要二次求解。 2、结点电压法&a…

通过web.xml来配置servlet程序

IDEA 2022.3.3 tomcat-9.0.27 Java EE8 JDK-16 配置访问的虚拟路径 web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi"http://www.w3.org/2001/XMLSchema-insta…

如何在数据中台中提高效率并节省成本?

上节讨论了如何保障数据中台的数据质量&#xff0c;让数据“准”。除了“快”和“准”&#xff0c;数据中台还离不开“省”。随数据规模越来越大&#xff0c;成本越来越高&#xff0c;如不合理控制成本&#xff0c;还没等你挖掘出数据应用价值&#xff0c;企业利润就被消耗完。…

python+appium自动化测试如何控制App的启动和退出

由于本人使用的是Android设备做自动化测试&#xff0c;所以以下内容均基于Android系统做出的整理 一、启动app 启动app需要设置Capability参数&#xff0c;而Capability参数放在Desired Capalibity中&#xff0c;Desired Capalibity告诉Appium想要的自动化平台和应用程序&…

Visitor设计模式访问元素方法的问题

Visitor设计模式访问元素方法的问题 GPT给出的答案寻找灵感前置声明Element层次的实例Visitor interface的声明Element interface的声明Element实际类的声明及实现实现一个Visitor客户端代码 实战测试结果 针对C来说&#xff0c;若要实现Visitor设计模式&#xff0c;则会面临循…

05. 容器资源管理

目录 1、前言 2、CGroup 2.1、是否开启CGroup 2.2、Linux CGroup限制资源能使用 2.2.1、创建一个demo 2.2.2、CGroup限制CPU使用 2.3、Linux CGroup限制内存使用 2.4、Linux CGroup限制IO 3、Docker对资源的管理 3.1、Docker对CPU的限制 3.1.1、构建一个镜像 3.1.2…

C语言入门篇(八)

前言   本篇分享的是部分操作符的概念与用法&#xff0c;从经典例题入手&#xff0c;带你快速了解和掌握。   收录专栏&#xff1a;浅谈C语言 操作符详解上 1. 操作符分类2. 算术操作符3. 移位操作符3.1 左移操作符3.2 右移操作符 4. 位操作符5. 赋值操作符6. 单目操作符6.…

Pytest常用的命令行

查看Pytest所有的命令行 Pytest -h 结果&#xff1a; 我们使用pytest时&#xff0c;忘记了会有哪些命令行&#xff0c;或是忘记哪个命令行怎么用&#xff0c;可以进行查看下。 执行参数 命令行参数 (1)--collect-only&#xff0c;打印出具体的执行从目录到用例执行的具体显…

is与==的区别

是比较运算符&#xff0c;用于比较两个值是否相等&#xff0c;结果返回布尔类型True或False is操作符是比较值所在的内存地址是否相同&#xff0c;结果返回布尔类型True或False aList [a,b,c] bList [a,b,c] # True print(aList bList) # False print(aList is bList)# 12…

【计算机网络】应用层协议 -- 安全的HTTPS协议

文章目录 1. 认识HTTPS2. 使用HTTPS加密的必要性3. 常见的加密方式3.1 对称加密3.2 非对称加密3.3 非对称加密对称加密 4. 引入CA证书4.1 CA认证4.2 数据签名4.3 非对称机密对称加密证书认证4.4 常见问题 5. 总结 1. 认识HTTPS HTTPS全称为 Hyper Text Tranfer Protocol over …

Java---第八章(字符串-----String,StringBuilder 和 StringBuffer)

Java---第八章 字符串String字符串的常用方法StringBuilder和StringBuffer常用方法 对比String 和StringBuilder 和 StringBuffer 字符串 String 特性&#xff1a; String 类位于java.lang包中&#xff0c;无需引入&#xff0c;可直接使用String 类是由final修饰的&#xff…

【cpolar内网穿透工具】

文章目录 cpolar内网穿透工具.md概述什么是cpolar&#xff1f;cpolar可以用在哪些场景&#xff1f; 1. 注册cpolar帐号1.1 访问官网站点&#xff1a;[https://www.cpolar.com](https://link.zhihu.com/?targethttps%3A//www.cpolar.com/) 1.2 注册帐号 2. 下载Windows版本cpol…

SpringBoot使用Redis对用户IP进行接口限流

使用接口限流的主要目的在于提高系统的稳定性&#xff0c;防止接口被恶意打击&#xff08;短时间内大量请求&#xff09;。 一、创建限流注解 引入redis依赖 <!--redis--><dependency><groupId>org.springframework.boot</groupId><artifactId&g…

RK3399平台开发系列讲解(内核调试篇)Valgrind 内存调试与性能分析

🚀返回专栏总目录 文章目录 一、为什么要学会Valgrind二、什么是内存泄露三、Valgrind的移植四、Valgrind相关参数沉淀、分享、成长,让自己和他人都能有所收获!😄 📢Valgrind 是一个开源的内存调试和性能分析工具,用于帮助开发者找出程序中的内存错误,如内存泄漏、使…

Ansys 光学解决方案在 A/VMR 中的应用 | 以Apple Vision Pro 为例(1)

说明 苹果公司于近期在 WWDC23 上发布了其第一代空间计算设备 Apple Vision Pro。作为一款跨世代的融合现实产品&#xff0c;Apple Vision Pro 融合了业界尖端的光学技术以实现最佳的用户体验。在这个系列的文章中&#xff0c;我们将以 Apple Vision Pro 中的各项光学应用为引子…

获奖!CFS十二届财经峰会,群硕持续耕耘数字化科技沃土

7月26-27日&#xff0c;CFS2023第十二届财经峰会暨2023可持续商业大会&#xff0c;于北京成功举办。在这场中国经济影响力思想盛会上&#xff0c;群硕获评2023数字化转型推动力奖。 ## 开拓创新&#xff0c;屡获殊荣 CFS财经峰会设立于2012年&#xff0c;是国内众多财经及大众…

【 Python 全栈开发 - 人工智能篇 - 45 】决策树与随机森林

文章目录 一、概念与原理1.1 决策树1.1.1 概念1.1.2 原理特征选择分割方法 1.1.3 优点与缺点1.1.4 Python常用决策树算法 1.2 随机森林1.2.1 概念1.2.2 原理1.2.3 优点与缺点1.2.4 Python常用随机森林算法 1.3 决策树与随机森林的比较1.3.1 相同之处1.3.2 不同之处 二、决策树算…

苍穹外卖Day01项目日志

1.软件开发流程和人员分工是怎样的&#xff1f; 软件开发流程 一个软件是怎么被开发出来的&#xff1f; 需求分析 先得知道软件定位人群、用户群体、有什么功能、要实现什么效果等。 需要得到需求规格说明书、产品原型。 需求规格说明书 其中前后端工程师要关注的就是产品原…