【算法系列 | 10】深入解析查找算法之—线性查找_线性查找 时间复杂度-程序员宅基地

技术标签: 算法  线性查找算法  散列表  赠书活动  算法系列  数据结构  Python  

序言

心若有阳光,你便会看见这个世界有那么多美好值得期待和向往。

决定开一个算法专栏,希望能帮助大家很好的了解算法。主要深入解析每个算法,从概念到示例。

我们一起努力,成为更好的自己!

今天第10讲,讲一下查找算法的线性查找算法

1 基础介绍

查找算法是计算机科学中的一类算法,用于在数据集中寻找特定值或数据项。

其目标是确定数据是否存在于给定的数据结构中,并找到数据项的位置(索引)或其他相关信息。

不同的查找算法适用于不同类型的数据结构,数据有序性,以及数据规模。以下是一些常见的查找算法

以下是一些常见的查找算法及其应用场景:

  1. 布隆过滤器(Bloom Filter):适用于判断一个元素是否存在于一个大规模的数据集中,时间复杂度为O(1),但有一定的误判率。
  2. 二分查找(Binary Search):适用于有序数组中查找元素,时间复杂度为O(log n);
  3. 哈希表查找(Hash Table):适用于快速查找和插入元素,时间复杂度为O(1),但需要额外的存储空间;
  4. 线性查找(Linear Search):适用于无序数组中查找元素,时间复杂度为O(n);
  5. 插值查找(Interpolation Search):适用于有序数组中查找元素,时间复杂度为O(log log n),但是对于分布不均匀的数据集效果不佳;
  6. 斐波那契查找(Fibonacci Search):适用于有序数组中查找元素,时间复杂度为O(log n),但需要额外的存储空间;
  7. 树表查找(Tree Search):适用于快速查找和插入元素,时间复杂度为O(log n),但需要额外的存储空间;
  8. B树查找(B-Tree):适用于大规模数据存储和查找,时间复杂度为O(log n),但需要额外的存储空间;

一、线性查找算法介绍

线性查找算法,也被称为顺序查找算法,是一种简单的搜索算法,用于在一个元素集合中查找特定元素的位置或确定特定元素是否存在。

它的操作非常直观,它从集合的第一个元素开始,逐一检查每个元素,直到找到目标元素或者遍历整个集合为止

1.1 原理介绍

以下是线性查找算法的详细步骤和原理:

  1. 初始化:首先,从集合的第一个元素开始搜索。通常,你会使用一个索引或指针来跟踪当前查找的位置,将其初始化为0(对于数组或列表)或集合的起始位置。

  2. 遍历:在遍历过程中,算法将当前位置的元素与目标元素进行比较。如果当前元素与目标元素相匹配,算法会返回当前位置的索引(或其他位置信息),表示找到了目标元素。

  3. 比较:如果当前元素不与目标元素匹配,算法将继续移动到下一个元素,更新当前位置的索引,然后重复比较的步骤,直到找到目标元素或者遍历整个集合。

  4. 结束条件:线性查找算法将一直进行直到发生以下两种情况之一:

    • 找到目标元素,返回目标元素的位置。
    • 遍历整个集合,没有找到目标元素,此时算法返回一个指示未找到的值,通常是一个特殊值(例如-1)。

假设我们有一个数组:

[10, 5, 8, 2, 7, 3]

我们要查找目标元素2。

1. 从数组的第一个元素开始,即10。

[10, 5, 8, 2, 7, 3]
 ^

2. 检查当前元素是否等于目标元素2。不匹配,继续向右移动。

[10, 5, 8, 2, 7, 3]
     ^

3 继续比较。

[10, 5, 8, 2, 7, 3]
        ^

4 比较当前元素和目标元素。

[10, 5, 8, 2, 7, 3]
           ^

 5 找到匹配的元素(2等于2),算法结束。

[10, 5, 8, 2, 7, 3]
           ^

这个步骤描述了线性查找的原理,即从数组的第一个元素开始,逐一比较元素,直到找到目标元素或者遍历整个数组。如果找到目标元素,算法停止并返回其位置。 

1.2 优缺点

线性查找算法,也称为顺序查找,是一种简单的搜索算法,它的原理是逐一比较元素,直到找到目标元素或者遍历整个数据集。

优点:

  1. 简单易懂 线性查找是一种非常直观的算法,易于理解和实现。它不涉及复杂的数学或逻辑,因此适用于初学者。

  2. 适用于小型数据集 在小型数据集中,线性查找通常表现出较高的效率。由于数据集较小,它不会带来显著的性能损失。

  3. 无序数据集 线性查找不依赖于数据的顺序,可以在无序数据集中执行查找操作。这与其他一些算法,如二分查找,不同,后者要求数据集是有序的。

缺点:

  1. 低效率 线性查找的时间复杂度是O(n),其中n是数据集中的元素数量。在大型数据集中,它需要遍历整个数据集,因此效率较低。对于大型数据集,它可能不是最佳选择。

  2. 性能不稳定 线性查找的性能受数据集中目标元素的位置影响。如果目标元素位于数据集的开头,算法会很快找到,但如果目标元素位于数据集的末尾,它将需要遍历整个数据集才能找到。

  3. 不适合有序数据 对于有序数据,更高效的算法如二分查找可以提供更快的查找速度。线性查找不充分利用数据的有序性。

  4. 不适用于大型数据集 在大型数据集中,线性查找的性能可能会变得非常糟糕,因为它需要花费较长的时间来查找目标元素。

拓展:

什么是小型数据集

 以下是一些一般性的观点来描述小型数据集:

  1. 元素数量较少 小型数据集通常包含的元素数量在几十到几千之间。例如,一个包含20个学生成绩的列表可以被认为是一个小型数据集。

  2. 易于手动处理 小型数据集通常足够小,以至于人们可以轻松地手动处理和分析数据,而无需借助复杂的算法或工具。

  3. 内存占用较小 小型数据集在计算机内存中占用的空间相对较少,因此不会导致内存问题或性能瓶颈。

  4. 适合简单算法 小型数据集通常适合使用简单的搜索算法,如线性查找,因为这些算法的性能在小规模数据集上通常是可以接受的。

需要注意的是,"小型数据集" 的界定可能因领域和具体应用而异

对于某些领域,包含数千个元素的数据集可能被视为小型,而在其他领域,可能需要包含数百万个元素才能算作小型数据集。

因此,了解具体应用的背景和需求对于确定数据集是否属于小型数据集非常重要。

1.3 复杂度

下面详细介绍线性查找算法的时间复杂度和空间复杂度:

时间复杂度:

线性查找算法的时间复杂度是O(n),其中n是数据集中元素的数量。这意味着算法的运行时间与数据集的大小成正比。

线性查找算法的原理是逐一比较元素,直到找到目标元素或者遍历整个数据集。

在最坏情况下,目标元素可能位于数据集的最后一个位置,这就需要遍历整个数据集,因此时间复杂度是O(n)

线性查找的时间复杂度对于小型数据集来说是可接受的,但对于大型数据集,它的效率较低。

在这种情况下,更高效的搜索算法,如二分查找或哈希查找,可能更为合适。

空间复杂度:

线性查找算法的空间复杂度很低,通常为O(1)。这是因为算法只需要几个额外的变量,如索引或指针,来跟踪当前查找的位置,而不需要额外的数据结构或内存分配。

线性查找的空间复杂度是固定的,与数据集的大小无关。这使得它在空间受限的环境下非常适用,因为它不会消耗大量内存。

总结:线性查找算法的时间复杂度是O(n),其中n是数据集中的元素数量,而空间复杂度通常为O(1)

虽然它在小型数据集中适用,但在大型数据集或需要快速查找的情况下,更高效的算法可能更合适。

1.4 使用场景

线性查找算法虽然不是最高效的搜索算法,但在某些情况下仍然有其应用场景。

以下是一些适合使用线性查找算法的场景:

  1. 小型数据集 当数据集较小且规模不大时,线性查找算法是一种简单且有效的选择。它不涉及复杂的计算或排序,适用于小型列表、数组或集合。

  2. 无序数据集 线性查找不需要数据集是有序的,因此它适用于无序数据集。如果数据没有排序或不需要排序,线性查找可以满足需求。

  3. 简单实现需求 线性查找算法非常容易实现,不需要额外的数据结构或算法复杂性。这使得它在教学和初学者入门算法时很有用。

  4. 寻找多个匹配项 线性查找不仅可以找到第一个匹配项,还可以找到所有匹配项。如果需要查找多个匹配项的位置,线性查找是一个不错的选择。

  5. 实时数据 在实时数据流中,数据通常是无序的,且数据集相对较小。线性查找可用于快速查找实时数据流中的特定元素。

  6. 数据有序度低 即使数据集较大,如果数据的有序度很低,例如在某些情况下数据可能已被打乱,线性查找可以是一种可行的选择。

二、代码实现

2.1 Java代码实现

以下是一个简单的Java代码示例,用于实现线性查找算法

2.1.1 代码示例

public class LinearSearch {

    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[] arr = {10, 5, 8, 2, 7, 3};
        int target = 2;

        int result = linearSearch(arr, target);

        if (result != -1) {
            System.out.println("目标元素 " + target + " 在索引 " + result + " 处找到。");
        } else {
            System.out.println("目标元素 " + target + " 未找到。");
        }
    }
}

2.1.2 代码讲解

代码内容说明:

  • linearSearch 方法接受一个整数数组 arr 和一个目标整数 target 作为参数,然后使用线性查找算法在数组中查找目标元素。
  • linearSearch 方法中,使用 for 循环逐一比较数组中的元素,如果找到目标元素,返回该元素的索引,否则返回-1表示未找到。
  • main 方法用于演示线性查找的使用。创建一个示例数组 arr 和一个目标值 target,然后调用 linearSearch 方法来查找目标值。根据查找结果输出相应的消息。

2.1.3 运行结果

在这个示例中,目标元素是2,它在数组中的索引为3。因此,运行上述代码的结果将是:

目标元素 2 在索引 3 处找到。

线性查找算法成功找到了目标元素,并返回了其索引。

如果目标元素不存在于数组中,输出将是 "目标元素 2 未找到。" 表示未找到目标元素 

2.2 Python代码实现

以下是一个使用Python实现的线性查找算法的示例

2.2.1 代码示例

def linear_search(arr, target):
    for i in range(len(arr)):
        if arr[i] == target:
            return i  # 找到目标元素,返回索引
    return -1  # 未找到目标元素

# 示例数据和目标元素
arr = [10, 5, 8, 2, 7, 3]
target = 2

result = linear_search(arr, target)

if result != -1:
    print(f"目标元素 {target} 在索引 {result} 处找到。")
else:
    print(f"目标元素 {target} 未找到。")

2.2.2 代码讲解

代码内容说明:

  • linear_search 函数接受一个整数列表 arr 和一个目标整数 target 作为参数,然后使用线性查找算法在列表中查找目标元素。
  • linear_search 函数中,使用 for 循环逐一比较列表中的元素,如果找到目标元素,返回该元素的索引,否则返回-1表示未找到。
  • 示例数据包含一个整数列表 arr 和一个目标值 target,然后调用 linear_search 函数来查找目标值。根据查找结果输出相应的消息。

2.2.3 运行结果

目标元素是2,它在列表中的索引为3。因此,运行上述Python代码的结果是:

目标元素 2 在索引 3 处找到。

三、总结

综合来看,线性查找是一个简单但不够高效的搜索算法。它适用于小型数据集或无序数据集,但对于大型数据集,特别是有序数据,其他更高效的搜索算法通常更为合适。

线性查找在教学和理解算法的概念方面具有价值,但在实际应用中,通常需要考虑更快速的算法。

在大型数据集中或需要频繁搜索的情况下,更高效的搜索算法,如二分查找、哈希查找或树结构,通常更为合适。在选择搜索算法时,应根据数据集的规模、有序性和性能需求来权衡不同算法的优劣。 

四、图书推荐

4.1 图书名称

《Python数据分析从入门到精通》

4.2 图书介绍

《Python数据分析从入门到精通》全面介绍了使用Python进行数据分析所必需的各项知识。全书共分为14章,包括了解数据分析、搭建Python数据分析环境、Pandas统计分析、Matplotlib可视化数据分析图表、Seaborn可视化数据分析图表、第三方可视化数据分析图表Pyecharts、图解数组计算模块NumPy、数据统计分析案例、机器学习库Scikit-Learn、注册用户分析(MySQL版)、电商销售数据分析与预测、二手房房价分析与预测,以及客户价值分析。
  该书所有示例、案例和实战项目都提供源码,另外该书的服务网站提供了模块库、案例库、题库、素材库、答疑服务,力求为读者打造一本“基础入门+应用开发+项目实战”一体化的Python数据分析图书。
  《Python数据分析从入门到精通》内容详尽,图文丰富,非常适合作为数据分析人员的学习参考用书,也可作为想拓展数据分析技能的普通职场人员和Python开发人员学习参考用书。

等不及的小伙伴,可以点击下方链接先睹为快:

《Python数据分析从入门到精通》

4.3 参与方式

图书数量:本次送出 2 本   !!!️️️
活动时间:截止到 2023-10-17 12:00:00

抽奖方式:

  • 评论区随机抽取小伙伴!

留言内容,以下方式都可以:

  • 根据文章内容进行高质量评论

参与方式:关注博主、点赞、收藏,评论区留言 

4.4 中奖名单

获奖名单

 中奖名单:请关注博主动态

名单公布时间:2023-10-17 下午

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_36755535/article/details/133796411

智能推荐

5个超厉害的资源搜索网站,每一款都可以让你的资源满满!_最全资源搜索引擎-程序员宅基地

文章浏览阅读1.6w次,点赞8次,收藏41次。生活中我们无时不刻不都要在网站搜索资源,但就是缺少一个趁手的资源搜索网站,如果有一个比较好的资源搜索网站可以帮助我们节省一大半时间!今天小编在这里为大家分享5款超厉害的资源搜索网站,每一款都可以让你的资源丰富精彩!网盘传奇一款最有效的网盘资源搜索网站你还在为找网站里面的资源而烦恼找不到什么合适的工具而烦恼吗?这款网站传奇网站汇聚了4853w个资源,并且它每一天都会持续更新资源;..._最全资源搜索引擎

Book类的设计(Java)_6-1 book类的设计java-程序员宅基地

文章浏览阅读4.5k次,点赞5次,收藏18次。阅读测试程序,设计一个Book类。函数接口定义:class Book{}该类有 四个私有属性 分别是 书籍名称、 价格、 作者、 出版年份,以及相应的set 与get方法;该类有一个含有四个参数的构造方法,这四个参数依次是 书籍名称、 价格、 作者、 出版年份 。裁判测试程序样例:import java.util.*;public class Main { public static void main(String[] args) { List <Book>_6-1 book类的设计java

基于微信小程序的校园导航小程序设计与实现_校园导航微信小程序系统的设计与实现-程序员宅基地

文章浏览阅读613次,点赞28次,收藏27次。相比于以前的传统手工管理方式,智能化的管理方式可以大幅降低学校的运营人员成本,实现了校园导航的标准化、制度化、程序化的管理,有效地防止了校园导航的随意管理,提高了信息的处理速度和精确度,能够及时、准确地查询和修正建筑速看等信息。课题主要采用微信小程序、SpringBoot架构技术,前端以小程序页面呈现给学生,结合后台java语言使页面更加完善,后台使用MySQL数据库进行数据存储。微信小程序主要包括学生信息、校园简介、建筑速看、系统信息等功能,从而实现智能化的管理方式,提高工作效率。

有状态和无状态登录

传统上用户登陆状态会以 Session 的形式保存在服务器上,而 Session ID 则保存在前端的 Cookie 中;而使用 JWT 以后,用户的认证信息将会以 Token 的形式保存在前端,服务器不需要保存任何的用户状态,这也就是为什么 JWT 被称为无状态登陆的原因,无状态登陆最大的优势就是完美支持分布式部署,可以使用一个 Token 发送给不同的服务器,而所有的服务器都会返回同样的结果。有状态和无状态最大的区别就是服务端会不会保存客户端的信息。

九大角度全方位对比Android、iOS开发_ios 开发角度-程序员宅基地

文章浏览阅读784次。发表于10小时前| 2674次阅读| 来源TechCrunch| 19 条评论| 作者Jon EvansiOSAndroid应用开发产品编程语言JavaObjective-C摘要:即便Android市场份额已经超过80%,对于开发者来说,使用哪一个平台做开发仍然很难选择。本文从开发环境、配置、UX设计、语言、API、网络、分享、碎片化、发布等九个方面把Android和iOS_ios 开发角度

搜索引擎的发展历史

搜索引擎的发展历史可以追溯到20世纪90年代初,随着互联网的快速发展和信息量的急剧增加,人们开始感受到了获取和管理信息的挑战。这些阶段展示了搜索引擎在技术和商业模式上的不断演进,以满足用户对信息获取的不断增长的需求。

随便推点

控制对象的特性_控制对象特性-程序员宅基地

文章浏览阅读990次。对象特性是指控制对象的输出参数和输入参数之间的相互作用规律。放大系数K描述控制对象特性的静态特性参数。它的意义是:输出量的变化量和输入量的变化量之比。时间常数T当输入量发生变化后,所引起输出量变化的快慢。(动态参数) ..._控制对象特性

FRP搭建内网穿透(亲测有效)_locyanfrp-程序员宅基地

文章浏览阅读5.7w次,点赞50次,收藏276次。FRP搭建内网穿透1.概述:frp可以通过有公网IP的的服务器将内网的主机暴露给互联网,从而实现通过外网能直接访问到内网主机;frp有服务端和客户端,服务端需要装在有公网ip的服务器上,客户端装在内网主机上。2.简单的图解:3.准备工作:1.一个域名(www.test.xyz)2.一台有公网IP的服务器(阿里云、腾讯云等都行)3.一台内网主机4.下载frp,选择适合的版本下载解压如下:我这里服务器端和客户端都放在了/usr/local/frp/目录下4.执行命令# 服务器端给执_locyanfrp

UVA 12534 - Binary Matrix 2 (网络流‘最小费用最大流’ZKW)_uva12534-程序员宅基地

文章浏览阅读687次。题目:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=93745#problem/A题意:给出r*c的01矩阵,可以翻转格子使得0表成1,1变成0,求出最小的步数使得每一行中1的个数相等,每一列中1的个数相等。思路:网络流。容量可以保证每一行和每一列的1的个数相等,费用可以算出最小步数。行向列建边,如果该格子是_uva12534

免费SSL证书_csdn alphassl免费申请-程序员宅基地

文章浏览阅读504次。1、Let's Encrypt 90天,支持泛域名2、Buypass:https://www.buypass.com/ssl/resources/go-ssl-technical-specification6个月,单域名3、AlwaysOnSLL:https://alwaysonssl.com/ 1年,单域名 可参考蜗牛(wn789)4、TrustAsia5、Alpha..._csdn alphassl免费申请

测试算法的性能(以选择排序为例)_算法性能测试-程序员宅基地

文章浏览阅读1.6k次。测试算法的性能 很多时候我们需要对算法的性能进行测试,最简单的方式是看算法在特定的数据集上的执行时间,简单的测试算法性能的函数实现见testSort()。【思想】:用clock_t计算某排序算法所需的时间,(endTime - startTime)/ CLOCKS_PER_SEC来表示执行了多少秒。【关于宏CLOCKS_PER_SEC】:以下摘自百度百科,“CLOCKS_PE_算法性能测试

Lane Detection_lanedetectionlite-程序员宅基地

文章浏览阅读1.2k次。fromhttps://towardsdatascience.com/finding-lane-lines-simple-pipeline-for-lane-detection-d02b62e7572bIdentifying lanes of the road is very common task that human driver performs. This is important ..._lanedetectionlite

推荐文章

热门文章

相关标签