【算法与数据结构】2 梅开二度,线性查找的究极优化

这篇具有很好参考价值的文章主要介绍了【算法与数据结构】2 梅开二度,线性查找的究极优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【算法与数据结构】2 梅开二度,线性查找的究极优化

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流

本文收录于算法与数据结构体系专栏,本专栏对于0基础者极为友好,欢迎与我一起完成算法与数据结构的从0到1的跨越

【算法与数据结构】2 梅开二度,线性查找的究极优化

1.前言

在上篇文章中,详细讲述了线性查找法并且对其进行了初步的优化:1️⃣使用static将方法写成一个静态的方法,2️⃣为了避免用户创造类的对象,将勾走凹函数声明为私有的。👉传送门:💖详解什么是算法?什么是线性查找法?💖

对于前面讲的线性查找法,它仍然存在一些需要改进的地方——当时的代码传入的是一个int型的数组,并且查找的元素也是一个int型,这些写完后,我们只可以在int型数组中查找一个int型的元素,但是在java中即使是基本类型也有8种,我们不可能对每一种类型都写一个线性查找的方法,这不是我们所希望的,不断重复写一个方法既不合理也是我们平时需要避免的

本篇文章就是为了学会我们应该如何避免重复写一个方法——泛型,这种语言机制就是为了可以应付不同的类型,一起来学习吧👇

2.泛型

1.1粗略介绍泛型类

  • 在Java语言中最常用的使用泛型方式就是定义一个泛型类——在类定义的后面加一个尖括号,里面写一个泛型的类型相应的代表的字母:<E>,在Java标准库中, 几乎所有的容器类都是泛型类
public class LinearSearch<E>{...}

1.2使用泛型方法

  • 对于上面的LinearSearch类,在具体使用的时候,并不是使用这个类的类对象,仅仅是使用这个类中相应的search()方法,所以我们将这个类定义成泛型类是没有意义的
  • 所以,我们实现的这个线性查找的算法类LinearSearch类不应该定义成泛型类,而是应该把search这个方法定义成是一个泛型方法——在public static后面加一个尖括号,里面写一个泛型的类型相应的代表的字母
//<E> 表示这个方法将会用到一个类型,类型E具体是什么,用户在调用的时候再指定
//data数组,是E这个类型的数组
//target,要查找的元素,也是E这个类型
public static <E> int search(E[] data, E target){...}

1.2.1 mian()调用search()出错

【算法与数据结构】2 梅开二度,线性查找的究极优化

  • 原因: 在Java语言中,泛型只能接受类对象,而不能接受基本数据类型,图中的data数组是int类型,属于基本数据类型
  • 解决措施: Java语言对每一种基本数据类型都做了一个对应的 包装类,基本数据类型和所对应的包装类之间可以进行互相的转换
    【算法与数据结构】2 梅开二度,线性查找的究极优化
  • 结论: 有了包装类的概念,当我们使用泛型的时候,如果我们想传入的类型是基本数据类型的话,只需要相应的把基本数据类型转化成对应的包装类

1.2.2 解析正确代码

  • 1️⃣search方法,已经是泛行方法了,对于泛行方法来说,接受的数据类型是E的data数组以及E类型的target,都不能是基本数据类型int,必须是类对象
  • 2️⃣只需要将data数组的类型修改为Integer类型
public class LinearSearchGeneric {

    private LinearSearchGeneric(){}
    public static <E> int search(E[] data, E target) {
        for (int i = 0; i < data.length; i++) {
            if (data[i] == target)
                return i;    //如果找到目标,返回对应的索引值
        }
        return -1;          //如果没有找到目标,返回-1
    }

    public static void main(String[] args) {

        //准备用于查找的数组 
        //👉int类型转化成对应的包装类Integer
        Integer[] data = {24, 18, 12, 9, 16, 66, 32, 4};

        int res = LinearSearchGeneric.search(data, 16);
        System.out.println(res); //输出res

        int res2 = LinearSearchGeneric.search(data,666); //查找目标666
        System.out.println(res2);

    }
}
  • 3️⃣那为什么传入的target参数的值是16和666,并没有报错呢?
    • 在Java内部, 有一个 自动转换的机制 ,对于16而言,Java编译器知道这里应该是一个泛型类E target,对于泛型类应该是一个类对象,java语言就会自动把这个16这个基本数据类型给转换成它所对应的包装类
  • 4️⃣那为什么对于int型数组就会报错呢?
    • data是一个数组,java语言不能帮助我们自动把一个基本数据类型的数组转换成对应的包装类的数组
  • 对于老版本的Java的话,上面的main函数在调用search()的时候,应该写成LinearSearch.<Integer>search(data,16),在Java8中,<Integer>是可以省略的——我们不显示的告诉泛行方法的泛行的类型是什么
  • 在Java语言中,有一个叫做类型推断的机制——会根据传来的这个data是integer类型的数组以及16对应的包装类是integer类型,Java编译器可以自动的推断出用户调用的这个search所对应的这个泛型应该就是Integer这个类型

3 ==orequals

  • 上述代码中的if语句中判断使用的是data[i] == target,由于我们的data[i]此时已经不是一个基本数据类型,而是一个类对象,且target也是一个类对象
  • 判断两个类对象相等的时候,不应该用==, 因为 ==判断的是引用相等, 而我们在这里想判断的是值相等,应该调用equals方法
for(int i = 0; i < data.length; i ++)
	if(data[i].equals(target))
		return i;
  • ✌️那么现在,我们整个这个代码才是完全没有问题的

扩展:

  • 基于字符串进行处理的时候,对于字符串的判等使用了==可能会导致整个算法的逻辑错误
  • 在Java语言中,string字符串它是一个类,对于类对象之间的判断,一定要使用equals方法

【算法与数据结构】2 梅开二度,线性查找的究极优化文章来源地址https://www.toymoban.com/news/detail-432091.html

到了这里,关于【算法与数据结构】2 梅开二度,线性查找的究极优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Rust 数据结构与算法:2线性数据结构 之 栈

    Rust 数据结构与算法:2线性数据结构 之 栈

    1、线性数据结构 数组、栈、队列、双端队列、链表这类数据结构都是保存数据的容器,数据项之间的顺序由添加或删除时的顺序决定,数据项一旦被添加,其相对于前后元素就会一直保持位置不变,诸如此类的数据结构被称为线性数据结构。线性数据结构有两端,称为“左

    2024年02月21日
    浏览(15)
  • 【数据结构与算法_01_线性表】线性表

    定义 ● 线性表 具有相同数据类型**(同类型)**的n个数据元素有限序列 ● 三方面 ● 定义 逻辑结构 ● 相同数据类型 ● 每个数据元素所占的空间相同 ● 有限 ● 有限个元素 ● 序列 ● 是有次序的 ● 基本操作 操作— 基本操作 运算 ● 创建线性表【initList(L)】 ● 初始化线

    2024年02月11日
    浏览(35)
  • 数据结构与算法【02】—线性表

    数据结构与算法【02】—线性表

    CSDN系列专栏:数据结构与算法专栏 针对以前写的数据结构与算法系列重写(针对文字描述、图片、错误修复),改动会比较大,一直到更新完为止 通过前面数据结构与算法基础知识我们知道了数据结构的一些概念和重要性,那么本章总结下线性表相关的内容。当然,我用自己

    2024年02月05日
    浏览(31)
  • HNU数据结构与算法分析-作业2-线性结构

    HNU数据结构与算法分析-作业2-线性结构

      1. (简答题) 4.1 假设一个线性表包含下列元素: |2,23,15,5,9 使用Shaffer编写的教材《数据结构与算法分析》的List ADT编写一些C++语句,删除值为15的元素。 (要求:采用C或C++语言描述算法) 4.6 使用Shaffer编写的教材《数据结构与算法分析》的LList类,给LList类的实现添加一个成

    2024年02月05日
    浏览(13)
  • 数据结构--》从线性表说起,掌握常用基础算法

    数据结构--》从线性表说起,掌握常用基础算法

    目录 初识线性表 线性表的基本操作 顺序表的定义 顺序表的基本操作 单链表的定义 单链表的基本操作  双链表的介绍 循环链表的介绍 静态链表的介绍 线性表是具有 相同 数据类型的 n (n0) 个数据元素的 有限序列 ,其中n为 表长 ,当n=0时线性表是一个 空表 。若用L命名线性

    2024年02月09日
    浏览(13)
  • 数据结构与算法-头歌【1】顺序线性表--课上练

      本意是整理和复习,理解不深或者有错误的评论区提出即可。 只有第一关的代码里面有结构体的定义,其余我只放了功能函数。 任务描述 本关要求按照完成顺序表数据类型定义,并初始化一个顺序线性表。 编程要求 顺序线性表数据结构定义如下: 本关的编程任务是补全

    2023年04月25日
    浏览(17)
  • 【数据结构与算法】二、线性表的顺序表示【硬核】

    【数据结构与算法】二、线性表的顺序表示【硬核】

    图书表的顺序存储结构类型定义: 在调用函数的过程中,当形参为引用类型时,实参和形参占用了相同的空间 2.4.1 线性表的基本操作: 2.4.2 线性表L的初始化 2.4.3 销毁和清空线性表L 2.4.4 求线性表L的长度以及判断线性表L是否为空 2.4.5 顺序表的取值(根据位置i获取相应位置

    2023年04月26日
    浏览(16)
  • 【数据结构 | 入门】线性表与链表 (问题引入&实现&算法优化)

    【数据结构 | 入门】线性表与链表 (问题引入&实现&算法优化)

    🤵‍♂️ 个人主页: @计算机魔术师 👨‍💻 作者简介:CSDN内容合伙人,全栈领域优质创作者。 本文是浙大数据结构学习笔记专栏 这里我们引入一个问题,最常见的多项式,我们如何使用编程将多项式表示出来呢? 我们可以使用数组来表示,但是会随着一个问题,如下图底

    2024年01月21日
    浏览(71)
  • 【算法与数据结构】1 算法0基础入门,详解什么是算法?什么是线性查找法?

    【算法与数据结构】1 算法0基础入门,详解什么是算法?什么是线性查找法?

    欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流 本文收录于算法与数据结构体系专栏, 本专栏 是服务于0基础者,一起完成从0到1的跨越 就是 一系列 可以解决问题的 清晰的 可执行的 计算机指令 那么生活中有哪些算法? 问路 :坐公交车到

    2023年04月09日
    浏览(22)
  • 【Python数据结构与算法】——(线性结构)精选好题分享,不挂科必看系列

    【Python数据结构与算法】——(线性结构)精选好题分享,不挂科必看系列

    🌈个人主页:  Aileen_0v0 🔥系列专栏:Python数据结构与算法专栏 💫个人格言: \\\"没有罗马,那就自己创造罗马~\\\" 1.time complexity of algorithm A is O(n^3) while algorithm B is O(2^n). Which of the following statement is TRUE?  A.For any problem in any scale, the alogorithm A is more efficient than alogrithm B. B.For any problem

    2024年02月05日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包