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

news2024/11/14 23:32:27

目录

前言

线性查找

代码示例

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 main

import (
	"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 := 408

	index := 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. 缓存未命中

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

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

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

相关文章

使用GPT-4插件增强LLM的功能

文章目录 GPT-4插件概述插件清单OpenAPI规范描述GPT-4插件 尽管包括GPT-4在内的LLM在各种任务上都现出色,但它们仍然存在面有的局限性。比如,这些模型只能从训练数据中学习,这些数据往往过时或不造用于特定的应用。此外,它们的能力仅限于文本生成。我们还发现,LLM不适应于…

人工智能深度学习系列—深度学习中的边界框回归新贵:GHM(Generalized Histogram Loss)全解析

文章目录 1. 背景介绍2. Loss计算公式3. 使用场景4. 代码样例5. 总结 1. 背景介绍 目标检测作为计算机视觉领域的核心技术之一,其精确度的提升一直是研究者们追求的目标。边界框回归作为目标检测中的关键步骤,其性能直接影响到检测的准确性。本文将详细…

“火炬科企对接”先进计算产业推进会 | 麒麟信安受邀参加,并签署开源生态合作协议

7月30日,“火炬科企对接”先进计算产业推进会在长沙隆重召开。大会由工业和信息化部火炬高技术产业开发中心、湖南省科学技术厅、湖南省工业和信息化厅、湖南湘江新区管理委员会、中国邮政储蓄银行联合举办。麒麟信安与来自国内先进计算领域的专家学者,2…

25考研数据结构复习·7.3树形查找

目录 二叉排序树 平衡二叉树 平衡二叉树的删除 红黑树 红黑树的插入 红黑树的删除 二叉排序树 二叉排序树的定义 &#x1f469;‍&#x1f4bb; 左子树结点值 < 根节点值 < 右子树结点值默认不允许两个结点的关键字相同查找操作 从根节点开始&#xff0c;目标值更…

用 VS Code 开发 uni-app 项目

文章目录 1.为什么选择 VS Code &#xff1f;2.安装相关插件2.1 安装uni-app插件2.2 安装ts类型检验 3.在微信小程序中运行 1.为什么选择 VS Code &#xff1f; ⚫ HbuilderX 对 TS 类型支持暂不完善 ⚫ VS Code 对 TS 类型支持友好&#xff0c;同时VS Code 也是我们熟悉的编辑…

移远通信LTE-A模组EM060K-GL成为ChromeOS准入供应商

近日&#xff0c;全球领先的物联网整体解决方案移远通信宣布&#xff0c;其先进的LTE-A模组EM060K-GL已进入谷歌Chrome OS准入供应商名录&#xff0c;后续将作为候选模组用于搭载Chrome OS系统的笔记本电脑中&#xff0c;为其提供“始终在线”的网络连接体验。这一重要里程碑彰…

禾川Q1系列PLC通过ModbusRtu控制E600变频器

一、新建CodeSys工程项目 新建工程可以选择【File】→【New Project】,也可以直接选择【New Project】两种方式 用户可以选择需要的项目类型,命名项目工程以及存储路径,完成后选择【OK】 选择连接设备【HCQ1-1300-D】(在此之前PC已经安装Q1安装包),选择编程语言,教程示例…

Node.js(4)——模块化

什么是模块化&#xff1f; ComminJS模块是为Node.js打包JavaScript代码的原始方式。Node.js还支持浏览器和其他JavaScript运行时使用的ECMAScript标准。在Node.js中&#xff0c;每个文件都被视为一个单独的模块。 CommonJS标准 使用&#xff1a; 导出&#xff1a;moudule.exp…

一六零、云服务器开发机配置zsh

切换shell 在Linux中默认使用/bin/bash&#xff0c;在用户创建时&#xff0c;会自动给用户创建用户默认的shell。默认的shell就是/bin/bash。要修改shell将其设置为/bin/ksh&#xff0c;有两种方法方法 # 方法一: chsh -s /bin/ksh chsh -s /bin/zsh # 方法二: usermod -s /b…

基于CIFAR10的图片识别

前言 这个算是重拾一个古早项目了&#xff0c;当时搭建神经网络对CIFAR10数据集进行训练以后&#xff0c;对训练好的网络进行了验证&#xff0c;可以参考这笔者的两篇博客&#xff1a; pytorch 模型训练&#xff08;以CIFAR10数据集为例&#xff09;_pytorch cifar10-CSDN博客…

CAPL使用结构体的方式组装一条DoIP车辆声明消息(方法2)

在文章CAPL使用结构体的方式组装一条DoIP车辆声明消息(方法1)中,我们声明一个结构体DoIPMessage表示完整的DoIP车辆声明消息: 上半部分是DoIP报头通用部分(也就是所有类型的DoIP消息都有的),而payload是每个类型的DoIP消息独有的部分,对于车辆声明消息来说,用另一个结…

Golang | Leetcode Golang题解之第309题买卖股票的最佳时机含冷冻期

题目&#xff1a; 题解&#xff1a; func maxProfit(prices []int) int {if len(prices) 0 {return 0}n : len(prices)f0, f1, f2 : -prices[0], 0, 0for i : 1; i < n; i {newf0 : max(f0, f2 - prices[i])newf1 : f0 prices[i]newf2 : max(f1, f2)f0, f1, f2 newf0, n…

【划分字母区间】python刷题记录

R3-贪心篇. 思路&#xff1a; 1.使用dict记录S中每个字符出现的最后位置 2.从s[0]开始&#xff0c;j该元素的dict值&#xff0c;遍历s&#xff0c;如果出现s[i]>j&#xff0c;就需要更新j的值 3.i到j了&#xff0c;那就下一段 class Solution:def partitionLabels(self,…

「Unity3D」自动布局LayoutElement、ContentSizeFitter、AspectRatioFitter、GridLayoutGroup

布局元素与布局控制器 布局元素实现ILayoutElement接口&#xff0c;布局控制器实现ILayoutController接口&#xff0c;后者根据前者的属性控制具体布局——有些布局控制器也是布局元素&#xff0c;即同时实现这两个接口&#xff0c;如LayoutGroup。 public interface ILayout…

【原创教程】电气电工:电烙铁的使用方法(入门)

今天我们深入了解电烙铁的相关知识及其应用。电烙铁作为电气电工行业中的重要工具&#xff0c;它在焊接和电路维修等方面扮演着不可或缺的角色。接下来&#xff0c;我们将一起探索电烙铁的奥秘。 一、电烙铁概述 电烙铁是一种通过电能转化为热能进行焊接的工具。它具有体积小…

jenkins服务器重启,构建记录消失

1、进入系统管理查看系统运行日志&#xff0c;发现报保存构建日志失败 jenkins module java.base does not "opens java.lang.ref" to unnamed module 5276d6ee Java平台模块系统对类的可见性和访问权限进行了严格的控制。在Java 9及以上版本中&#xff0c;java.la…

武汉流星汇聚:深耕跨境电商,万企信赖之选,共绘全球贸易新蓝图

在全球化浪潮汹涌的今天&#xff0c;跨境电商作为连接世界经济的桥梁&#xff0c;正以前所未有的速度改变着国际贸易的格局。在这场充满机遇的旅途中&#xff0c;武汉流星汇聚电子商务有限公司犹如一颗璀璨的流星&#xff0c;划破长空&#xff0c;以其卓越的实力和不懈的努力&a…

JetBrains:XML tag has empty body警告

在xml文件中配置时&#xff0c;因为标签内容为空&#xff0c;出现黄色警告影响观感。 通过IDE配置关闭告警

编程语言|Python——为什么0.1+0.2≠0.3(深入理解Python中的浮点数运算)

一、问题描述 技术面的时候被问到一个python问题,即当我们输入0.1+0.2时,打印出来的却不是0.3,而是0.30000000000000004,为什么? 其实不仅是Python,很多编程语言例如C、Java、JavaScript等等都有这种特性。原理很简单,所有数的运算在计算机中都是进行二进制计算的,十进…

RS485 转 Lora 模块

一、功能概述 本产品是一款无线中继器&#xff0c;将 RS485 信号转为无线信号&#xff0c;通过 无线方式远传&#xff0c;实现远程通信功能。采用 Lora无线通信技术&#xff0c;工作 中心频率 433M &#xff0c;空旷传输距离 7000 米。 二、接线、配置方法、指示灯状态 1 、…