【算法系列 | 10】深入解析查找算法之—线性查找
序言
心若有阳光,你便会看见这个世界有那么多美好值得期待和向往。
决定开一个算法专栏,希望能帮助大家很好的了解算法。主要深入解析每个算法,从概念到示例。
我们一起努力,成为更好的自己!
今天第10讲,讲一下查找算法的线性查找算法
1 基础介绍
查找算法是计算机科学中的一类算法,用于在数据集中寻找特定值或数据项。
其目标是确定数据是否存在于给定的数据结构中,并找到数据项的位置(索引)或其他相关信息。
不同的查找算法适用于不同类型的数据结构,数据有序性,以及数据规模。以下是一些常见的查找算法
以下是一些常见的查找算法及其应用场景:
- 布隆过滤器(Bloom Filter):适用于判断一个元素是否存在于一个大规模的数据集中,时间复杂度为O(1),但有一定的误判率。
- 二分查找(Binary Search):适用于有序数组中查找元素,时间复杂度为O(log n);
- 哈希表查找(Hash Table):适用于快速查找和插入元素,时间复杂度为O(1),但需要额外的存储空间;
- 线性查找(Linear Search):适用于无序数组中查找元素,时间复杂度为O(n);
- 插值查找(Interpolation Search):适用于有序数组中查找元素,时间复杂度为O(log log n),但是对于分布不均匀的数据集效果不佳;
- 斐波那契查找(Fibonacci Search):适用于有序数组中查找元素,时间复杂度为O(log n),但需要额外的存储空间;
- 树表查找(Tree Search):适用于快速查找和插入元素,时间复杂度为O(log n),但需要额外的存储空间;
- B树查找(B-Tree):适用于大规模数据存储和查找,时间复杂度为O(log n),但需要额外的存储空间;
一、线性查找算法介绍
线性查找算法,也被称为顺序查找算法,是一种简单的搜索算法,用于在一个元素集合中查找特定元素的位置或确定特定元素是否存在。
它的操作非常直观,它从集合的第一个元素开始,逐一检查每个元素,直到找到目标元素或者遍历整个集合为止。
1.1 原理介绍
以下是线性查找算法的详细步骤和原理:
初始化:首先,从集合的第一个元素开始搜索。通常,你会使用一个索引或指针来跟踪当前查找的位置,将其初始化为0(对于数组或列表)或集合的起始位置。
遍历:在遍历过程中,算法将当前位置的元素与目标元素进行比较。如果当前元素与目标元素相匹配,算法会返回当前位置的索引(或其他位置信息),表示找到了目标元素。
比较:如果当前元素不与目标元素匹配,算法将继续移动到下一个元素,更新当前位置的索引,然后重复比较的步骤,直到找到目标元素或者遍历整个集合。
结束条件:线性查找算法将一直进行直到发生以下两种情况之一:
- 找到目标元素,返回目标元素的位置。
- 遍历整个集合,没有找到目标元素,此时算法返回一个指示未找到的值,通常是一个特殊值(例如-1)。
假设我们有一个数组:
[10, 5, 8, 2, 7, 3]
我们要查找目标元素2。
1. 从数组的第一个元素开始,即10。
[10, 5, 8, 2, 7, 3]^
2. 检查当前元素是否等于目标元素2。不匹配,继续向右移动。
[10, 5, 8, 2, 7, 3]^
3 继续比较。
[10, 5, 8, 2, 7, 3]^
4 比较当前元素和目标元素。
[10, 5, 8, 2, 7, 3]^
5 找到匹配的元素(2等于2),算法结束。
[10, 5, 8, 2, 7, 3]^
这个步骤描述了线性查找的原理,即从数组的第一个元素开始,逐一比较元素,直到找到目标元素或者遍历整个数组。如果找到目标元素,算法停止并返回其位置。
1.2 优缺点
线性查找算法,也称为顺序查找,是一种简单的搜索算法,它的原理是逐一比较元素,直到找到目标元素或者遍历整个数据集。
优点:
简单易懂: 线性查找是一种非常直观的算法,易于理解和实现。它不涉及复杂的数学或逻辑,因此适用于初学者。
适用于小型数据集: 在小型数据集中,线性查找通常表现出较高的效率。由于数据集较小,它不会带来显著的性能损失。
无序数据集: 线性查找不依赖于数据的顺序,可以在无序数据集中执行查找操作。这与其他一些算法,如二分查找,不同,后者要求数据集是有序的。
缺点:
低效率: 线性查找的时间复杂度是O(n),其中n是数据集中的元素数量。在大型数据集中,它需要遍历整个数据集,因此效率较低。对于大型数据集,它可能不是最佳选择。
性能不稳定: 线性查找的性能受数据集中目标元素的位置影响。如果目标元素位于数据集的开头,算法会很快找到,但如果目标元素位于数据集的末尾,它将需要遍历整个数据集才能找到。
不适合有序数据: 对于有序数据,更高效的算法如二分查找可以提供更快的查找速度。线性查找不充分利用数据的有序性。
不适用于大型数据集: 在大型数据集中,线性查找的性能可能会变得非常糟糕,因为它需要花费较长的时间来查找目标元素。
拓展:
什么是小型数据集
以下是一些一般性的观点来描述小型数据集:
元素数量较少: 小型数据集通常包含的元素数量在几十到几千之间。例如,一个包含20个学生成绩的列表可以被认为是一个小型数据集。
易于手动处理: 小型数据集通常足够小,以至于人们可以轻松地手动处理和分析数据,而无需借助复杂的算法或工具。
内存占用较小: 小型数据集在计算机内存中占用的空间相对较少,因此不会导致内存问题或性能瓶颈。
适合简单算法: 小型数据集通常适合使用简单的搜索算法,如线性查找,因为这些算法的性能在小规模数据集上通常是可以接受的。
需要注意的是,"小型数据集" 的界定可能因领域和具体应用而异。
对于某些领域,包含数千个元素的数据集可能被视为小型,而在其他领域,可能需要包含数百万个元素才能算作小型数据集。
因此,了解具体应用的背景和需求对于确定数据集是否属于小型数据集非常重要。
1.3 复杂度
下面详细介绍线性查找算法的时间复杂度和空间复杂度:
时间复杂度:
线性查找算法的时间复杂度是O(n),其中n是数据集中元素的数量。这意味着算法的运行时间与数据集的大小成正比。
线性查找算法的原理是逐一比较元素,直到找到目标元素或者遍历整个数据集。
在最坏情况下,目标元素可能位于数据集的最后一个位置,这就需要遍历整个数据集,因此时间复杂度是O(n)。
线性查找的时间复杂度对于小型数据集来说是可接受的,但对于大型数据集,它的效率较低。
在这种情况下,更高效的搜索算法,如二分查找或哈希查找,可能更为合适。
空间复杂度:
线性查找算法的空间复杂度很低,通常为O(1)。这是因为算法只需要几个额外的变量,如索引或指针,来跟踪当前查找的位置,而不需要额外的数据结构或内存分配。
线性查找的空间复杂度是固定的,与数据集的大小无关。这使得它在空间受限的环境下非常适用,因为它不会消耗大量内存。
总结:线性查找算法的时间复杂度是O(n),其中n是数据集中的元素数量,而空间复杂度通常为O(1)。
虽然它在小型数据集中适用,但在大型数据集或需要快速查找的情况下,更高效的算法可能更合适。
1.4 使用场景
线性查找算法虽然不是最高效的搜索算法,但在某些情况下仍然有其应用场景。
以下是一些适合使用线性查找算法的场景:
小型数据集: 当数据集较小且规模不大时,线性查找算法是一种简单且有效的选择。它不涉及复杂的计算或排序,适用于小型列表、数组或集合。
无序数据集: 线性查找不需要数据集是有序的,因此它适用于无序数据集。如果数据没有排序或不需要排序,线性查找可以满足需求。
简单实现需求: 线性查找算法非常容易实现,不需要额外的数据结构或算法复杂性。这使得它在教学和初学者入门算法时很有用。
寻找多个匹配项: 线性查找不仅可以找到第一个匹配项,还可以找到所有匹配项。如果需要查找多个匹配项的位置,线性查找是一个不错的选择。
实时数据: 在实时数据流中,数据通常是无序的,且数据集相对较小。线性查找可用于快速查找实时数据流中的特定元素。
数据有序度低: 即使数据集较大,如果数据的有序度很低,例如在某些情况下数据可能已被打乱,线性查找可以是一种可行的选择。
二、代码实现
2.1 Java代码实现
以下是一个简单的Java代码示例,用于实现线性查找算法
2.1.1 代码示例
public class LinearSearch {public static int linearSearch(int[] arr, int target) {for (int i = 0; i < arr.length; i++) {if (arr[i] == target) {return i; // 找到目标元素,返回索引}}return -1; // 未找到目标元素}public static void main(String[] args) {int[] arr = {10, 5, 8, 2, 7, 3};int target = 2;int result = linearSearch(arr, target);if (result != -1) {System.out.println("目标元素 " + target + " 在索引 " + result + " 处找到。");} else {System.out.println("目标元素 " + target + " 未找到。");}}
}
2.1.2 代码讲解
代码内容说明:
linearSearch
方法接受一个整数数组arr
和一个目标整数target
作为参数,然后使用线性查找算法在数组中查找目标元素。- 在
linearSearch
方法中,使用for
循环逐一比较数组中的元素,如果找到目标元素,返回该元素的索引,否则返回-1表示未找到。main
方法用于演示线性查找的使用。创建一个示例数组arr
和一个目标值target
,然后调用linearSearch
方法来查找目标值。根据查找结果输出相应的消息。
2.1.3 运行结果
在这个示例中,目标元素是2,它在数组中的索引为3。因此,运行上述代码的结果将是:
目标元素 2 在索引 3 处找到。
线性查找算法成功找到了目标元素,并返回了其索引。
如果目标元素不存在于数组中,输出将是 "目标元素 2 未找到。" 表示未找到目标元素
2.2 Python代码实现
以下是一个使用Python实现的线性查找算法的示例
2.2.1 代码示例
def linear_search(arr, target):for i in range(len(arr)):if arr[i] == target:return i # 找到目标元素,返回索引return -1 # 未找到目标元素# 示例数据和目标元素
arr = [10, 5, 8, 2, 7, 3]
target = 2result = linear_search(arr, target)if result != -1:print(f"目标元素 {target} 在索引 {result} 处找到。")
else:print(f"目标元素 {target} 未找到。")
2.2.2 代码讲解
代码内容说明:
linear_search
函数接受一个整数列表arr
和一个目标整数target
作为参数,然后使用线性查找算法在列表中查找目标元素。- 在
linear_search
函数中,使用for
循环逐一比较列表中的元素,如果找到目标元素,返回该元素的索引,否则返回-1表示未找到。- 示例数据包含一个整数列表
arr
和一个目标值target
,然后调用linear_search
函数来查找目标值。根据查找结果输出相应的消息。
2.2.3 运行结果
目标元素是2,它在列表中的索引为3。因此,运行上述Python代码的结果是:
目标元素 2 在索引 3 处找到。
三、总结
综合来看,线性查找是一个简单但不够高效的搜索算法。它适用于小型数据集或无序数据集,但对于大型数据集,特别是有序数据,其他更高效的搜索算法通常更为合适。
线性查找在教学和理解算法的概念方面具有价值,但在实际应用中,通常需要考虑更快速的算法。
在大型数据集中或需要频繁搜索的情况下,更高效的搜索算法,如二分查找、哈希查找或树结构,通常更为合适。在选择搜索算法时,应根据数据集的规模、有序性和性能需求来权衡不同算法的优劣。
四、图书推荐
4.1 图书名称
《Python数据分析从入门到精通》
4.2 图书介绍
《Python数据分析从入门到精通》全面介绍了使用Python进行数据分析所必需的各项知识。全书共分为14章,包括了解数据分析、搭建Python数据分析环境、Pandas统计分析、Matplotlib可视化数据分析图表、Seaborn可视化数据分析图表、第三方可视化数据分析图表Pyecharts、图解数组计算模块NumPy、数据统计分析案例、机器学习库Scikit-Learn、注册用户分析(MySQL版)、电商销售数据分析与预测、二手房房价分析与预测,以及客户价值分析。
该书所有示例、案例和实战项目都提供源码,另外该书的服务网站提供了模块库、案例库、题库、素材库、答疑服务,力求为读者打造一本“基础入门+应用开发+项目实战”一体化的Python数据分析图书。
《Python数据分析从入门到精通》内容详尽,图文丰富,非常适合作为数据分析人员的学习参考用书,也可作为想拓展数据分析技能的普通职场人员和Python开发人员学习参考用书。等不及的小伙伴,可以点击下方链接先睹为快:
《Python数据分析从入门到精通》
4.3 参与方式
图书数量:本次送出 2 本 !!!⭐️⭐️⭐️
活动时间:截止到 2023-10-17 12:00:00抽奖方式:
- 评论区随机抽取小伙伴!
留言内容,以下方式都可以:
- 根据文章内容进行高质量评论
参与方式:关注博主、点赞、收藏,评论区留言
4.4 中奖名单
🍓🍓 获奖名单🍓🍓
中奖名单:请关注博主动态
名单公布时间:2023-10-17 下午
相关文章:

【算法系列 | 10】深入解析查找算法之—线性查找
序言 心若有阳光,你便会看见这个世界有那么多美好值得期待和向往。 决定开一个算法专栏,希望能帮助大家很好的了解算法。主要深入解析每个算法,从概念到示例。 我们一起努力,成为更好的自己! 今天第10讲,讲…...

获取操作系统信息服务器信息JVM信息cpu内存磁盘信息
1.添加依赖 <dependency><groupId>com.github.oshi</groupId><artifactId>oshi-core</artifactId><version>5.6.0</version> </dependency>...

Android笔记(四)Activity之间传递可序列化的数据的优化处理
Activity之间传递可序列化的数据 Android应用开发会常常处理数据的序列化和传递。在Android中往往采用两种方式实现数据的可序列化:(1)实现java.io.Serializable接口(2)实现android.os.Parcelable接口。 将类定义为an…...

MySQL MVCC详细介绍
MVCC概念 MVCC(Multi-Version Concurrency Control) 多版本并发控制,是一种并发控制机制,用于处理数据库中的并发读写操作,它通过在每个事务中创建数据的快照,实现了读写操作的隔离性,从而避免了读写冲突和数据不一致的问题。 M…...

Element Plus阻止 el-dropdown、el-switch等冒泡事件
最近做vue3项目,使用Element Plus,又遇到坑了! 问题点:组件中遇到事件冒泡问题了,el-checkbox 中 change事件要求阻止冒泡,如下代码中要求点击checkbox时不调用li标签的show方法 <li click"show()">…...

Spring framework Day13:注解结合Java配置类
前言 前面我们管理 bean 都是在 xml 文件中去管理,本次我们将介绍如何在 Java 配置类中去管理 bean。 注解结合 Java 配置类是一种常见的 Spring 注入 Bean 的方式。通常情况下,开发人员会使用 Java Config 来定义应用程序的配置信息,而在 …...

彻底卸载自己安装的python
一.彻底卸载自己安装的python Python3 安装完后,在系统中不同目录下存在各种依赖关系,若需卸载,需要一步步无残留完全卸载干净。 删除Python 3.7 框架,打开终端,输入 sudo rm -rf /Library/Frameworks/Python.frame…...

ES相关面试问题整理
索引模板了解么 索引模板,一种复用机制,就像一些项目的开发框架如 Laravel 一样,省去了大量的重复,体力劳动。当新建一个 Elasticsearch 索引时,自动匹配模板,完成索引的基础部分搭建。 模板定义…...

MytatisP详解
MP详解 一、基础使用1.引入2.Entry中的常用注解3.BaseMapper 、IService、ServiceImpl3.1BaseMapper 3.2IService、ServiceImpl 4.常用配置4.1 application.yml配置4.2 configuration 配置 5.Wrapper6.分页6.1使用分页方式一 7.自定义分页:查询指定列7.1 先用MP的分…...

设计符合REST原则的API可以遵循以下步骤
设计符合REST原则的API可以遵循以下步骤: 定义资源:首先需要将需要交换的数据抽象成资源,即可以将数据看作是一种资源,并且为每种资源定义一个唯一的标识符。 设计URL:使用短的、有意义的方式来表示资源的状态。例如&…...

编程助手成为编程高手,帮您正则调试
官方下载地址:安果移动 视频演示地址:编程助手-正则调试与面试题,升职加薪不是梦_哔哩哔哩_bilibili 编程助手成为编程高手,帮您正则调试 软件介绍版本号 1.0.2更新日期 2023-10-11 找工作不敢谈薪资?总觉得公司欠我…...

opencv 双目立体视觉
单目标定 1.先单目标定每个相机,获得单个相机内参,外参,畸变参数。 双目标定 2.然后双面标定 2.1 stereoCalibrate (标定函数): double stereoCalibrate(InputArrayOfArrays objectPoints, //世界坐标系 InputArrayOfArrays imagePoints1, //左图像点 InputArrayOfA…...

如何将jpg转化为png?
如何将jpg转化为png?可能有的小伙伴就会疑惑了,jpg和png都是图片常用的一种格式,为什么要进行格式的更改呢?那是因为PNG格式具有更好的图片质量和更少的失真。JPG(或JPEG)格式的图片通常是压缩过的…...

查看 SSH 登录失败日志
查看日志文件 cat /var/log/auth.log查看 SSH 登录失败的记录 grep "Failed password\|authentication failure" /var/log/auth.log...

竞赛选题 深度学习+opencv+python实现车道线检测 - 自动驾驶
文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数:3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV56 数据集处理7 模型训练8 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 &am…...

MR混合现实模拟消防安全演练场景实训
混合现实(MR)是一种将虚拟世界与真实世界相结合的技术。它允许教师将数字元素融入实际场景,使学生在亲身体验中学习消防安全知识。这种方式不仅可以激发学生的学习兴趣,还能增强学生的记忆效果。 在MR的助力下,消防安全…...

geecg-uniapp 同源策略 数据请求 获取后台数据 进行页面渲染 ui库安装 冲突解决(3)
一,同源策略 (1)首先找到env 要是没有env 需要创建一个替换成后端接口 (2)因为他封装了 先找到 http 请求位置一级一级找 然后进行接口修改 (3)appUpdata 修改接口 运行即可 &#x…...

Krypton控件组使用之KryptonRibbon
1.去掉File按钮 2.去掉 Cutomize 菜单...

低压配电系统中浪涌保护器的作用,安装位置和接线方法
低压配电系统是指在变压器低压侧或用户侧的电气装置,主要用于向用户提供安全、可靠和经济的电能。低压配电系统中常见的电气设备有低压配电柜、分支箱、开关箱、插座、照明等。这些设备都需要防止因外部或内部原因产生的过电压对其造成损坏或影响其正常工作。过电压…...

OpenCV实现答题卡自动打分!
目录 1,主要原理以及函数介绍 全部代码,以 2 , 实现过程 3,结果展示 1,主要原理以及函数介绍 ap argparse.ArgumentParser() 创建一个ArgumentParser对象,并将其赋值给变量ap。这个对象可以接受我们的脚…...

Python编程必备:掌握列表遍历的6种神级技巧!
更多资料获取 📚 个人网站:涛哥聊Python 遍历列表是Python中最常见的任务之一,因为列表是一种非常常用的数据结构,它用于存储一组项目。 在编程中,经常需要对这些项目进行操作,例如查找特定元素ÿ…...

nodejs+vue校园失物招领平台
失物人可以在该平台中发布自己的拾物信息,本毕业设计题目将设计与实现一个基于校园的非商业行为的网上校园失物招领平台。并给出自己附加的各项条件, 失物招领管理系统主要分为两个部分,涉及前台和后台,然后由失主通过校园失物招…...

leetcode做题笔记171. Excel 表列序号
给你一个字符串 columnTitle ,表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。 例如: A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ... 示例 1: 输入: columnTitle "A" 输出: 1示例 2: 输入: colu…...

SW曲面实体导出工程图
...

Docker的私有仓库部署——Harbor
Harbor 简介 一、什么是Harbor Harbor 是 VMware 公司开源的企业级 Docker Registry 项目, 其目标是帮助用户迅速搭建一个企业级的 Docker Registry 服务。 Harbor以 Docker 公司开源的 Registry 为基础, 提供了图形管理 UI 、基于角色的访问控制(Role…...

JavaScript反爬虫技巧详细攻略
在互联网时代,网站采取了各种手段来防止被爬虫抓取数据,其中最常见的就是JavaScript反爬虫技巧。本文将揭示一些常用的JavaScript反爬虫技巧,并提供一些实际操作建议,帮助您保护自己的爬虫免受检测和封禁。 1、为什么网站使用Java…...

C++基础入门学习笔记
问题1:什么是 C 中的多态?如何实现多态? 回答1:C 中的多态是指同一种类型的实体,可以在不同的情况下表现出不同的行为。实现多态的方式有两种:虚函数和模板函数。虚函数是在基类中声明为虚函数的函数&…...

手机cpu架构查看及armeabi、armeabi-v7a、arm64-v8a及x86等说明
一、如何查看cpu加购 winR,输入cmd 填下指令如下 adb shell getprop ro.product.cpu.abi 二、架构描述 1.armeabiv-v7a: 第7代及以上的 ARM 处理器。2011年15月以后的生产的大部分Android设备都使用它. 2.arm64-v8a: 第8代、64位ARM处理器,很少设备&a…...

node-sass报错,node16运行node14的项目
原来项目是node14的版本,现在用node16运行npm i 会报以下错误 node-sass4.14.1 postinstall: node scripts/build.js npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the node-sass4.14.1 postinstall script. npm ERR! This is probably not a problem with …...

在Linux中掌握不同的命令,让创建文件变得易如反掌
在Linux中创建一个新文件很简单,但也有一些令人惊讶和灵巧的技术。在本教程中,学习如何从Linux终端创建文件。 先决条件 访问命令行/终端窗口(Ctrl-Alt-F2或Ctrl-Alt-T) 具有sudo权限的用户帐户(对于某些文件/目录是可选的) 从命令行创建新的Linux文件 Linux的设计…...