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

文章目录

  • 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 分块查找的特点

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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

0基础系列C++教程 从0开始 第二课

0基础系列C教程 从0开始 第二课来了&#xff01; 复习第一课内容 1 怎么输出数字“1919810”&#xff1f; 答案&#xff08;关键语句&#xff09;: cout<<"1919810"; 2 怎么输出字符串“Hello World”&#xff1f; 答案&#xff08;关键语句&#xff09;&a…

梯度提升树的基本思想

目录 1. 梯度提升树 VS AdaBoost 2. GradientBoosting回归与分类的实现 2.1 GradientBoosting回归 2.2 GradientBoosting分类 1. 梯度提升树 VS AdaBoost 梯度提升树&#xff08;Gradient Boosting Decision Tree&#xff0c;GBDT&#xff09;是提升法中的代表性算法&#…

朝花夕拾思维导图怎么画?看看这种绘制方法

朝花夕拾思维导图怎么画&#xff1f;绘制思维导图的好处有很多&#xff0c;首先它可以帮助人们更好地组织和管理知识&#xff0c;提高工作效率和学习效果。其次&#xff0c;绘制思维导图可以帮助人们更好地记忆知识点和理解知识点。总之&#xff0c;绘制思维导图可以帮助人们更…

cookie

目录 一、会话技术 二、Cookie 1.创建Cookie 2.使用response响应Cookie给客户端&#xff08;浏览器&#xff09; 3. 获取Cookie 三、Cookie的原理解析 1. 基本实现原理 &#xff08;1&#xff09;响应头&#xff1a;set—cookie &#xff08;2&#xff09;请求头&…

基于 Graviton2处理器构建容器化基因分析工作负载

概述 相对于基于传统 x86架构的处理器来说&#xff0c;Amazon 设计的基于 ARM 架构的 Graviton 处理器为 EC2中运行的云工作负载提供了更佳的性价比。基于 Graviton2 的实例支持广泛的通用型、突发型、计算优化型、内存优化型、存储优化型和加速计算型工作负载&#xff0c;包括…

数字IC实践项目(7)—CNN加速器的设计和实现(付费项目)

数字IC实践项目&#xff08;7&#xff09;—基于Verilog的CNN加速器&#xff08;付费项目&#xff09; 写在前面的话项目整体框图神经网络框图完整电路框图 项目简介和学习目的软件环境要求 资源占用&板载功耗总结 写在前面的话 项目介绍&#xff1a; 卷积神经网络硬件加速…

【C++ 重要知识点总结】自定义类型-类和结构体

类 类的基本特性 数据抽象和封装继承多态 1 类的构成——抽象 概念 数据抽象是一种依赖于接口和实现的分离的编程技术。类的接口包括用户所能执行的操作&#xff1b;类的实现包括类的数据成员、负责接口实现的函数体以及定义类所需要的的各种私有函数。封装实现了类的接口和实…

数据服务:保障数据安全、提升数据价值的利器

04-08把元数据以及在它基础上的五大应用场景&#xff1a;数据发现&#xff08;数据地图&#xff09;、指标管理、模型设计、数据质量、成本优化&#xff0c;全部讲完。这部分内容对应的就是数据中台OneData 方法论。学完这部分内容&#xff0c;你已了解OneData方法论在企业内部…

【业务功能篇55】Springboot+easyPOI 导入导出

Apache POI是Apache软件基金会的开源项目&#xff0c;POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 Apache POI 代码实现复杂&#xff0c;学习成本较高。 Easypoi 功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出…

MySQL基础扎实——MySQL中各种数据类型之间的区别

在MySQL中&#xff0c;有各种不同的数据类型可供选择来存储不同类型的数据。下面是一些常见的数据类型以及它们之间的区别&#xff1a; 整数类型&#xff1a; TINYINT&#xff1a;1字节&#xff0c;范围为-128到127或0到255&#xff08;无符号&#xff09;。SMALLINT&#xff1…

项目文档管理的基本指南

项目文档是一种关键的项目管理资源&#xff0c;它可以提供清晰度&#xff0c;保证参与项目的每个人都在同一页面上&#xff0c;从而确保项目按时、按预算完成。 本文将讨论项目文档的重要性、如何在项目中使用项目文档以及选择好合适的项目文档管理软件的技巧。 什么是项目文…

代码随想录算法学习心得 49 | 647.回文子串、516.最长回文子序列...

一、最长回文子序列 链接&#xff1a;力扣 描述&#xff1a;给你一个字符串 s &#xff0c;找出其中最长的回文子序列&#xff0c;并返回该序列的长度。 子序列定义为&#xff1a;不改变剩余字符顺序的情况下&#xff0c;删除某些字符或者不删除任何字符形成的一个序列。 思…

【C++】开源:Boost网络库Asio配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Asio网络库配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次…

Form Generator 扩展子表单组件之表单校验(超详细)

一、form-generator是什么?✨ ⭐️ 🌟 form-generator的作者是这样介绍的:Element UI表单设计及代码生成器,可将生成的代码直接运行在基于Element的vue项目中;也可导出JSON表单,使用配套的解析器将JSON解析成真实的表单。 但目前它提供的组件并不能满足我们在项目中的…

【搜索引擎Solr】Apache Solr 神经搜索

Sease[1] 与 Alessandro Benedetti&#xff08;Apache Lucene/Solr PMC 成员和提交者&#xff09;和 Elia Porciani&#xff08;Sease 研发软件工程师&#xff09;共同为开源社区贡献了 Apache Solr 中神经搜索的第一个里程碑。 它依赖于 Apache Lucene 实现 [2] 进行 K-最近邻…

【Apollo学习笔记】—— Routing模块

Routing模块功能 Apollo的routing模块读取高精地图原始信息&#xff0c;用于根据输入RoutingRequest信息在base_map中选取匹配最近的点作为导航轨迹的起点和终点&#xff0c;读取依据base_map生成的routing_map作为生成topo_graph的&#xff0c;然后通过Astar算法在拓扑图中搜…

SSIS对SQL Server向Mysql数据转发表数据 (一)

开发工具 Visual Stuido 2019 、SSIS、SQL Server 2016、Mysql 8.0.30 1、配置VS2019的添加相应的功能&#xff0c;勾选SQL Server Data Tools,下载就行我用的VS2019版本还需要下载下面几个插件&#xff0c;链接我放在下面了 Microsoft Analysis Services Projects - Visual St…

[linux--->应用层网络通信协议]

文章目录 [TOC](文章目录) 一、应用层通信概念1.协议2.信息接收 二、网络计算器实战应用三、http协议1.基本认识2.宏观理解http3.网站内部跳转4.请求方法5.状态码5.1重定向5.2错误码 6.常见报头7.http会话保持功能8.模拟http协议服务器编程 四、https协议1.加密概念2.加密的作用…

esp32_arduino的开发库安装笔记

1.1 Arduino软件下载与安装 Arduino官网下载地址&#xff1a;https://www.arduino.cc/en/software。 1.2在线安装 选择文件 - 首选项。 在附加开发板管理器网址中添加以下链接中的一个。 (1)Stable release link: https://raw.githubusercontent.com/espressif/arduino-es…

opencv-17 脸部打码及解码

使用掩模和按位运算方式实现的对脸部打码、解码实例 代码如下&#xff1a; import cv2 import numpy as np #读取原始载体图像 lenacv2.imread("lena.png",0) #读取原始载体图像的 shape 值 r,clena.shape masknp.zeros((r,c),dtypenp.uint8) mask[220:400,250:350…