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

零基础数据结构与算法——第四章:基础算法-搜索算法(上)

4.2 搜索算法

4.2.1 线性搜索(Linear Search)

基本概念

线性搜索(也称为顺序搜索)是最简单、最直观的搜索算法。它的核心思想是从数据集的一端开始,逐个检查每个元素,直到找到目标元素或者检查完所有元素

线性搜索不要求数据集是有序的,可以应用于任何类型的数据集合。

生活中的例子

想象你在一堆纸质文件中寻找一份特定的文件:

  1. 你从第一份文件开始查看
  2. 逐个检查每份文件,看是否是你要找的那份
  3. 如果找到了,你就停止搜索
  4. 如果检查完所有文件都没找到,你就确定这份文件不在这堆文件中

这就是线性搜索的基本思想 - 一个一个地检查,直到找到或者确定不存在。

算法步骤
  1. 初始化:从数组的第一个元素开始
  2. 比较:将当前元素与目标值进行比较
  3. 匹配:如果当前元素等于目标值,返回当前位置,搜索结束
  4. 移动:如果当前元素不等于目标值,移动到下一个元素
  5. 重复:重复步骤2-4,直到找到目标值或者检查完所有元素
  6. 结束:如果检查完所有元素都没有找到目标值,返回-1或null表示未找到
图解过程

假设我们有数组:[5, 2, 8, 12, 3] 要查找元素 8

步骤1:检查索引0的元素 5 != 8,继续

[5, 2, 8, 12, 3]↑
当前位置

步骤2:检查索引1的元素 2 != 8,继续

[5, 2, 8, 12, 3]↑当前位置

步骤3:检查索引2的元素 8 == 8,找到目标值!返回索引2

[5, 2, 8, 12, 3]↑当前位置(找到目标)
代码实现
/*** 在数组中进行线性搜索* @param arr 要搜索的数组* @param target 要查找的目标值* @return 如果找到目标值,返回其索引;否则返回-1*/
public static int linearSearch(int[] arr, int target) {// 检查数组是否为空if (arr == null) {return -1;}// 从头到尾遍历数组for (int i = 0; i < arr.length; i++) {// 如果当前元素等于目标值,返回当前索引if (arr[i] == target) {return i;}}// 如果遍历完整个数组都没有找到目标值,返回-1return -1;
}// 泛型版本的线性搜索
public static <T> int linearSearch(T[] arr, T target) {if (arr == null || target == null) {return -1;}for (int i = 0; i < arr.length; i++) {// 使用equals方法比较对象if (target.equals(arr[i])) {return i;}}return -1;
}
性能分析
  • 时间复杂度

    • 最坏情况:O(n) - 目标元素在数组的最后位置或不存在
    • 最好情况:O(1) - 目标元素在数组的第一个位置
    • 平均情况:O(n/2) ≈ O(n) - 平均需要检查一半的元素
  • 空间复杂度:O(1) - 只需要常量级的额外空间

适用场景
  • 数据集较小的情况
  • 数据集是无序的
  • 只需要进行一次性搜索
  • 数据集经常变化,维护有序状态成本高
  • 硬件层面的搜索(如CPU缓存、内存等)
线性搜索的优缺点

优点

  • 简单易实现
  • 适用于任何数据类型
  • 不需要数据集是有序的
  • 对于小数据集效率可接受

缺点

  • 对于大数据集效率低
  • 时间复杂度为O(n),随着数据量增加,搜索时间线性增长
线性搜索的优化
  1. 提前终止:如果数据集有序,可以在发现当前元素大于目标值时提前终止
  2. 跳跃搜索:每次检查多个元素,如每次跳过2个或更多元素
  3. 二分搜索:如果数据集有序,可以使用二分搜索提高效率
  4. 哈希表:对于频繁搜索的场景,可以使用哈希表将时间复杂度降至O(1)
http://www.lryc.cn/news/583835.html

相关文章:

  • 无缝矩阵与普通矩阵的对比分析
  • 正点原子 文件权限
  • 深入解析JVM内存结构与垃圾回收机制
  • Oracle大表数据清理优化与注意事项详解
  • 【C语言】学习过程教训与经验杂谈:思想准备、知识回顾(六)
  • Uniapp中的uni.scss
  • Layui —— select
  • 从品牌附庸到自我表达:定制开发开源AI智能名片S2B2C商城小程序赋能下的营销变革
  • 盲盒一番赏小程序技术实现方案:高并发与防作弊的平衡之道
  • 可视化DIY小程序工具!开源拖拽式源码系统,自由搭建,完整的源代码包分享
  • 2025社交电商新风口:推客小程序的商业逻辑与技术实现
  • 【NLP入门系列六】Word2Vec模型简介,与以《人民的名义》小说原文实践
  • UnrealEngine5游戏引擎实践(C++)
  • 「Java EE开发指南」如何用MyEclipse将Java项目转换为Web项目?
  • JavaEE——线程池
  • Windows 系统 IIS 服务的重启方法
  • MyBatis-Plus 中使用 Wrapper 自定义 SQL
  • 网络安全初级
  • LeetCode经典题解:49、字母异位词分组
  • Wisdom SSH:探索AI助手在复杂运维任务中的卓越表现
  • 6 如何向量化人工智能算法
  • 低版本hive(1.2.1)UDF实现清除历史分区数据
  • hive小文件问题
  • RabbitMQ 消息队列:从入门到Spring Boot实战
  • MySQL(127)如何解决主从同步失败问题?
  • XMAPP MySQL 启动后自动停止
  • adb 简介与常用命令
  • 线上事故处理记录
  • mx6ull-裸机学习实验15——RTC 实时时钟实验
  • 浪潮CD1000-移动云电脑-RK3528芯片-2+32G-开启ADB ROOT破解教程