PyTorch(四)数据转换与构建神经网络

#c 总结 文档总结

文档目录:

  1. 数据转换:主要讲解「transforms」,涉及到的知识点有「匿名函数」,「对象自调用」

  2. 创建神经模型:涉及的知识点有「加速训练」「神经网络定义」「调用神经网络」「模型层」「模型参数」

1 数据转换(Transforms)

#c 说明 转换的目的

数据并不总是以「训练机器学习算法」所需的最终处理形式出现。使用转换(transforms)来执行数据的「一些操作」,使其适合训练。

#e TorchVision中的转换 转换的目的

所有TorchVision数据集都有两个参数:
transform用于修改特征。
target_transform用于修改标签,它们接受包含转换逻辑的可调用对象。

#e FashionMNIST转换

FashionMNIST的特征数据以PIL图像格式存在,标签是整数。为了训练,需要将「特征」转换为使用的的「张量形式」,并将标签转换为one-hot编码的张量。使用ToTensorLambda实现这些转换。

import torch
from torchvision import datasets
from torchvision.transforms import ToTensor, Lambda
ds = datasets.FashionMNIST(root="data",train=True,download=True,transform=ToTensor(),target_transform=Lambda(lambda y: torch.zeros(10, dtype=torch.float).scatter_(0, torch.tensor(y), value=1))    
)
'''target_transform参数用于对目标(标签)进行转换。lamdba:定义一个匿名函数,y是函数的参数torch.zeros(10, dtype=torch.float)创建一个长度为10,数据类型为float的零向量.scatter_(0, torch.tensor(y), value=1)就地操作,在零向量的y索引的位置上的值设置为1,设置一个one-hot编码'''

#d 匿名函数

匿名函数,通常在Python中通过lambda关键字定义,是一种没有名称的简单函数。它们通常用于执行简短的、一次性的任务,特别是在需要函数对象的地方,但又不想使用完整的函数定义语法,是一个非常有用的工具,它提供了一种快速定义简单函数的方式,使得代码更加简洁,增加了编程的灵活性。

匿名函数的主要属性和特点包括:

  1. 没有名称:正如“匿名”所暗示的,这类函数没有名称。
  2. 简洁的定义:通常只有一行代码,适用于简单的逻辑。
  3. 自动返回值lambda表达式的结果自动成为返回值,无需显式使用return语句。
  4. 可接受任意数量的参数:但只能有一个表达式。

创造「匿名函数」的目的

  • 简化代码:对于简单的函数,使用lambda可以避免定义标准的函数,从而减少代码量。
  • 功能性编程lambda表达式支持函数式编程范式,在处理高阶函数和操作(如mapfiltersorted等)时非常有用。

没有这个概念「匿名函数」有什么影响

  • 代码冗长:对于需要传递简单函数作为参数的场合,如果没有匿名函数,就需要定义标准的函数。这会使得代码变得更加冗长,特别是当这个函数只需要在一个地方使用时。
  • 减少灵活性:在某些情况下,使用匿名函数可以使代码更加灵活和简洁。没有匿名函数,某些编程模式(如即时使用的小函数作为参数传递)会更加复杂。
  • 降低可读性:虽然过度使用lambda可能会降低代码的可读性,但在适当的场合使用它们可以使代码更加直观。没有lambda表达式,对于那些最适合使用匿名函数的场景,代码可能会变得更难理解。

#e 快速决策 匿名函数

想象你在一个快餐店,需要快速决定每个人的饮料。你可以为每个人设置一个简单的规则(匿名函数):如果某人喜欢甜的,就选择可乐;如果不喜欢甜的,就选择无糖的绿茶。

在这个例子中,「决策规则」就像一个匿名函数,它根据一个「输入」(是否喜欢甜的)来快速决定「输出」(选择哪种饮料)。虽然这不是编程中的直接应用,但它展示了匿名函数概念的一个类比——根据输入快速产生输出,而不需要为这个决策过程命名或详细定义。

#e 列表排顺 匿名函数

在Python中,我们经常需要根据列表中元素的「某个属性」或「值」来对列表进行排序。使用lambda表达式,我们可以轻松地定义排序的关键字。
在这个例子中,lambda x: x[1]是一个匿名函数,它接受一个参数x(在这里是列表中的一个元组)并返回「元组」的第二个元素作为排序的依据。

# 根据元组的第二个元素进行排序
tuples = [(1, 'banana'), (2, 'apple'), (3, 'cherry')]
tuples.sort(key=lambda x: x[1])
print(tuples)  # 输出: [(2, 'apple'), (1, 'banana'), (3, 'cherry')]

#e filter()函数 匿名函数

filter()函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器。使用lambda表达式,我们可以定义过滤的条件。
这里,lambda x: x % 2 == 0是一个匿名函数,它接受一个参数x并检查x是否为偶数。filter()函数使用这个匿名函数来决定哪些元素应该被包含在结果列表中。

# 过滤出列表中的偶数
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers)  # 输出: [2, 4, 6, 8]

#d 对象自调用

Python中的「对象自调用」概念指的是一个对象可以表现得像一个函数,即这个对象可以被直接调用。这是通过在类中定义__call__魔术方法(magic method)来实现的。对象自调用的能力使得对象在调用时可以执行特定的操作。

属性:

  • __call__方法:这是判断一个对象是否支持自调用的主要依据。如果一个对象的类中定义了__call__方法,那么这个对象就可以被直接调用。

「对象自调用」解决的问题:

  • 灵活性增强:对象自调用提供了一种使对象行为更加灵活的方式。它允许对象在保持状态的同时,还能够像函数一样被调用,从而在对象和函数之间提供了一种灵活的转换机制。
  • 接口统一:在某些设计模式中,如命令模式,可以通过对象自调用的方式来统一不同操作的接口。这样,无论是直接执行一个函数还是通过对象来执行,都可以有相同的调用方式。

没有「对象自调用」的影响:

  • 减少灵活性:没有对象自调用的概念,对象和函数之间的界限会更加明确,这在某些情况下减少了编程的灵活性。对象将不能直接作为函数来调用,可能需要更多的代码来实现相同的功能。
  • 设计模式限制:某些设计模式的实现会受到限制。例如,在需要将对象作为可调用实体传递的场景中,如果没有对象自调用的概念,就需要额外的机制来模拟这一行为,增加了实现的复杂度。

#e 智能音箱 对象自调用

想象一下,你有一个智能音箱,比如一个小爱同学或者天猫精灵。这个智能音箱就像是一个具有「对象自调用」能力的对象。我们可以把它想象成一个Python对象,这个对象有一个__call__方法,允许你直接对它说话(调用它),然后它会根据你的命令「执行相应的操作」。当对智能音箱发出命令时,就像在调用对象的__call__方法,根据你的「命令(输入参数)」,它会「执行相应的操作」并给出反馈。

#e 计数类器 对象自调用

class Counter:def __init__(self):self.count = 0def __call__(self, increment=1):self.count += incrementreturn self.countcounter = Counter()
print(counter())  # 输出: 1
print(counter(10))  # 输出: 11

2 创建神经网络

2.1 获取训练的设备

#d 加速训练

可以使用硬件如GPU,MPS来加速模型的训练。

#e 获取代码 加速训练

可以使用torch.cuda 或者`torch.backends.mps来判断硬件设备是否可用。

device = ("cuda"if torch.cuda.is_available()else "mps"if torch.backends.mps.is_available()else "cpu"
)
print(f"Using {device} device")
# Using cuda device

2.2 定义神经网络

#d 神经网络定义

通过继承nn.Module来定义神经网络,并在__init__方法中初始化神经网络层。每一个nn.Module的子类都在forward方法中实现了对「输入数据」的操作。

#e 定义代码 神经网络定义

class NueralNetwork(nn.Module):def __init__(self):#初始化神经网络层super().__init__()#调用父类的初始化方法self.flatten = nn.Flatten()#将图像张量展平self.linear_relu_stack = nn.Sequential(#定义一个包含三个全连接层的神经网络nn.Linear(28*28, 512),#输入层,参数分别为输入特征的形状和输出特征的形状nn.ReLU(),#激活函数nn.Linear(512, 512),#隐藏层,参数分别为输入特征的形状和输出特征的形状nn.ReLU(),nn.Linear(512, 10),)def forward(self, x):x = self.flatten(x)#展平图像张量logits = self.linear_relu_stack(x)#将张量传递给神经网络return logits#返回输出

#d 调用神经网络

在定义好神经网络过后,通过实例化神经网络,并传递需要的数据来获取预测值。

#e 实例化 调用神经网络

model = NueralNetwork().to(device)
print(model)
'''
NueralNetwork((flatten): Flatten(start_dim=1, end_dim=-1)(linear_relu_stack): Sequential((0): Linear(in_features=784, out_features=512, bias=True)(1): ReLU()(2): Linear(in_features=512, out_features=512, bias=True)(3): ReLU()(4): Linear(in_features=512, out_features=10, bias=True))
)

#e 传递数据 调用神经网络

使用模型,将「输入数据」传递给它。将会执行模型的forward方法以及一些后台操作。但不要直接调用model.forward()。
调用模型对输入数据执行操作,将返回一个二维张量,其中维度0(dim=0)对应于每个类别的10个原始预测值,维度1(dim=1)对应于每个输出的单独值。我们通过传递给nn.Softmax模块的一个实例来获得预测概率。

X = torch.rand(1, 28, 28, device=device)#生成一个随机张量,参数分别为张量的形状和设备,形状为1*28*28的张量
logits = model(X)#将张量传递给神经网络
pred_probab = nn.Softmax(dim=1)(logits)#将预测值传递给Softmax函数,dim=1表示计算每行的softmax,(logits)是「对象自调用」
y_pred = pred_probab.argmax(1)#返回每行中最大值的索引,若参数为0,则返回每列中最大值的索引
print(f"Predicted class: {y_pred}")#打印预测的类别
'''
Predicted class: tensor([1], device='cuda:0')
'''

2.3 模型层

#d 模型层

模型层「layers」是指在定义神经网络时,编写在__init__()函数下的内容。

#c 说明 模型层讲解 模型层

接下里将分解FashionMNIST模型中的层。为了讲解「模型层」,将取一个包含3张28x28大小图像的样本小批量,并观察当将其通过网络传递时会发生什么。

input_image = torch.rand(3, 28, 28)#随机生成一个3*28*28的张量
print(input_image.size())#打印张量的形状
print(input_image.shape)#打印张量的形状
'''
torch.Size([3, 28, 28])
torch.Size([3, 28, 28])
'''

#e nn.Flatten 模型层

初始化Flatten层后,可以通过调用它来展平3D张量。将32828图像转换成一个连续的784像素值的数组。

flatten = nn.Flatten() #实例化Flatten层
flat_image = flatten(input_image)#将张量传递给Flatten层
print(flat_image.size())#打印张量的形状
'''
torch.Size([3, 784])
'''

#e nn.Linear 模型层

Linear层使用一种称为「权重」的内部张量,以及一种称为「偏置」的内部张量,对输入张量进行「线性变换( linear transformation)」。

layer1 = nn.Linear(in_features=28*28,out_features=20)#in_features表示输入特征的形状,out_features表示输出特征的形状
hidden1 = layer1(flat_image)#将张量传递给Linear层
print(hidden1.size())#打印张量的形状
'''
torch.Size([3, 20])
'''

#e nn.ReLU 模型层

「非线性激活函数」对模型的「输人」和「输出」创建「复杂的映射」。在线性变换后,引入非线性激活函数,帮助神经网络学习各种规律。

print(f"Before ReLU:{hidden1}\n\n")#打印隐藏层的输出
hidden1 = nn.ReLU()(hidden1)#将隐藏层的输出传递给ReLU激活函数
print(f"After ReLU: {hidden1}")#打印隐藏层的输出
'''
Before ReLU:tensor([[-0.6295, -0.0362, -0.1422,  0.1866, -0.0955,  0.1350, -0.0350, -0.0746,-0.3552,  0.2612, -0.1565, -0.1210, -0.1081,  0.0425,  0.3023,  0.0560,0.2418, -0.0035,  0.9525,  0.1108],[-0.6520, -0.3238, -0.0208,  0.0317,  0.0194,  0.5342, -0.2582, -0.3136,-0.3851,  0.2427, -0.0782, -0.3597, -0.2151, -0.1793, -0.0808, -0.1593,0.4785, -0.0835,  0.9555, -0.1394],[-0.9776, -0.3067, -0.1160, -0.0596,  0.1393,  0.2737,  0.1556,  0.0434,-0.6965,  0.4378, -0.2360, -0.1565,  0.3842, -0.2784,  0.3218, -0.0107,0.5351, -0.2072,  0.8570, -0.1982]], grad_fn=<AddmmBackward0>)After ReLU: tensor([[0.0000, 0.0000, 0.0000, 0.1866, 0.0000, 0.1350, 0.0000, 0.0000, 0.0000,0.2612, 0.0000, 0.0000, 0.0000, 0.0425, 0.3023, 0.0560, 0.2418, 0.0000,0.9525, 0.1108],[0.0000, 0.0000, 0.0000, 0.0317, 0.0194, 0.5342, 0.0000, 0.0000, 0.0000,0.2427, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.4785, 0.0000,0.9555, 0.0000],[0.0000, 0.0000, 0.0000, 0.0000, 0.1393, 0.2737, 0.1556, 0.0434, 0.0000,0.4378, 0.0000, 0.0000, 0.3842, 0.0000, 0.3218, 0.0000, 0.5351, 0.0000,0.8570, 0.0000]], grad_fn=<ReluBackward0>)
'''

#e nn.Sequential 模型层

nn.Sequential是一个有序的容器,数据按照在函数中传递给它的顺序通过所有的模块。可以使用nn.Sequential容器快速组装网络,例如seq_modules。

seq_modules = nn.Sequential(flatten,layer1,nn.ReLU(),nn.Linear(20, 10)
)
input_image = torch.rand(3, 28, 28)#随机生成一个3*28*28的张量
logits = seq_modules(input_image)#将张量传递给Sequential容器

#e nn.Softmax 模型层

神经网络的最后一个线性层返回「原始预测值」,这些值被称为「logits」,[-infty, infty]中的原始值传递给nn.Softmax模块,将其转换为[0, 1]范围内的值。dim参数表示沿着哪个轴计算softmax。

softmax = nn.Softmax(dim=1)#实例化Softmax函数
pred_probab = softmax(logits)#将logits传递给Softmax函数

2.4 模型参数

#d 模型参数

「神经网络」内部的许多「层」是「参数化」的,在训练过程中能够优化相关「权重」和「偏置」。继承nn.Module的类会自动「模型对象」内部的定义的参数,可以使用模型的parameters()或named_parameters()方法使所有参数可访问。

#e 打印参数例子 模型参数

print("Model structure: ", model, "\n\n")#打印模型的结构
for name, param in model.named_parameters():#遍历模型的参数print(f"Layer: {name} | Size: {param.size()} | Values: {param[:2]} \n")#打印参数的名称、形状和前两个值
'''
Model structure:  NueralNetwork((flatten): Flatten(start_dim=1, end_dim=-1)(linear_relu_stack): Sequential((0): Linear(in_features=784, out_features=512, bias=True)(1): ReLU()(2): Linear(in_features=512, out_features=512, bias=True)(3): ReLU()(4): Linear(in_features=512, out_features=10, bias=True))
)
Layer: linear_relu_stack.0.weight | Size: torch.Size([512, 784]) | Values: tensor([[ 1.2033e-02, -3.3190e-02,  3.5117e-02,  ..., -3.1082e-04,3.1766e-02,  8.9217e-05],[-2.2151e-02,  8.2360e-03,  2.6249e-02,  ...,  1.1201e-02,1.0973e-02,  3.0528e-02]], device='cuda:0', grad_fn=<SliceBackward0>)Layer: linear_relu_stack.0.bias | Size: torch.Size([512]) | Values: tensor([0.0314, 0.0233], device='cuda:0', grad_fn=<SliceBackward0>)       Layer: linear_relu_stack.2.weight | Size: torch.Size([512, 512]) | Values: tensor([[-0.0299, -0.0194,  0.0357,  ..., -0.0063, -0.0406,  0.0399],[ 0.0007,  0.0034,  0.0072,  ...,  0.0176, -0.0431,  0.0424]],device='cuda:0', grad_fn=<SliceBackward0>)Layer: linear_relu_stack.2.bias | Size: torch.Size([512]) | Values: tensor([0.0287, 0.0206], device='cuda:0', grad_fn=<SliceBackward0>)       Layer: linear_relu_stack.4.weight | Size: torch.Size([10, 512]) | Values: tensor([[ 0.0293,  0.0368, -0.0042,  ..., -0.0112, -0.0114, -0.0138],[ 0.0157,  0.0046, -0.0023,  ..., -0.0414, -0.0390, -0.0082]],device='cuda:0', grad_fn=<SliceBackward0>)Layer: linear_relu_stack.4.bias | Size: torch.Size([10]) | Values: tensor([0.0046, 0.0029], device='cuda:0', grad_fn=<SliceBackward0>) 
'''  

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

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

相关文章

Maven私服批量上传pom和jar实操

Maven私服上传pom和jar实操-CSDN博客 Maven私服上传jar实操_maven fakepath-CSDN博客 之前写过两篇向maven私服上传jar的操作&#xff0c;看到阅读量还可以&#xff0c;觉得应该有很多人有这个需求&#xff0c;所以这次再放一个大招&#xff0c;通过批量的方式向私服传jar和p…

使用递归时的几种优秀处理手法(持续更新中,欢迎评论补充)

一、记忆缓存 遇到出现同样的参数多次递归调用时&#xff0c;可以添加记忆缓存&#xff0c;以空间换时间。 原理说明&#xff1a; 1、如下面案例中的递归&#xff0c;调用时每次都从n执行到0&#xff08;n一次衰减&#xff09;&#xff0c;则可能存在n-1的阶乘次重复参数调用…

ChatGPT智能对话绘画系统 带完整的安装源代码包以及搭建教程

系统概述 ChatGPT 智能对话绘画系统是一款集智能语言处理和绘画创作于一体的综合性系统。它利用了深度学习和自然语言处理技术&#xff0c;能够理解用户的意图和需求&#xff0c;并通过与用户的交互&#xff0c;生成富有创意的绘画作品。该系统的核心是一个强大的人工智能模型…

【RAG】PDF Chatbot 个人练手项目

【RAG】PDF Chatbot 个人练手项目 项目的架构和技术选择&#xff0c;以及如何利用它来提升个人的开发能力和理解人工智能技术在文档处理中的应用。 项目截图 后端&#xff1a;FastAPI 应用 功能特性&#xff1a; PDF 文件上传&#xff1a;通过界面或 API&#xff0c;上传 P…

基于weixin小程序新生报到系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;班级信息管理&#xff0c;师资力量管理&#xff0c;宿舍信息管理&#xff0c;宿舍安排管理&#xff0c;签到信息管理&#xff0c;论坛管理 小程序功能包括&#xff1a;系统首页&am…

Android跨进程调用,Binder线程池溢出导致ANR

Android跨进程调用&#xff0c;Binder线程池溢出导致ANR 如果发生ANR&#xff0c;找到trace.txt 、/data/anr目录下&#xff0c; "main" prio5 tid1 Native| group"main" sCount1 dsCount0 flags1 obj0x72c33e38 self0x78a64c2a00| sysTid1863 nice0 cgr…

Python学习笔记21:进阶篇(十)常见标准库使用之math模块,random模块和statistics模块

前言 本文是根据python官方教程中标准库模块的介绍&#xff0c;自己查询资料并整理&#xff0c;编写代码示例做出的学习笔记。 根据模块知识&#xff0c;一次讲解单个或者多个模块的内容。 教程链接&#xff1a;https://docs.python.org/zh-cn/3/tutorial/index.html 数学 P…

音频文件:16k16bit.mp3,16k16bit.wav,16k16bit.pcm,8k16bit.pcm有什么区别

这些文件是不同的音频格式和配置&#xff0c;它们的属性和使用方式有所不同。以下是每种格式的详细说明及其差异&#xff1a; 1. MP3 (16k16bit.mp3) 格式&#xff1a;MPEG-1 Audio Layer III (MP3)比特率&#xff1a;通常是可变的&#xff0c;但常见的是128 kbps到320 kbps&…

Hi3861 OpenHarmony嵌入式应用入门--LiteOS semaphore作为锁

CMSIS 2.0 接口中的 Semaphore&#xff08;信号量&#xff09;是用于嵌入式系统中多线程或中断服务例程&#xff08;ISR&#xff09;之间同步和共享资源保护的重要机制。Semaphore 是一种用于控制对多个共享资源访问的同步机制。它可以被看作是一个计数器&#xff0c;用于跟踪可…

【Qt6.3 基础教程 20】使用Qt Designer提升界面设计效率与质量

文章目录 前言什么是Qt Designer&#xff1f;为什么使用Qt Designer&#xff1f;Qt Designer的核心功能如何使用Qt Designer&#xff1f;整合.ui文件到项目中总结 前言 界面设计是软件开发中至关重要的一部分&#xff0c;它直接关系到用户的第一印象和使用体验。对于使用Qt框架…

计算机组成原理,网络安全,软件工程等上机报告

这些都是学长们当年的战斗&#xff0c;如果需要的话后台联系我

【从0实现React18】 (六) 完成commit提交流程并初步实现react-dom包,完成首屏渲染测试

前面&#xff0c;我们提到 React 更新流程有四个阶段&#xff1a; 触发更新&#xff08;Update Trigger&#xff09;调度阶段&#xff08;Schedule Phase&#xff09;协调阶段&#xff08;Reconciliation Phase&#xff09;提交阶段&#xff08;Commit Phase&#xff09; 之前…

并发编程理论基础——合适的线程数量和安全的局部变量(十)

多线程的提升方向 主要方向在于优化算法和将硬件的性能发挥到极致想要发挥出更多的硬件性能&#xff0c;最主要的就是提升I/O的利用率和CPU的利用率以及综合利用率操作系统已经解决了磁盘和网卡的利用率问题&#xff0c;利用中断机制还能避免 CPU 轮询 I/O 状态&#xff0c;也提…

【机器学习】在【R语言】中的应用:结合【PostgreSQL数据库】的【金融行业信用评分模型】构建

目录 1.数据库和数据集的选择 1.准备工作 2.PostgreSQL安装与配置 3.R和RStudio安装与配置 2.数据导入和预处理 1.连接数据库并导入数据 1.连接数据库 2.数据检查和清洗 1.数据标准化 2.拆分训练集和测试集 3.特征工程 1.生成新特征 2.特征选择 4.模型训练和评估…

使用Tailwindcss之后,vxe-table表头排序箭头高亮消失的问题解决

环境 vue2.7.8 vxe-table3.5.9 tailwindcss/postcss7-compat2.2.17 postcss7.0.39 autoprefixer9.8.8 问题 vxe-table 表格表头 th 的排序箭头在开启正序或逆序排序时&#xff0c;会显示蓝色高亮来提示用户表格数据处在排序情况下。在项目开启运行了tailwindcss之后&#xff0…

数据集的未来:如何利用亮数据浏览器提升数据采集效率

目录 一、跨境电商的瓶颈1、技术门槛2、语言与文化差异3、网络稳定性4、验证码处理和自动识别5、数据安全6、法规和合规 二、跨境电商现在是一个合适的商机吗&#xff1f;三、数据集与亮数据浏览器1、市场分析2、价格监控3、产品开发4、供应链优化5、客户分析 四、亮数据浏览器…

上海计算机学会2020年3月月赛C++丙组T4连乘问题

题目描述 给定 a1​,a2​,⋯,an​&#xff0c;请计算一组乘积&#xff0c;记为P1​,P2​,⋯,Pn​&#xff0c;其中 Pi​ 的定义如下&#xff1a; 也就是说&#xff0c;Pi​ 是 a1​ 到 an​ 的连乘再除去 ai​。由于答案可能比较大&#xff0c;输出每个 Pi​ 模 10000 的余数。…

==和equals区别

在编程中&#xff0c; 和 equals 都用于比较&#xff0c;但它们有不同的使用场景和意义。 在Java中&#xff1a; 运算符&#xff1a; 用于比较两个对象的引用是否相等。 比较的是两个对象在内存中的地址。 例如&#xff1a; String a new String("hello"); Stri…

算法05 模拟算法之二维数组相关内容详解【C++实现】

大家好&#xff0c;我是bigbigli&#xff0c;前面一节我们一节讲过一维数组的模拟了&#xff0c;如果还没看的话&#xff0c;可以&#x1f449;点击此处。模拟算法还有很多内容需要讲&#xff0c;比如图像、日期相关的模拟算法&#xff0c;后续将继续更新&#xff0c;今天先来讲…

代码随想录——跳跃游戏Ⅱ(Leetcode 45)

题目链接 贪心 class Solution {public int jump(int[] nums) {if(nums.length 1){return 0;}int count 0;// 当前覆盖最远距离下标int curDistance 0;// 下一步覆盖距离最远下标int nextDistance 0;for(int i 0; i < nums.length; i){nextDistance Math.max(nums[…