数据结构与算法——线性查找法

news2025/1/24 22:30:39

个人简介

👀个人主页: 前端杂货铺
🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展
📃个人状态: 研发工程师,现效力于中国工业软件事业
🚀人生格言: 积跬步至千里,积小流成江海
🥇推荐学习:🍍前端面试宝典 🍉Vue2 🍋Vue3🥭Java基础 🍓Vue2/3项目实战 🥝Node.js🍒Three.js 🍖JS版算法
🌕个人推广:每篇文章最下方都有加入方式,旨在交流学习&资源分享,快加入进来吧

文章目录

    • 一、线性查找法
    • 二、使用泛型
    • 三、使用自定义类
    • 本篇小结


一、线性查找法

基本概念:线性查找又称顺序查找,是一种最简单的查找方法,它的基本思想是 从第一个记录开始,逐个比较记录的关键字,直到和给定的 K 值相等,则查找成功;若比较结果与文件中 n 个记录的关键字都不等,则查找失败

例如:我们想在 data 数组中查找 16,那么我们可以使用线性查找法进行逐一查找

在这里插入图片描述

代码实现:

我们把 LinearSearch 的构造函数声明为私有的,这样在其他类中就无法调用LinearSearch。我们把 search 函数定义为静态的,这样就不需要进行实例化,而是直接通过类来调用

我们通过 for 循环遍历 data 数组,当 data 数组的索引 i 对应的值等于我们的目标值 target 时,就返回得到的索引位置,否则返回 -1

public class LinearSearch {
    private LinearSearch() {}
    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};

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

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

在这里插入图片描述


二、使用泛型

上面的实现方式只是针对于 int 类型,如果我们想针对各种类型就可以使用泛型来实现

但要注意,在使用泛型时,不能存放基本数据类型,只能存放类对象

扩展:

  • equals():用来检测两个对象是否相等,即两个对象的内容是否相等
  • ==:用于比较引用和比较基本数据类型时具有不同的功能
    • (1)、基础数据类型:比较的是他们的值是否相等,比如两个int类型的变量,比较的是变量的值是否一样。
    • (2)、引用数据类型:比较的是引用的地址是否相同,比如说新建了两个User对象,比较的是两个User的地址是否一样。
public class LinearSearch {
    private LinearSearch() {}
    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 res1 = LinearSearch.search(data, 16);
        System.out.println(res1);

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

在这里插入图片描述


三、使用自定义类

equlas 方法默认比较的是 两个类对象的地址,如果我们希望比较两个类对象的字符串,那么 equals 就不再那么好用了,这时候我们需要 重写 equals 方法

我们期望调用 LinearSearch 方法查找 Student 类对象的字符串

public class LinearSearch {
    private LinearSearch() {}
    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) {
        Student[] students = {
                new Student("前端杂货铺"),
                new Student("后端杂货铺"),
                new Student("全栈杂货铺")
        };
        Student zahuopu = new Student("前端杂货铺");
        int res3 = LinearSearch.search(students, zahuopu);
        System.out.println(res3);
    }
}

由于equlas 方法默认比较的是 两个类对象的地址,所以我们需要新建 Student.java 文件,重写 equals 方法,注意重写的方法添加 @Override 注解,养成良好的编码习惯

equals 函数为 Object 父类的一个函数,我们想要覆盖 equals 方法,那么传入的参数的类型也要是 Object

加判断的是为了预防 Student another = (Student)student 强转失败抛异常

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

    @Override
    public boolean equals(Object student) {
    	// 判断当前类的对象是否为student对象
        if (this == student) {
            return true;
        }
        // 判断student对象是否为空
        if (student == null) {
            return false;
        }
        // 当前的类对象是否等于student的类对象
        if (this.getClass() != student.getClass()) {
            return false;
        }
        // 把 student 强制转换成 Student
        Student another = (Student)student;
        // 比较 name,下面的 equals 调用的 String 下的方法
        return this.name.equals(another.name);
    }
}

在这里插入图片描述


本篇小结

本文我们使用 Java 语言编写了线性查找法的代码,并且使用了泛型进行多种类型的适配。通过重写 equals 方法,我们熟悉了方法重写,并对加深了对类和实例的理解。

下一节,我们学习排序基础里面的 选择排序法。

好啦,本篇文章到这里就要和大家说再见啦,祝你这篇文章阅读愉快,你下篇文章的阅读愉快留着我下篇文章再祝!


参考资料:

  1. 百度百科 · Java
  2. 算法与数据结构体系【作者:bobo】

在这里插入图片描述


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

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

相关文章

冲刺十五届蓝桥杯P0005单词分析

文章目录 题目分析代码 题目 单词分析 分析 统计字符串中字母出现的次数&#xff0c;可以采用哈希表&#xff0c;代码采用的是数组来存储字符&#xff0c;将字符-97&#xff0c;得到对应的数组下标&#xff0c;将对应下标的数组&#xff1b;找到数组元素最大的下标&#xff…

微店店铺所有商品数据接口,微店整店商品数据接口,微店店铺商品数据接口,微店API接口

微店店铺所有商品数据接口是一种允许开发者在其应用程序中调用微店店铺所有商品数据的API接口。利用这一接口&#xff0c;开发者可以获取微店店铺的所有商品信息&#xff0c;包括商品名称、价格、介绍、图片等。 其主要用途是帮助开发者进行各种业务场景的构建&#xff0c;例如…

如果不封车,坚持冬天骑行应该注意些什么?

亲爱的骑行爱好者们&#xff0c;你们好&#xff01;随着秋天的脚步渐行渐远&#xff0c;冬天也不远了。对于热爱骑行的你们来说&#xff0c;秋天的骑行是一种享受&#xff0c;而冬天的骑行则是一种挑战。那么&#xff0c;如果你打算在秋天骑行不封车&#xff0c;坚持过冬天&…

小解C语言文件编译过程【linux】

小解C语言文件编译过程【linux】 库动态库静态库 C语言文件 程序编译过程整体预处理编译汇编链接动态链接静态链接两种方法对比 库 看到标题是文件编译过程 但是开头却是库&#xff0c;这可不是挂羊头卖狗肉&#xff0c;而是因为库也是代码不可缺少的一部分&#xff0c;并且在…

运维 | 如何查看端口或程序占用情况 | linux

运维 | 如何查看端口或程序占用情况 | linux 前言 本期主要介绍了 LINUX 中如何查看某个端口或程序的使用情况&#xff0c;希望对大家有所帮助。 快速使用 netstat 命令&#xff08;推荐&#xff09; netstat 命令可以显示网络连接、路由表和网络接口信息等。可以使用 net…

股票量化分析工具QTYX使用攻略——代号“飞龙在天”,狙击龙头股战法(更新2.7.1)...

搭建自己的量化系统 股票量化交易系统QTYX是一个即可以用于学习&#xff0c;也可以用于实战炒股分析的系统。 分享QTYX系统目的是提供给大家一个搭建量化系统的模版&#xff0c;最终帮助大家搭建属于自己的系统。因此我们提供源码&#xff0c;可以根据自己的风格二次开发。 关于…

芯片学习记录LM2596

LM2596 芯片介绍 LM2596 系列稳压器是为降压开关稳压器提供所有有效 功能的单片集成电路&#xff0c; 能够驱动 3A 的负载 &#xff0c; 并且拥有 出色的线路和负载调节性能。这些器件可提供 3.3V 、 5V、 12V 固定输出电压和可调节输出电压版本。 这类稳压器不仅需要很少的…

企业如何通过媒体宣传扩大自身影响力

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 企业可以通过媒体宣传来扩大自身的影响力。可以通过以下的方法。 1. 制定媒体宣传战略&#xff1a; - 首先&#xff0c;制定一份清晰的媒体宣传战略&#xff0c;明确您的宣传目标、目标…

Ubuntu:Arduino IDE 开发环境配置【保姆级】

物联网开发学习笔记——目录索引 本章主要介绍在Ubuntu系统搭建Arduino IDE 开发环境&#xff0c;windows系统请移步&#xff1a;Windows&#xff1a;Arduino IDE 开发环境配置【保姆级】 参考官网&#xff1a;Arduino - Home 有关更多详细信息&#xff0c;请参阅 Arduino …

SpringCloud-Stream

一、介绍 &#xff08;1&#xff09;提供统一接口操作不同厂商的消息队列组件&#xff0c;降低学习成本 &#xff08;2&#xff09;生产者和消费者只需操作binder对象即可与消息队列交互&#xff0c;生产者output&#xff0c;消费者input &#xff08;3&#xff09;核心概念&a…

RobotFramework用户关键字(一)

文章目录 一 用户关键字1. 创建用户关键字2. 用户关键字的使用3. 用户关键字参数4. 用户关键字返回参数 一 用户关键字 Robotframework是一个用python写的基于关键字驱动的自动化测试框架。既然是基于关键字驱动的&#xff0c;那么关键字的编写和使用就是平时工作的核心。这篇文…

单链表经典OJ题

目录 ​编辑 题目&#xff1a; 一、移除链表元素&#xff1a; 本质&#xff1a; 解题思路&#xff1a; 本题分为两种解法&#xff1a; 我们使用解法二&#xff1a; 注意事项&#xff1a; 完整代码&#xff1a; 题目&#xff1a; 一、移除链表元素&#xff1a; 本质&…

论文阅读:Segment Any Point Cloud Sequences by Distilling Vision Foundation Models

论文地址&#xff1a;[2306.09347] Segment Any Point Cloud Sequences by Distilling Vision Foundation Models (arxiv.org) 代码地址&#xff1a;GitHub - youquanl/Segment-Any-Point-Cloud: [NeurIPS23 Spotlight] Segment Any Point Cloud Sequences by Distilling Visi…

计网第六章(应用层)(二)(域名系统DNS)

一、基本概述 域名和IP地址&#xff1a;在1983年&#xff0c;因特网就开始采用层次结构的命名树作为主机的名字&#xff0c;即域名。因为域名比IP地址更加方便人们记忆&#xff0c;人们可以通过域名更加方便地访问互联网。但实际上网络识别的仍然是IP地址&#xff0c;所以就有…

文件操作(打开关闭文件、文件顺序以及随机读写)

文章目录 写在前面1. 文件的打开与关闭1.1 文件指针1.2 文件的打开(fopen)与关闭(fclose)1.2.1 fopen函数1.2.2 fclose函数 2. 文件的顺序读写2.1. fgetc 和 fputc函数2.1.1 fputc函数2.1.2 fgetc函数 2.2 fgets 和 fputs函数2.2.1 fputs函数2.2.2 fgets函数 2.3 fscanf和fprin…

密码学技术总结

前言 本文内容主要摘抄网络规划设计师的教材和腾讯-SUMMER课堂&#xff0c;主要对网络安全进行简单梳理和总结 对称密码体制 密码分为私钥和公钥密码两种&#xff0c;而介于私钥和公钥只见密码成为混合密码。 私钥密码又称为对称密码&#xff0c;该体制的特点是加密和解密…

软件开发项目文档系列之二如何撰写项目建设方案

目录 前言1 项目概况2 需求分析3 建设目标4 建设内容4.1 建设原则4.2 设计依据4.3 总体框架4.4 建设任务4.5 技术方案 5 实施保障措施6 验收和考核指标7 投资预算7.1 资金来源7.2 预算表7.3 预算编制说明 结语 前言 建设方案或解决方案是在任何新项目或计划启动之前&#xff0…

程序员如何运营好博客平台

shigen坚持日更的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。坚持记录和分享从业两年以来的技术积累和思考&#xff0c;不断沉淀和成长。 不知不觉间&#xff0c;我发现从我的日更博客和公众号目标确定到现在&#xff0c;我已经坚…

数据库实验一:学生信息管理系统数据库结构搭建和表的创建

实验项目名称&#xff1a;学生信息管理系统数据库结构搭建和表的创建 实验目的与要求实验原理与内容1. 数据库的组织结构2. 数据库的分离和附加3. 数据库表的创建&#xff0c;修改和删除 实验过程与结果1. 根据学生信息管理系统创建相关的数据库2. 数据库表初步设计及实现3. 实…

【算法训练-排序算法 二】【手撕排序】快速排序、堆排序、归并排序

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【手撕排序系列】&#xff0c;使用【数组】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&…