【算法与数据结构】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

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


相关文章
|
2天前
|
算法
基于SOA海鸥优化算法的三维曲面最高点搜索matlab仿真
本程序基于海鸥优化算法(SOA)进行三维曲面最高点搜索的MATLAB仿真,输出收敛曲线和搜索结果。使用MATLAB2022A版本运行,核心代码实现种群初始化、适应度计算、交叉变异等操作。SOA模拟海鸥觅食行为,通过搜索飞行、跟随飞行和掠食飞行三种策略高效探索解空间,找到全局最优解。
|
4天前
|
机器学习/深度学习 数据采集 算法
基于GWO灰狼优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB2022a,展示了时间序列预测算法的运行效果(无水印)。核心程序包含详细中文注释和操作视频。算法采用CNN-GRU-SAM网络,结合灰狼优化(GWO),通过卷积层提取局部特征、GRU处理长期依赖、自注意力机制捕捉全局特征,最终实现复杂非线性时间序列的高效预测。
|
4天前
|
传感器 算法 物联网
基于粒子群算法的网络最优节点部署优化matlab仿真
本项目基于粒子群优化(PSO)算法,实现WSN网络节点的最优部署,以最大化节点覆盖范围。使用MATLAB2022A进行开发与测试,展示了优化后的节点分布及其覆盖范围。核心代码通过定义目标函数和约束条件,利用PSO算法迭代搜索最佳节点位置,并绘制优化结果图。PSO算法灵感源于鸟群觅食行为,适用于连续和离散空间的优化问题,在通信网络、物联网等领域有广泛应用。该算法通过模拟粒子群体智慧,高效逼近最优解,提升网络性能。
|
5天前
|
机器学习/深度学习 存储 算法
近端策略优化(PPO)算法的理论基础与PyTorch代码详解
近端策略优化(PPO)是深度强化学习中高效的策略优化方法,广泛应用于大语言模型的RLHF训练。PPO通过引入策略更新约束机制,平衡了更新幅度,提升了训练稳定性。其核心思想是在优势演员-评论家方法的基础上,采用裁剪和非裁剪项组成的替代目标函数,限制策略比率在[1-ϵ, 1+ϵ]区间内,防止过大的策略更新。本文详细探讨了PPO的基本原理、损失函数设计及PyTorch实现流程,提供了完整的代码示例。
109 10
近端策略优化(PPO)算法的理论基础与PyTorch代码详解
|
16天前
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
79 29
|
16天前
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
72 25
|
16天前
|
存储 人工智能 算法
C 408—《数据结构》算法题基础篇—数组(通俗易懂)
408考研——《数据结构》算法题基础篇之数组。(408算法题的入门)
58 23
|
1月前
|
算法 数据可视化 安全
基于DWA优化算法的机器人路径规划matlab仿真
本项目基于DWA优化算法实现机器人路径规划的MATLAB仿真,适用于动态环境下的自主导航。使用MATLAB2022A版本运行,展示路径规划和预测结果。核心代码通过散点图和轨迹图可视化路径点及预测路径。DWA算法通过定义速度空间、采样候选动作并评估其优劣(目标方向性、障碍物距离、速度一致性),实时调整机器人运动参数,确保安全避障并接近目标。
147 68
|
1天前
|
机器学习/深度学习 算法 安全
基于深度学习的路面裂缝检测算法matlab仿真
本项目基于YOLOv2算法实现高效的路面裂缝检测,使用Matlab 2022a开发。完整程序运行效果无水印,核心代码配有详细中文注释及操作视频。通过深度学习技术,将目标检测转化为回归问题,直接预测裂缝位置和类别,大幅提升检测效率与准确性。适用于实时检测任务,确保道路安全维护。 简介涵盖了算法理论、数据集准备、网络训练及检测过程,采用Darknet-19卷积神经网络结构,结合随机梯度下降算法进行训练。
|
2天前
|
算法 数据可视化 数据安全/隐私保护
一级倒立摆平衡控制系统MATLAB仿真,可显示倒立摆平衡动画,对比极点配置,线性二次型,PID,PI及PD五种算法
本课题基于MATLAB对一级倒立摆控制系统进行升级仿真,增加了PI、PD控制器,并对比了极点配置、线性二次型、PID、PI及PD五种算法的控制效果。通过GUI界面显示倒立摆动画和控制输出曲线,展示了不同控制器在偏转角和小车位移变化上的性能差异。理论部分介绍了倒立摆系统的力学模型,包括小车和杆的动力学方程。核心程序实现了不同控制算法的选择与仿真结果的可视化。
29 15

热门文章

最新文章