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

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

1.前言

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


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


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


2.泛型

1.1粗略介绍泛型类

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

public class LinearSearch<E>{...}

1

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

3

4

1.2.1 mian()调用search()出错

微信图片_20230701110438.png


原因: 在Java语言中,泛型只能接受类对象,而不能接受基本数据类型,图中的data数组是int类型,属于基本数据类型

解决措施: Java语言对每一种基本数据类型都做了一个对应的 包装类,基本数据类型和所对应的包装类之间可以进行互相的转换

微信图片_20230701110456.png

结论: 有了包装类的概念,当我们使用泛型的时候,如果我们想传入的类型是基本数据类型的话,只需要相应的把基本数据类型转化成对应的包装类

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);

   }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

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;

1

2

3

✌️那么现在,我们整个这个代码才是完全没有问题的


相关文章
|
1天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。
|
1天前
|
人工智能 算法 大数据
Linux内核中的调度算法演变:从O(1)到CFS的优化之旅###
本文深入探讨了Linux操作系统内核中进程调度算法的发展历程,聚焦于O(1)调度器向完全公平调度器(CFS)的转变。不同于传统摘要对研究背景、方法、结果和结论的概述,本文创新性地采用“技术演进时间线”的形式,简明扼要地勾勒出这一转变背后的关键技术里程碑,旨在为读者提供一个清晰的历史脉络,引领其深入了解Linux调度机制的革新之路。 ###
|
12天前
|
人工智能 算法 数据安全/隐私保护
基于遗传优化的SVD水印嵌入提取算法matlab仿真
该算法基于遗传优化的SVD水印嵌入与提取技术,通过遗传算法优化水印嵌入参数,提高水印的鲁棒性和隐蔽性。在MATLAB2022a环境下测试,展示了优化前后的性能对比及不同干扰下的水印提取效果。核心程序实现了SVD分解、遗传算法流程及其参数优化,有效提升了水印技术的应用价值。
|
11天前
|
存储 缓存 算法
优化轮询算法以提高资源分配的效率
【10月更文挑战第13天】通过以上这些优化措施,可以在一定程度上提高轮询算法的资源分配效率,使其更好地适应不同的应用场景和需求。但需要注意的是,优化策略的选择和实施需要根据具体情况进行详细的分析和评估,以确保优化效果的最大化。
|
12天前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
12天前
|
存储 缓存 算法
前端算法:优化与实战技巧的深度探索
【10月更文挑战第21天】前端算法:优化与实战技巧的深度探索
13 1
|
13天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于贝叶斯优化CNN-LSTM网络的数据分类识别算法matlab仿真
本项目展示了基于贝叶斯优化(BO)的CNN-LSTM网络在数据分类中的应用。通过MATLAB 2022a实现,优化前后效果对比明显。核心代码附带中文注释和操作视频,涵盖BO、CNN、LSTM理论,特别是BO优化CNN-LSTM网络的batchsize和学习率,显著提升模型性能。
|
13天前
|
数据采集 缓存 算法
算法优化的常见策略有哪些
【10月更文挑战第20天】算法优化的常见策略有哪些
|
13天前
|
缓存 分布式计算 监控
算法优化:提升程序性能的艺术
【10月更文挑战第20天】算法优化:提升程序性能的艺术
|
13天前
|
缓存 分布式计算 监控
优化算法和代码需要注意什么
【10月更文挑战第20天】优化算法和代码需要注意什么
15 0