Go版数据结构 -【8.6 线性查找】

news2024/10/11 4:11:33

8.6 线性查找

线性查找是最基础的一种查找算法。其思想非常简单,就是从头到尾依次遍历整个数组或列表,逐个元素进行比较,直到找到目标元素为止。

由于其实现和理解非常直观,线性查找通常是学习查找算法的第一步。

本节代码存放目录为 lesson20

概念与原理

线性查找的原理如下:

  • 从序列的第一个元素开始,与目标值进行比较。

  • 如果当前元素与目标值相等,则查找成功,返回该元素的索引。

  • 如果不相等,则继续比较下一个元素,直到找到目标值或者遍历完整个序列。

  • 如果遍历完整个序列仍未找到目标值,则返回未找到。


线性查找的特点如下:

  • 时间复杂度:最坏情况下,线性查找需要遍历整个数组,因此其时间复杂度为 O(n)

  • 适用场景:线性查找适用于任何类型的列表或数组,尤其是当数据量较小或数据未排序时。

  • 稳定性:线性查找是稳定的查找算法。


线性查找的步骤示例

给定如下数组,目标是查找元素 4

[5, 3, 8, 4, 2]

通过线性查找的步骤如下:

第一轮:

- 比较 arr[0] 与目标值 4,不相等,继续查找。

第二轮:

- 比较 arr[1] 与目标值 4,不相等,继续查找。

第三轮:

- 比较 arr[2] 与目标值 4,不相等,继续查找。

第四轮:

- 比较 arr[3] 与目标值 4,相等,查找成功,返回索引 3。

最终,目标值 4 位于索引 3,查找成功。


线性查找的时间复杂度

线性查找的时间复杂度取决于目标值在数组中的位置:

  • 最坏情况O(n),即目标值位于数组末尾或不在数组中。

  • 最好情况O(1),即目标值位于数组的第一个位置。

  • 平均情况O(n),即目标值随机分布在数组中。

由于线性查找需要逐个比较元素,它的时间复杂度随着数组长度的增加而线性增长,因此在数据量较大时,线性查找的效率较低。

Go 语言的实现

实现代码如下:

// linearSearch 实现线性查找
func linearSearch(arr []int, target int) int {
    // 遍历数组
    for i, val := range arr {
        // 如果找到目标值,返回其索引
        if val == target {
            return i
        }
    }
    // 如果找不到,返回 -1
    return -1
}

func main() {
    arr := []int{5, 3, 8, 4, 2}
    target := 4

    // 执行线性查找
    result := linearSearch(arr, target)

    if result != -1 {
        fmt.Printf("元素 %d 找到,索引为: %d\n", target, result)
    } else {
        fmt.Println("元素未找到")
    }
}

执行结果如下所示:

元素 4 找到,索引为: 3

在上面的代码中,linearSearch 函数通过 for 循环遍历数组,如果找到目标值则返回其索引,否则返回 -1 表示未找到。

小结

本节我们讲解了线性查找的基本原理、步骤示例和 Go 语言的实现。

关于本节总结如下:

  • 时间复杂度:线性查找的时间复杂度为 O(n),适用于数据量较小的场景。

  • 适用场景:线性查找适合无序数组,特别是在数据量较小或者不经常进行查找操作的情况下。

  • 局限性:线性查找效率较低,不适用于大规模数据集。


我的GitHub:https://github.com/swxctx

书籍地址:https://gs.golang.website/

书籍代码:https://github.com/YouCanGolang/GoStructedCode

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

封装、继承、抽象类

面向对象共有三个特征:封装,继承,多态。 封装 封装表现: (1)方法就是一个最基本封装体。 (2)类其实也是一个封装体。 封装的好处: (1)提高…

Jquery serialize()、serializeArray()、$.param()

param()方法 1.定义:param() 方法创建**数组或对象**的序列化表示。》》该序列化值可在进行 AJAX 请求时在 URL 查询字符串中使用。2.语法:$.param(object,trad)object:必需,规定要序列化的数组或对象。trad:可选。布尔…

如何提高LabVIEW编程效率

提高LabVIEW编程效率对开发者来说非常重要,尤其是在处理复杂项目或紧迫的开发周期时。以下是一些可以显著提升LabVIEW编程效率的技巧,从代码结构、工具使用到团队协作的多个角度进行详细分析: 1. 模块化设计 模块化设计 是提高代码可维护性和…

Linux——grep-wc-管道符

grep命令 利用关键字过滤文件行,找到关键字所在那一行 wc命令 统计文件行数,单词数量 wc命令 不带选项全选 wc -c test.txt 字节bytes数量 wc -m test.txt 字符数量 wc -l test-txt 行数 wc -w test-txt 单词数量 管道符 | 将左边命令的…

【LLM论文日更】| BGE-M3E embedding模型

论文:https://arxiv.org/pdf/2402.03216代码:GitHub - FlagOpen/FlagEmbedding: Retrieval and Retrieval-augmented LLMs机构:BAAI领域:embedding model发表: ​ 研究背景 研究问题:这篇文章要解决的问…

AI时代大厂AI项目管理学习路线

AI时代避免被裁员,大厂AI项目管理学习路线主要包括: 1、AI项目管理基础技能。 2、项目管理AI技术知识。 3、数据分析与决策。 4、AI项目管理工具。 5、AI项目管理知识扩展。 01 AI项目管理基础技能。 AI项目管理基础技能构成了项目管理的骨架&…

SQL 干货 | 使用 EXISTS 编写 SELECT 查询

基于 SQL 中的 EXISTS 运算符为我们提供了一种基于其他数据是否存在(或不存在)来检索数据的简便方法。更具体地说,它是一个逻辑运算符,用于评估子查询的结果,并返回一个布尔值,该值指示是否返回了行。尽管 …

《用comfyUI挑战全网AI图片产品实践案例》之comfyUI抠图工作流,用免费打败收费,实现素材自由

近段时间AI非常的火。目前有很多软件已经拥抱了AI,加入了AI的一些功能。像AI绘画的功能,基本上是每个大厂的软件产品都会配备。但是呢,这些功能都是要付费的。而且是按月收费或者是按年收费。整体算下来十分的不划算。所以我尝试用stable dif…

基础岛 第3关 :浦语提示词工程实践

作业 基础任务 (完成此任务即完成闯关) 背景问题&#xff1a;近期相关研究发现&#xff0c;LLM在对比浮点数字时表现不佳&#xff0c;经验证&#xff0c;internlm2-chat-1.8b (internlm2-chat-7b)也存在这一问题&#xff0c;例如认为13.8<13.11。 任务要求&#xff1a;利用…

嵌入式面试——FreeRTOS篇(五) 事件标志组

本篇为&#xff1a;FreeRTOS事件标志组篇 1、事件标志组介绍 答&#xff1a; 事件标志位&#xff1a;用一个位&#xff0c;来表示事件是否发生。 事件标志组是一组事件标志位的合集&#xff0c;可以简单的理解事件标志组&#xff0c;就是一个整数。 2、事件标志组的特点 答&am…

R包:APAlyzer从RNA-seq数据计算APA表达丰度

文章目录 介绍教程实战案例数据脚本运行 介绍 今天安利APAlyzer工具&#xff0c;它是通过RNA-seq数据获取3′UTR APA, intronic APA等表达谱的R包。 APAlyzer将bam文件比对到PolyA-DB数据库识别APA。 Most eukaryotic genes produce alternative polyadenylation (APA) isofo…

App推广新利器:Xinstall带你直达指定页面

在移动互联网时代&#xff0c;App的推广与运营对于企业的发展至关重要。然而&#xff0c;如何让用户在推广过程中更便捷地访问到App内的指定页面&#xff0c;一直是困扰开发者和运营者的难题。今天&#xff0c;我们就来介绍一款名为Xinstall的SDK&#xff0c;它能帮助你轻松实现…

Python中10个让你代码更安全的网络请求处理技巧

对Python感兴趣&#xff0c;想要有更深入了解的朋友可以试试我的这份学习方法和资料&#xff0c;​​​​​点这里免费获取 引言 在 Python 网络编程中&#xff0c;使用 requests 库进行 HTTP 请求是一种常见且高效的方式。该库不仅提供了简洁易用的 API&#xff0c;还支持多…

3分钟理清QPS、TPS、RT 以及它们之间的关系

在评估系统性能的时候&#xff0c;我们经常会听到 QPS、TPS、RT、吞吐量等等一些概念&#xff0c;包括在一些面试场景下可能也会遇到这些概念&#xff0c;我们来稍微梳理一下。 做一个简单的概念扫盲。 一 QPS QPS&#xff08;Queries Per Second&#xff09; 是每秒的查询率…

上市四天暴涨又暴跌,扫描全能王背后公司坐上“过山车”

股价四天涨五倍&#xff0c;遇到回调跌一半&#xff0c;扫描全能王母公司——合合信息&#xff0c;一上市就坐上了“过山车”。 合合信息其实早在2021年就向科创板申请上市&#xff0c;并在2023年成功过会&#xff0c;但直到9月13日才开启申购&#xff0c;IPO之路一走就是三年…

使用DBeaver(通用数据库管理工具)连接人大金仓数据库

下载安装DBeaver 下载地址&#xff1a; Download | DBeaver Community 官方甚至提供了&#xff08;解压即可用的&#xff09;免安装绿色版 3、下载人大金仓数据库的JDBC驱动 下载地址&#xff1a;电科金仓-成为世界卓越的数据库产品与服务提供商 数据库驱动管理 创建新驱动 配…

【Vue3 + TS + Vite】从0到1搭建项目框架

前言 没搭建过Vue3的项目&#xff0c;从0开始搭建一下&#xff0c;记录一下自己的步骤。 技术栈&#xff1a; vue3 ts scss pinia vite 我尽量写的详细一些&#xff0c;后续也会记录我在项目过程中&#xff0c;遇到的一些问题。 文章目录 前言环境搭建一、创建项目1. 使用…

JUC-线程池

阻塞队列 概述和架构 分类和核心方法 这里是在讲 为了区分在不同场景下 调用的不同组实现方法 核心方法演示 package com.example.juc.queue;import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.Tim…

数据结构哈夫曼树-哈夫曼树代码构造实现(C语言)

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdlib.h> #include<stdio.h> #define N 30 //叶子结点的最大值 #define M 2*N-1 // 结点总数 typedef struct HTNode {int weight;int parent;int Lchild;int Rchild;int flag; }HTNode,HuffmanTree[M1];//Huffman…

2024年腾讯外包面试题(微创公司)

笔试&#xff1a; 1、判断异步执行顺序console.log(1);setTimeout(()>{Promise.resolve().then(()>{console.log(2);})console.log(3);},0);new Promise ((resolve)>{for(let i0; i<1000;i ){if(i1000){resolve();}}console.log(4);}).then(()>{console.log(5);…