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

查找算法:线性查找,golang实现

目录

前言

线性查找

代码示例

1. 算法包

2. 线性查找代码

3. 模拟程序

4. 运行程序

循环次数

假如目标值正好在数组中的第一位

假如目标值正好在数组中的第五位

假如目标值正好在数组中的最后一位

假如目标值不在数组中

线性查找的思想

1. 顺序遍历

2. 比较

3. 返回结果

线性查找的适用场景

1. 数据量小

2. 未排序的数据

3. 几乎不重复的数据

4. 数据频繁变更

5. 缓存未命中


前言

在实际场景中,选择合适的查找算法对于提高程序的效率和性能至关重要,本节课主要讲解"线性查找"的适用场景及代码实现。

线性查找

线性查找(Linear Search)是一种简单的查找算法,用于在一个集合(如数组或切片)中查找特定的元素。它的基本思想是逐个检查数据结构中的每个元素,直到找到所需的元素或搜索完所有数据为止。这种算法的时间复杂度为 O(n),其中 n 是数组中的元素数量。线性查找不需要数据结构具有任何特定的顺序,因此它可以应用于任何类型的有序或无序的数据集合。然而,由于它的效率相对较低(在最坏的情况下需要遍历整个数据集),它通常不适用于大数据集或需要高效查找性能的场景。

代码示例

下面我们使用Go语言实现一个线性查找

1. 算法包

创建一个 pkg/search.go

touch pkg/search.go

2. 线性查找代码

打开 pkg/search.go 文件,代码如下

package pkg// LinearSearch 线性查找
func LinearSearch(arr []int, target int) int {for k, v := range arr {if v == target {return k}}return -1
}

3. 模拟程序

打开 main.go 文件,代码如下:

package mainimport ("demo/pkg""fmt"
)func main() {// 定义一个切片(数组),这里我们模拟 10 个元素arr := []int{408, 902, 757, 859, 382, 353, 964, 473, 392, 369}fmt.Println("arr的长度:", len(arr))fmt.Println("arr的值为:", arr)target := 408index := pkg.LinearSearch(arr, target)if index != -1 {fmt.Printf("找到目标值 %d , 在索引 %d \n", target, index)} else {fmt.Printf("没有找到目标值 %d \n", target)}}

4. 运行程序

go run main.go

在我们定义的切片(数组)第一个就是我们的目标值:408

所以在 if 判断里,index 不等于 -1,输出:找到了 408 这个目标值,在切片(数组)中的索引为 0

循环次数

以上代码中,我们使用了 for 循环来查找目标值是否存在,根据 线性查找的查找方式,如果我们的目标值是 369(最后一位),或是不存在这个切片(数组)中,又会如何呢?

我们来做个测试,实践得真理!

假如目标值正好在数组中的第一位

循环次数 1

假如目标值正好在数组中的第五位

循环次数 5

假如目标值正好在数组中的最后一位

循环次数 10

假如目标值不在数组中

循环次数 10

线性查找的思想

1. 顺序遍历

从数据结构的开始(通常是索引 0 )按顺序遍历到结束。所以上面的循环中,目标值在第一位时,就只遍历一次,在第五位时,遍历五次,以此类推,而如果找不到目标值时,就会遍历整个数组的长度

2. 比较

在遍历过程中,将当前元素与目标值进行比较

3. 返回结果

  • 如果找到目标值,则返回该元素在数据结构中的索引
  • 如果遍历完整个数据结构都没有找到目标值,则返回一个表示未找到的值(通常是 -1 )

线性查找的适用场景

1. 数据量小

当需要搜索的数据集非常小时,线性查找的简单性可能使其成为一个合理的选择,即使它的效率不是最高的

2. 未排序的数据

如果数据未排序,则使用更高效的查找算法(如二分查找)是不适用的,因为二分查找要求数据已排序

3. 几乎不重复的数据

如果数据集中每个元素几乎都不相同,且数据规模不大,那么线性查找的效率损失可能是可以接受的

4. 数据频繁变更

如果数据集频繁更改(例如,元素经常被添加或删除),那么维护排序可能会很昂贵,此时线性查找可能是一个更简单的选择

5. 缓存未命中

在某些情况下,如果数据存储在外部存储(如硬盘)中,并且数据访问模式导致缓存未命中率高,那么线性查找的额外计算开销可能不是主要瓶颈,而数据访问的延迟可能更重要

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 封装自己的底部弹出框
  • Docker搭建Flink
  • 【爬虫原理】
  • KVM高级功能部署
  • NAT端口映射,实现外网访问内网服务器
  • 提供三方API接口、调用第三方接口API接口、模拟API接口(二)通过token实现防止业务接口的重复调用
  • 【C++】输入输出
  • 【数值计算方法】数值积分微分-python实现-p3
  • Redis高可用
  • 【pikachu靶场】跨站脚本攻击详细教程Cross-Site Scripting(xss)
  • uni-app便携式蓝牙打印机esc指令改成vue3中使用
  • AI5-PPOCRLabel训练
  • RTL8852bs 初始化流程
  • PLM选型指南:如何选择适合自己企业的系统?
  • 解析capl文件生成XML Test Module对应的xml工具
  • 【Amaple教程】5. 插件
  • 【面试系列】之二:关于js原型
  • jdbc就是这么简单
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 从零开始学习部署
  • 微信小程序--------语音识别(前端自己也能玩)
  • AI算硅基生命吗,为什么?
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ## 基础知识
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #数学建模# 线性规划问题的Matlab求解
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (1)(1.9) MSP (version 4.2)
  • (1)Hilt的基本概念和使用
  • (2.2w字)前端单元测试之Jest详解篇
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (PADS学习)第二章:原理图绘制 第一部分
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (十三)Flask之特殊装饰器详解
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • .DFS.
  • .gitignore文件忽略的内容不生效问题解决
  • .NET CORE 第一节 创建基本的 asp.net core
  • .Net Core 生成管理员权限的应用程序
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET NPOI导出Excel详解
  • .Net Web项目创建比较不错的参考文章
  • .net 无限分类
  • .NET基础篇——反射的奥妙
  • .NET连接MongoDB数据库实例教程
  • .NET轻量级ORM组件Dapper葵花宝典
  • .net通用权限框架B/S (三)--MODEL层(2)
  • .NET业务框架的构建
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘