当前位置: 首页 > news >正文

搜索算法之线性搜索详细解读(附带Java代码解读)

1. 基本概念

线性搜索(Linear Search),也称为顺序搜索,是一种在列表中查找特定元素的算法。它从列表的第一个元素开始,逐个检查每个元素,直到找到目标元素或检查完所有元素。

2. 工作原理

线性搜索的操作过程如下:

  1. 初始化:从列表或数组的第一个元素开始。

  2. 遍历元素:按顺序访问每个元素。

  3. 比较:将当前元素与目标值进行比较。

  4. 匹配检查

    • 如果当前元素等于目标值,则返回当前索引(即位置)。
    • 如果当前元素不等于目标值,则继续检查下一个元素。
  5. 结束条件

    • 如果找到目标值,返回其索引。
    • 如果遍历完所有元素后未找到目标值,返回一个表示未找到的标志(通常是 -1)。
3. 算法步骤

以下是线性搜索的详细步骤:

  1. 输入

    • 一个列表或数组 arr
    • 一个目标值 target
  2. 步骤

    • 初始化索引 i 为 0。
    • 进入循环,直到 i 小于 arr.length
      • 如果 arr[i] 等于 target,则返回 i
      • 否则,增加 i,继续检查下一个元素。
    • 如果循环结束后仍未找到目标值,返回 -1
4. 时间复杂度分析
  • 最坏情况
    • 当目标值不在数组中时,需要检查所有 n 个元素,时间复杂度为 O(n)。
  • 最佳情况
    • 当目标值是第一个元素时,只需检查一次,时间复杂度为 O(1)。
  • 平均情况
    • 通常需要检查一半的元素,时间复杂度为 O(n),假设目标值均匀分布。
5. 空间复杂度
  • 空间复杂度:线性搜索只需要少量的额外存储空间来存储索引变量,因此空间复杂度为 O(1)。
6. 实现代码
public class LinearSearch {/*** 执行线性搜索* @param arr 要搜索的数组* @param target 目标值* @return 目标值的索引,如果未找到返回-1*/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[] numbers = {4, 2, 7, 1, 9, 3};// 目标值int target = 7;// 执行线性搜索int result = linearSearch(numbers, target);// 输出搜索结果if (result != -1) {System.out.println("元素 " + target + " 在数组中的索引是: " + result);} else {System.out.println("元素 " + target + " 不在数组中。");}}
}

代码解读

  • public static int linearSearch(int[] arr, int target)

    • 定义了一个静态方法 linearSearch,接受两个参数:一个整数数组 arr 和一个目标值 target
    • 方法返回目标值的索引,如果未找到则返回 -1
  • for (int i = 0; i < arr.length; i++)

    • 使用 for 循环遍历数组 arr 的每个元素。
    • i0 开始,到 arr.length - 1 结束。
  • if (arr[i] == target)

    • 在每次循环中,检查当前元素 arr[i] 是否等于目标值 target
    • 如果相等,返回当前索引 i
  • return -1

    • 如果循环结束后仍未找到目标值,则返回 -1,表示目标值不在数组中。
  • public static void main(String[] args)

    • main 方法是程序的入口点,定义了一个示例数组 numbers 和一个目标值 target
    • 调用 linearSearch 方法,获取搜索结果并输出。
7. 实际应用
  • 小型数据集:当数据量较小时,线性搜索简单有效。
  • 无序数据:对于无序数据,线性搜索不需要排序即可查找目标元素。
  • 偶尔查询:在需要偶尔执行搜索操作时,线性搜索足够且易于实现。
8. 变体和改进
  • 双向搜索:在一些特殊情况下,可以从数组的两端同时进行搜索,可能会提高效率。
  • 跳表(Jump Search):在某些应用场景中,对线性搜索进行改进,提高搜索效率。
  • 哈希表:对需要频繁查找的场景,可以使用哈希表来优化搜索时间。

相关文章:

搜索算法之线性搜索详细解读(附带Java代码解读)

1. 基本概念 线性搜索&#xff08;Linear Search&#xff09;&#xff0c;也称为顺序搜索&#xff0c;是一种在列表中查找特定元素的算法。它从列表的第一个元素开始&#xff0c;逐个检查每个元素&#xff0c;直到找到目标元素或检查完所有元素。 2. 工作原理 线性搜索的操作…...

Quartz.Net_依赖注入

简述 有时会遇到需要在IJob实现类中依赖注入其他类或接口的情况&#xff0c;但Quartz的默认JobFactory并不能识别具有有参构造函数的IJob实现类&#xff0c;也就无法进行依赖注入 需要被依赖注入的类&#xff1a; public class TestClass {public TestClass(Type jobType, s…...

【系统架构设计师-2011年】综合知识-答案及详解

更多内容请见: 备考系统架构设计师-核心总结索引 文章目录 【第1题】【第2~4题】【第5~7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18~19题】【第20~21题】【第22题】【第23题】【第24题】【第25题】【第2…...

World of Warcraft [CLASSIC][80][Grandel]Sapphire Hive Drone

Sapphire Hive Drone 蓝玉虫巢雄蜂 蓝玉虫巢巨峰 索拉查盆地 实用性不强&#xff0c;好看是好看&#xff0c;模型很大&#xff0c;无奈栏位太少...

Unity 对接 Android 第三方广告,App 切换到后台后,再次打开时,第三方广告被销毁导致无法触发回调逻辑的问题

该问题是由发行进行游戏测试时遇到并反馈的。大致情况如下&#xff1a; 1. 当触发了插屏广告后&#xff0c;在关闭广告前将 App 切换到后台&#xff0c;之后再次打开 App&#xff0c;此时插屏广告消失&#xff0c;并切游戏卡死。 2. 当触发激励视频广告后&#xff0c;在广告展…...

Kafka Broker处于高负载状态(例如消息处理量大或系统资源不足),无法及时响应消费者的请求

Caused by: org.apache.kafka.common.errors.TimeoutException: Timeout of 60000ms expired before the position for partition activity-0 could be determined。 出现这个错误的原因是Kafka消费者在尝试获取分区(activity-0)的位置信息时&#xff0c;超时了。在60秒内无法确…...

相关二叉树进阶面试题的讲解?看这一篇足矣

引子&#xff1a;我们在之前学过c语言的二叉树&#xff0c;但是c来做更好&#xff01;本期要讲的题目如下(其实有点拖欠了&#xff0c;很久之前&#xff0c;就想写这个了&#xff0c;今天终于克服自己的欲望&#xff0c;达成了这个愿望&#xff09; 1&#xff0c; 二叉树创建字…...

Nginx部署前端Vue项目的深度解析

目录 一、准备工作 1.1 开发环境 1.2 服务器环境 1.3 Nginx安装 二、构建Vue项目 三、上传静态文件到服务器 四、配置Nginx 五、测试并重新加载Nginx 六、访问Vue应用 七、高级配置 7.1 启用HTTPS 7.2 启用Gzip压缩 7.3 缓存控制 八、常见问题与解决方案 8.1 40…...

PHP一站式解决方案高级房产系统小程序源码

一站式解决方案&#xff0c;高级房产系统让房产管理更轻松 &#x1f3e0;【开篇&#xff1a;告别繁琐&#xff0c;迎接高效房产管理新时代】&#x1f3e0; 你是否还在为房产管理的繁琐流程而头疼&#xff1f;从房源录入、客户咨询到合同签订、售后服务&#xff0c;每一个环节…...

轻量级模型解读——EfficientNet系列

EfficientNet自2019年谷歌提出以来&#xff0c;经历了三个版本&#xff0c;2019EfficientNet ——> 2020EfficientNet-Lite——> 2021EfficientNetv2 文章目录 1、EfficientNet2、EfficientNetv23、EfficientNet-Lite 对于EfficientNet和EfficientNetv2的解读可见另外两篇…...

深入浅出SRS—RTMP实现

RTMP 直播是 SRS 最典型的使用场景&#xff0c;客户端使用 RTMP 协议向 SRS 推流&#xff0c;使用 RTMP 协议从 SRS 拉流&#xff0c;SRS 作为一个 RTMP 直播服务器实现媒体的转发。同时&#xff0c;RTMP 是 SRS 的中转协议&#xff0c;其他协议之间的互通需要先转为 RTMP&…...

睿赛德科技携手先楫共创RISC-V生态|RT-Thread EtherCAT主从站方案大放异彩

日前&#xff0c;在先楫HPM6E00技术日上&#xff0c;睿赛德科技&#xff08;RT-Thread&#xff09;向广大工业用户展示了多年来双方在RISC-V生态领域的合作历程和成果&#xff0c;同时睿赛德科技携手先楫半导体首次推出了基于HPM6800处理器的EtherCAT主站解决方案&#xff0c;吸…...

【Cesium实体创建】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Cesium目录 前言一、Cesium二、点 线 实体1.点实体2.线实体 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;随着人工智能的不…...

为何一些包的Priority在apt-cache和deb文件当中的不一样

最近遇到一些问题&#xff0c;调查的时候发现是一些包的Priority在apt-cache和deb文件当中的不一样导致的&#xff0c;复现步骤如下&#xff1a; $ apt update $ apt download whiptail $ dpkg-deb -e whiptail_0.52.23-1b1_amd64.deb $ cat control | grep Prio Priority: op…...

CRUD的最佳实践,联动前后端,包含微信小程序,API,HTML等(三)

关说不练假把式&#xff0c;在上一&#xff0c;二篇中介绍了我心目中的CRUD的样子 基于之前的理念&#xff0c;我开发了一个命名为PasteTemplate的项目&#xff0c;这个项目呢后续会转化成项目模板&#xff0c;转化成项目模板后&#xff0c;后续需要开发新的项目就可以基于这…...

nvidia-cuda-tensorrt-cudnn下载网站

tensorrt:https://developer.nvidia.com/tensorrt/download cudnn:https://developer.nvidia.com/rdp/cudnn-archive cuda:https://developer.nvidia.com/cuda-toolkit-archive...

GitLab 是什么?GitLab使用常见问题解答

GitLab 是什么 GitLab是由GitLab Inc.开发&#xff0c;使用MIT许可证的基于网络的Git仓库管理工具开源项目&#xff0c;且具有wiki和issue跟踪功能&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的web服务。 ​GitLab 是由 GitLab Inc.开发&#xff0c…...

数字时代,寻找新的生意增长点之前要做什么准备?

要做好最基础也最繁复的数据管理。 在竞争日益激烈的快消市场中&#xff0c;企业面临前所未有的挑战与压力。在这种高压环境下&#xff0c;数字化转型不再仅仅是选择&#xff0c;而是企业探索新的业务增长点、保持竞争优势的关键战略。然而&#xff0c;随着企业数字化进程的加…...

使用Python本地搭建http.server文件共享服务并实现公网环境远程访问——“cpolar内网穿透”

前言 本文主要介绍如何在Windows系统电脑上使用python这样的简单程序语言&#xff0c;在自己的电脑上搭建一个共享文件服务器&#xff0c;并通过cpolar创建的公网地址&#xff0c;打造一个可以随时随地远程访问的私人云盘。 数据共享作为和连接作为互联网的基础应用&#xff…...

STM32——Flash闪存

以上部分&#xff0c;主存储器&#xff1a;程序存储器&#xff1b; 启动程序代码&#xff1a;系统存储器&#xff1b; 用户选择字节&#xff1a;选项字节 以下是闪存的管理员&#xff0c;用于擦除和读写的地址 C8T6一共64K&#xff0c;主存储器为64页 以下是整体框图&#x…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中&#xff0c;如何在保障应用高可用的同时有效地管理资源&#xff0c;一直是运维人员和开发者关注的重点。随着微服务架构的普及&#xff0c;集群内各个服务的负载波动日趋明显&#xff0c;传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...

门静脉高压——表现

一、门静脉高压表现 00:01 1. 门静脉构成 00:13 组成结构&#xff1a;由肠系膜上静脉和脾静脉汇合构成&#xff0c;是肝脏血液供应的主要来源。淤血后果&#xff1a;门静脉淤血会同时导致脾静脉和肠系膜上静脉淤血&#xff0c;引发后续系列症状。 2. 脾大和脾功能亢进 00:46 …...

【版本控制】GitHub Desktop 入门教程与开源协作全流程解析

目录 0 引言1 GitHub Desktop 入门教程1.1 安装与基础配置1.2 核心功能使用指南仓库管理日常开发流程分支管理 2 GitHub 开源协作流程详解2.1 Fork & Pull Request 模型2.2 完整协作流程步骤步骤 1: Fork&#xff08;创建个人副本&#xff09;步骤 2: Clone&#xff08;克隆…...