首页 > 编程语言 >算法-01-查找

算法-01-查找

时间:2023-08-01 23:56:32浏览次数:31  
标签:01 int 索引 算法 查找 Student data public

线性搜索法(Linear Search)

线性搜索(Linear Search)算法又称为循序搜索(Sequential Search)算法,是学习编程语言最先需要学会的搜索算法。

它可以按照元素在集合中的顺序,从头开始进行走访,并连续判断目前走访到的元素是否是我们想要找的元素。

 

线性搜索法(Linear Search)

线性搜索法的概念

线性搜索法是以土法炼钢的方式走访集合中的每个元素,并在每次迭代时去判断目前走访到的元素是否正是我们想要找的元素。

线性搜索法在任何场合下都可以使用,不需要去在乎集合中的元素顺序。然而虽然它直觉又方便,但它通常不会是一个很有效率的搜索方法。

线性搜索法的过程

前面有提到线性搜索法可以用在任何场合,这边就以无排序的整数数组来举例吧!假设现在有个整数数组,内容如下:

索引    0   1   2   3   4   5   6   7   8
数值    9   8   3   3   9   2   4   6   3

若要用线性搜索法来找到元素6,那就从数组的索引0开始,判断索引0的元素是否是6,如果不是的话就继续判断下一个索引的元素值。

直到找到我们要找的元素值,也就是6后才停止。如果已经走访到数组结尾了,却都没有发现元素值6的话,表示6并不存在于这个数组之中。

 

       ●
索引    0   1   2   3   4   5   6   7   8
数值    9   8   3   3   9   2   4   6   3
     6 != 9

           ●
索引    0   1   2   3   4   5   6   7   8
数值    9   8   3   3   9   2   4   6   3
         6 != 8

               ●
索引    0   1   2   3   4   5   6   7   8
数值    9   8   3   3   9   2   4   6   3
             6 != 3

                   ●
索引    0   1   2   3   4   5   6   7   8
数值    9   8   3   3   9   2   4   6   3
                 6 != 3

                       ●
索引    0   1   2   3   4   5   6   7   8
数值    9   8   3   3   9   2   4   6   3
                     6 != 9

                           ●
索引    0   1   2   3   4   5   6   7   8
数值    9   8   3   3   9   2   4   6   3
                         6 != 2

                               ●
索引    0   1   2   3   4   5   6   7   8
数值    9   8   3   3   9   2   4   6   3
                             6 != 4

                                   ●
索引    0   1   2   3   4   5   6   7   8
数值    9   8   3   3   9   2   4   6   3
                                 6 == 6



 

 

1.什么是算法

一系列解决问题的,清晰,可执行的计算机指令。

2.算法的五大特性

  1. 有限性
  2. 确定性:不会产生二义性
  3. 可行性
  4. 输入
  5. 输出

3.线性查找法

**定义:**线性查找又称顺序查找,是一种最简单的查找方法,它的基本思想是从第一个记录开始,逐个比较记录的关键字,

直到和给定的K值相等,则查找成功;若比较结果与文件中n个记录的关键字都不等,则查找失败

**举例:**在data数组中查找16

从数组的第一个元素24开始查找,直到找到16,返回其索引4,如果没有找到,则返回-1。

 

4.实现线性查找法

创建一个LinearSearch类,里面定义静态search()方法,把空参构造声明为私有的,避免外部使用new创建该对象。

public class LinearSearch {

    private LinearSearch() {};
  
		/**
     * 如果查询到目标元素,则返回目标元素所在的索引;查询不到,返回-1
     * @param data 元数据数组
     * @param target 查询目标元素
     * @return
     */
    public static int search(int[] data, int target) {
        for (int i = 0; i < data.length; i++) {
            if (data[i] == target) {
                return i;
            }
        }
        return -1;
    }

    public static void main(String[] args) {

        int[] data = {24, 18, 12, 9, 16, 66, 32, 4};
				//查找data数组里为16的
        int res = LinearSearch.search(data, 16);
        System.out.println(res);
				//查找data数组里为999的
        int res2 = LinearSearch.search(data, 999);
        System.out.println(res2);
    }
}
 

5.使用泛型

用户的数据类型可能是千奇百怪的,有可能是字符型、chat类型、浮点型,也有可能是用户自己设计的一个类,比如说的Student类,在Student数组中查找某一个相应的学生,那么这些需求呢,我们现在的这个线性查找算法LinearSearch中的search()方法 ,都是无法满足的,接下来我们就要使用泛型解决这个问题。

使用泛型需要注意的地方:不可以是基本数据类型,只能是类对象

现在的泛型是类对象,我们要把if (data[i] == target)修改成if (data[i].equals(target)),因为==判断的是引用相等,而equals判断的是值相等。

public class LinearSearch {

    private LinearSearch() {};

    /**
     * 如果查询到目标元素,则返回目标元素所在的索引;查询不到,返回-1
     * @param data 元数据数组
     * @param target 查询目标元素
     * @return
     */
    public static <E> int search(E[] data, E target) {
        for (int i = 0; i < data.length; i++) {
            if (data[i].equals(target)) {
                return i;
            }
        }
        return -1;
    }

    public static void main(String[] args) {

        Integer[] data = {24, 18, 12, 9, 16, 66, 32, 4};

        int res = LinearSearch.search(data, 16);
        System.out.println(res);

        int res2 = LinearSearch.search(data, 999);
        System.out.println(res2);
    }
}
 

6.使用自定义类测试我们的算法

定义一个Student类,里面有个name属性,一个全参构造,然后重写equals()方法,实现自己的比较逻辑。

public class Student {

    private String name;

    public Student(String name) {
        this.name = name;
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    @Override
    public boolean equals(Object o) {
        if (this == o)
            return true;

        if (o == null)
            return false;

        if (this.getClass() != o.getClass())
            return false;

        Student student = (Student) o;
        return this.name.equals(student.name);
    }

}
 

在main函数中使用这个类来测试线性查找法。

public static void main(String[] args) {
  
        Student[] students = {new Student("zzm"), new Student("zhangsan"), new Student("lisi")};
        Student zzm = new Student("zzm");
        int res3 = LinearSearch.search(students, zzm);
        System.out.println(res3);
    }
 

7.循环不变量

 

标签:01,int,索引,算法,查找,Student,data,public
From: https://www.cnblogs.com/jenny-jenny/p/17599462.html

相关文章

  • 基于ResNet-101深度学习网络的图像目标识别算法matlab仿真
    1.算法理论概述       介绍ResNet-101的基本原理和数学模型,并解释其在图像识别中的优势。然后,我们将详细介绍如何使用深度学习框架实现ResNet-101,并在图像数据集上进行训练和测试。最后,我们将总结本文的主要内容并提出进一步的研究方向。 1.1、ResNet-101的基本原理......
  • 0801数论
    GCD&exGCD首先我们考虑辗转相除法的过程,因为\((a,b)=(b\bmoda,a)(0<a<b)\),\((0,b)=b\),所以我们就可以每次将\(b\)转化为严格更小的\(b\)的问题。归纳则得到答案。现在我们考虑扩欧的过程,我们需要对\(ax+by=1\)找到一组解。那么我们实际上就是要对一个形如\((a,b)\)......
  • 20230801
    前文:离散概率论2概率密度函数我们已经了解了基本离散概率论,可对于一个连续型随机变量。比如在R上取值,这个时候我们就需要概率密度函数。我们先拿一个经典的正态分布图像:显然任意类似于P(x=1)的值都是0,但我们可以研究X在某一个区间上的概率了,比如:可概率密度函数怎样体现概率......
  • 代码随想录算法训练营第四十一天| 1143.最长公共子序列 1035.不相交的线 53. 最大
    1143.最长公共子序列  要求:可以跳过,找出来最长符合的节点难点:如何跳过了之后仍然保留之前的值思路:如果不符,并不是dp[i-1][j-2]等于之前的值,而是dp[i][j]等于它的相关节点以上很重要代码:1//要求:两个子数组,可以删减跳过,找出最长的长度2//思路:dp[n][m]代表第......
  • 算法 | 就地逆置、双指针快速寻找中间节点
    2019年真题设线性表L=(a1,a2,a3,...,an-2,an-1,an)采用带头节点的单链表保存,链表中的结点定义如下:(代码1)设计一个空间复杂度为O(1)且时间上尽可能高效的算法,重新排列L中的各结,得到线性表L’=(a1,an,a2,an-1,a3,an-2,...)。//代码1//langCtypedefstr......
  • python 灰世界白平衡算法
    白平衡是图像处理比较常见的一个概念,在采集图像的过程中,相机的感光元件或者镜头会对原始色彩造成影响,而白平衡技术通常可以用来校正这种光线和镜头对颜色影响。灰度世界算法(GrayWorld)假设认为,一幅彩色图像中,RGB三个通道的颜色平均值是趋于同一个灰度值K的,所以如果当前的通道的......
  • 什么是算法复杂度?
    算法复杂度(AlgorithmComplexity)是衡量算法性能的度量标准。它描述了算法在输入规模增大时,所需的计算资源(例如时间和空间)的增长情况。算法复杂度通常用"大O符号"(BigOnotation)来表示,用来描述算法在最坏情况下的增长速度。在算法复杂度的表示中,我们关注的是算法执行所需的基本操......
  • 不忘初心 Windows11 Insider Preview 25915.1000 Canary预览版 无更新 纯净精简 2023.
    此版不能更新补丁,并开启按流量计费,此版保留Hyper和linux,让人期待的任务栏图标从不合并功能此版已经回归,母版来自UUPWindows11InsiderPreview25915.1000Canary频道预览版,本版本自动跳过硬件检测,优化后台进程和服务,精简一些日常不常用的组件,速度和性能比原版更胜一筹,为了保证稳......
  • 文心一言 VS 讯飞星火 VS chatgpt (69)-- 算法导论6.5 8题
    八、HEAP-DELETE(A,i)操作能够将结点i从堆A中删除。对于一个包含n个元素的堆,请设计一个能够在O(lgn)时间内完成的HEAP-DELETE操作。文心一言:要在O(logn)时间内完成HEAP-DELETE操作,可以使用以下方法:1.首先找到要删除的节点i的父节点。可以从根节点开始,依次向上遍历,直......
  • 2017年考研英语二作文真题
      Asisshownintheabovechart,from2013to2015boththenumberofvistorsandmuseumsinourcountryhasincreased.Whataccountsfortherapidgrowthofmuseumvisitors?Iguessthereareprimarilytworeasons.Ontheonehand,asoureconomyisth......