- 博客(309)
- 收藏
- 关注
原创 Java并发编程(26)—— Unsafe类的源码解读以及使用场景
堆外是相对于JVM的内存来说的,通常我们应用程序运行后,创建的对象均在JVM内存中的堆中,堆内存的管理是JVM来管理的,而堆外内存指的是计算机中的直接内存,不受JVM管理。相比C和C++的开发人员,作为一名Java开发人员是十分幸福的,因为在Java中程序员在开发时不需要关注内存的管理,对象的回收,因为JVM全部都帮助我们完成了。对于Java中并发编程,Java的源码里面存着这大量的Unsafe类的使用,主要使用的是和CAS操作相关的三个方法,所以搞清楚这三个方法,对看懂Java并发编程的源码有很大帮助。
2024-09-09 16:05:07
325
原创 Java并发编程(24)—— JUC并发编程类库详解
CyclicBarrier 是一个同步辅助类,用于让一组线程到达一个屏障(barrier)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。这意味着在修改操作发生时,会创建一个新的数组,并将现有的所有元素复制到新数组中,然后在新数组上进行修改。这意味着在修改操作发生时,会创建一个新的数组,然后将现有的所有元素复制到新数组中,并在新数组上进行修改。当一个线程到达交换点时,它会调用 exchange() 方法,该方法会尝试将该线程的数据与另一个线程的数据交换。
2024-09-03 18:53:37
264
原创 Java并发编程(23)—— Volatile在并发编程中的应用
它是CPU或编译器在内存随机访问操作中的一个同步点,确保此点之前的所有读写操作都执行完毕后,才能开始执行此点之后的操作。内存屏障(Memory Barrier)是一种同步机制,用于防止处理器或编译器对内存操作的指令进行重排序。在Java内存模型(JMM)中,每个线程都有自己的工作内存(也称为本地内存),用于存储共享变量的副本。是Java中的一个关键字,用于修饰变量,特别是那些会被多个线程访问和修改的共享变量。变量,JVM会在其读写过程中插入特定的内存屏障指令,以确保其内存语义的正确实现。
2024-08-30 03:45:00
109
原创 Java并发编程(21)—— Atomic 原子类总结
第一步,因为对象的属性修改类型原子类都是抽象类,所以每次使用都必须使用静态方法 newUpdater()创建一个更新器,并且需要设置想要更新的类和属性。该类将整数值与引用关联起来,可用于解决原子的更新数据和数据的版本号,可以解决使用 CAS 进行原子更新时可能出现的 ABA 问题。该类将整数值与引用关联起来,可用于解决原子的更新数据和数据的版本号,可以解决使用 CAS 进行原子更新时可能出现的 ABA 问题。基本类型原子类只能更新一个变量,如果需要原子更新多个变量,需要使用 引用类型原子类。
2024-08-30 03:30:00
115
原创 Java并发编程(22)—— CurrentHashMap源码分析
java 并发包中提供的是一个线程安全且高效的HashMap ,也是面试的高频考点。下面将围绕主题:ConcurrentHashMap 如何实现高效地线程安全?以及在Java8中它从设计实现上有哪些演进?这篇文章一开始我以为会比较简单,但是在深入源码分析时,遇到了很大的阻碍,比前面我们分析AQS以及读写锁的源码要难理解的多,断断续续也写了4天了。如果你看完还是没有理解的话,那我在这里表示深深的歉意,同时也欢迎你和我一起沟通。
2024-08-30 03:00:00
143
原创 PyTorch深度学习实战(27)—— PyTorch分布式训练
分布式训练等价于增大了一次训练的batch_size,传统的批标准化仅是对一个batch上的数据进行操作,在分布式训练中不同进程对不同的数据进行操作,相当于每一个进程的BN层处理的batch。在确保每个进程执行的操作没有问题后,可以尝试先在较小的集群上(例如,单个节点启动两个进程,两个节点启动两个进程等)启动分布式训练,以此验证进程间的同步与协作是否出错,这样的操作可以降低复现错误、调试程序的成本。在分布式训练中,不同进程之间需要通信来完成参数的汇总更新,因此进程间的同步是至关重要的。
2024-08-29 15:45:55
660
原创 PyTorch深度学习实战(26)—— PyTorch与Multi-GPU
至此,网络完成了一次反向传播,网络参数仅在GPU-0上进行更新。在上述流程中,只需要GPU-0将数据与模型加载至多块GPU上,各GPU就可以并行地进行前向传播与反向传播,也就是说并行中的一个epoch完成了单个GPU多个epoch的工作,从而加速了模型的训练。非阻塞通信可以将进程本身的计算时间与进程间的通信时间重叠起来,即在完成计算的同时,交由特定的通信模块完成通信部分。不难发现,在MPI的帮助下,不同进程之间的通信是比较容易的,因此读者应该侧重于理解分布式计算的思想,并将该思想应用在实际的程序设计当中。
2024-08-29 15:39:11
475
原创 MySQL慢查询日志使用与分析
MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阈值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。由慢查询日志来查看哪些SQL超出了我们的最大忍耐时间值,比如一条SQL执行超过5秒钟,我们就算慢SQL,希望能收集超过5秒钟的SQL,结合之前explain进行全面分析。1.慢查询的开启并捕获:开启慢查询日志,设置阈值,比如超过5秒钟的就是慢SQL,至少跑1天,看看生产的慢SQL情况,并将它抓取出来。
2024-08-28 09:18:59
486
原创 Java并发编程(20)—— ConcurrentHashMap详解
需要高效的并发性能:相对于 Hashtable 或者 Collections.synchronizedMap() 等同步的哈希表实现,ConcurrentHashMap 在高并发情况下有更好的性能表现。1.锁的颗粒度更小,当数据落在数组上时,使用cas锁头节点,当发生冲突时数据落在节点上时,使用synchronized锁冲突的节点减少了并发冲突。ConcurrentHashMap是Java并发很重要的组件,也是大厂面试经常考察的对象,下面我就全面来详解ConcurrentHashMap。
2024-08-22 04:15:00
85
原创 Java并发编程(19)—— CompletableFuture异步多线程
crud系统真的很少用,一般其实都是中间件类的系统会大量的运用并发编程的知识,各种请求都是异步化的执行,比如说大家可以去看看rocketmq、elasticsearch这一类中间件的源码,他们会经常用到。或者说大家在自己公司里研发一些非crud类的系统,比如说一些公司内自研的一些底层系统,基础系统,中间件系统,其实也会经常用到并发编程,也就是异步编程的模式,那如果大家未来有可能用到异步编程的话,建议还是来了解一下今天的知识点,因为传统的异步编程其实控制你开的那个线程其实真的很麻烦。
2024-08-22 03:45:00
149
原创 Java并发编程(18)—— 常用并发工具类
生产者线程将元素放入队列,消费者线程从队列中取元素,队列为空时消费者线程阻塞。让一组线程到达一个共同的同步点,然后一起继续执行。是一个线程安全的队列,支持阻塞操作,适用于生产者-消费者模式。控制访问资源的线程数,可以用来实现限流或访问控制。适用于需要所有线程在某个点都完成后再继续的场景。适用于主线程需要等待多个子线程完成任务的场景。是一个线程安全且高效的哈希表,支持并发访问。在资源有限的情况下,控制同时访问的线程数量。适用于需要频繁对数值进行无锁操作的场景。一个线程(或多个)等待其他线程完成操作。
2024-08-21 09:24:06
63
原创 PyTorch深度学习实战(25)—— 使用向量化思想解决实际问题
显然,这里需要在左上角和右下角坐标值的基础上构造出$n \times n$ 的结果,然后对feature map进行整数数组索引,从而得到一个$C \times N \times n \times n$ 的结果,最后相乘便完成了ROI Align操作。本文通过三个示例说明了向量化思想在实际场景中的应用,读者应该仔细体会其中的向量化思想,并在解决实际问题时尝试使用向量化思想进行编程,从而提高程序的运行效率。将上一步得到的量化RoI特征进一步细化为量化的空间单元(bin),也就是对每一个单元的边界进行量化。
2024-08-21 04:45:00
471
原创 PyTorch深度学习实战(24)—— 爱因斯坦操作einsum 和 einops
爱因斯坦操作凭借其便捷、直观的特点,在视觉Transformer中得到了广泛的应用,下面以Vision Transformer(ViT)在很多网络结构中,需要提取通道间或者空间像素之间的信息,从而完成通道的部分维度和空间的部分维度之间的转化。注意: 对于res1和res2,虽然它们的shape一样,但是由于提取维度时的顺序不一样,它们的数值并不相同。进行维度间的相互转化时,一定要注意维度的顺序,如果提取的顺序有误,那么无法得到正确的目标结果。除了上面介绍的爱因斯坦求和,其他的爱因斯坦操作都封装在。
2024-08-21 03:00:00
457
原创 PyTorch深度学习实战(23)—— 用高级索引实现卷积
根据卷积的定义,只需要遍历整个图像,依次获取与卷积核相乘的子块,相乘求和后就可以得到卷积的结果。卷积运算还可以从整数数组索引的角度考虑,根据卷积的计算公式,在确定了输入形状和卷积核大小后,输出的Tensor形状也就固定了。本文介绍了一些特殊的索引操作:整数数组索引与布尔数组索引,灵活的运用这些索引操作可以有效地完成数据的变形与转换。的思路,将整张图像提前转换成与卷积核相乘的子块,再把每个子块的维度展平,此时形状从。从上面的示例可以看出,通过整数数组索引完成的卷积操作,它的结果与使用。命令就能得到最终结果。
2024-08-20 00:45:00
249
原创 PyTorch深度学习实战(22)—— 高级索引
从上面的例子可以看出,整数数组索引的机制就是先将索引数组对应位置的数字,组合成源Tensor实例的索引,再根据索引值和Tensor的size、storage_offset和stride属性计算出Storage空间上的真实索引,最后返回结果。当索引数组的个数N等于Tensor的维度数tensor.ndim时,索引输出的形状等价于index的形状(index.shape),输出的每一个元素等价于。,那么直接将所有高级索引所在区域的维度转换成高级索引的维度,Tensor的其他维度按照基本索引正常计算。
2024-08-20 00:15:00
178
原创 PyTorch深度学习实战(21)—— 索引操作
4.None索引索引和切片是NumPy和PyTorch中的两种常用操作,本文将从基本索引入手帮助读者建立向量化思想。1.基本索引PyTorch中Tensor的索引和NumPy数组的索引类似,通过索引操作可以定位到数据的具体位置,也可以进行切片操作。基本索引有以下几种形式。元组序列:在索引中直接使用一个元组序列对Tensor中数据的具体位置进行定位,也可以直接使用多个整数(等价于元组序列省略括号的形式)代替。切片对象(Slice Object):在索引中常见的切片对象形如。
2024-08-19 00:45:00
245
原创 PyTorch深度学习实战(20)—— 向量化计算和广播法则
在日常编程中读者应该养成向量化的编程习惯,避免对较大的Tensor进行逐元素的遍历操作,从而提高程序的运行效率。向量化计算是指对不同的数据执行同样的一个或一批指令,或者把指令应用到一个数组或向量上,从而将多次循环操作变成一次计算。广播法则(broadcast)是科学计算中经常使用的一个技巧,它在快速执行向量化计算的同时不会占用额外的内存/显存。两个数组要么在某一个维度的尺寸一致,要么其中一个数组在该维度的尺寸为1,否则不符合广播法则的要求。会将相同的数据复制多份,因此会占用额外的空间。
2024-08-19 00:15:00
178
原创 PyTorch深度学习实战(19)—— 使用GPU加速:CUDA
幸运的是,PyTorch封装了相应的接口,可以用简单的几行代码实现分布式训练。然而,如果要保证同样的代码在不同配置的机器上均能运行,那么编写设备兼容的代码是至关重要的,本节将详细介绍如何编写设备兼容的代码。在一些实际应用场景下,代码的可移植性是十分重要的,读者可根据上述内容继续深入学习,在不同场景中灵活运用PyTorch的不同特性编写代码,以适应不同环境的工程需要。在进行低精度的计算时,可以考虑使用HalfTensor,它相比于FloatTensor可以节省一半的显存,但是需要注意数值溢出的情况。
2024-08-18 01:45:00
98
原创 PyTorch深度学习实战(18)—— 可视化工具
同时,TensorBoard是一个相对独立的工具,只要用户保存的数据遵循相应的格式,TensorBoard就能读取这些数据,进行可视化。在PyTorch 1.1.0版本之后,PyTorch已经内置了TensorBoard的相关接口,用户在手动安装TensorBoard后便可调用相关接口进行数据的可视化,TensorBoard的主界面如下图所示。Visdom十分轻量级,支持非常丰富的功能,可以胜任大多数的科学运算可视化任务,它的可视化界面如下图所示。命令将服务放至后台运行。
2024-08-18 00:15:00
273
原创 PyTorch深度学习实战(17)—— 预训练模型
中,包括经典的分类模型:VGG、ResNet、DenseNet及MobileNet等,语义分割模型:FCN及DeepLabV3等,目标检测模型:Faster RCNN以及实例分割模型:Mask RCNN等。如图所示,Mask RCNN能够分割出该图像中的部分实例,读者可考虑对预训练模型进行微调,以适应不同场景下的不同任务。注意:上述代码均在CPU上进行,速度较慢,读者可以考虑将数据与模型转移至GPU上。需要注意的是转换分为两步,第一步:构建转换操作,例如。除了加载数据,并对数据进行预处理之外,
2024-08-17 00:30:00
116
原创 PyTorch深度学习实战(16)—— 数据处理工具
最后1个batch的batch_size也为1,这是因为共有9张(包括损坏的文件)图片,无法整除2(batch_size),所以最后一个batch的样本数目小于batch_size。然而,在训练神经网络时,一次处理的对象是一个batch的数据,同时还需要对一批数据进行打乱顺序和并行加速等操作。相比于丢弃异常图片而言,这种做法会更好一些,它能保证每个batch的样本数目仍然是batch_size,但是在大多数情况下,最好的方式还是对数据进行彻底清洗。函数中会抛出异常,最好的解决方案是将出错的样本剔除。
2024-08-17 00:15:00
179
原创 PyTorch深度学习实战(15)—— nn.Module深入分析
DataParallel并行是将一个batch的数据均分成多份,分别送到对应的GPU进行计算,然后将各个GPU得到的梯度进行累加,与module相关的所有数据也会以浅复制的方式复制多份。下面考虑一种场景:有一个预训练好的模型,需要提取模型的某一层(不是最后一层)的输出作为特征进行分类,但又不希望修改原有模型的定义文件,这时就可以利用钩子函数。在实际使用中可能层层嵌套,即一个module可能包含若干个子module,每一个子module可能包含更多的子module。为了方便用户访问各个子module,
2024-08-16 01:15:00
188
原创 PyTorch深度学习实战(14)—— 使用nn.Module搭建ResNet
ResNet34的网络结构如上图所示,除了最开始的卷积、池化和最后的池化、全连接,网络中有很多结构相似的单元,这些重复单元的共同点就是有个跨层直连的shortcut。另外,Residual Block的大小是有规律的,在最开始的池化之后有连续几个一模一样的Residual Block单元,这些单元的通道数一样。这里将这几个拥有多个Residual Block单元的结构称之为layer(读者需要将这里的layer和之前讲的layer区分开来,这里的layer是几个层的集合)。下面是实现代码,规律总结如下。
2024-08-16 00:30:00
377
原创 PyTorch深度学习实战(12)—— 神经网络工具箱nn.functional
由于激活函数(如ReLU、sigmoid、tanh)、池化(如MaxPool)等层没有可学习参数,可以使用对应的。,它的主要作用是对输入的Tensor进行双线性采样,并将输出变换为用户想要的形状。例如,前面实现的全连接层,就可以将weight和bias两个参数单独拿出来,在构造函数中初始化为。对于不具备可学习参数的层(如激活层、池化层等),可以将它们用函数代替,这样可以不用放置在构造函数。的比较说明,读者可参考PyTorch论坛的相关讨论和说明。函数代替,对于卷积、全连接等具有可学习参数的层,建议使用。
2024-08-15 00:30:00
231
原创 PyTorch深度学习实战(13)—— 神经网络初始化策略和优化器
然而,新建优化器会重新初始化动量等状态信息,这对于使用动量的优化器(如Adam),可能会造成损失函数在收敛过程中出现震荡等情况。在深度学习中参数的初始化十分重要,良好的初始化能让模型更快地收敛,并达到更高水平,糟糕的初始化可能使模型迅速崩溃。中的模块参数都采取了较为合理的初始化策略,用户一般无需再进行设计。读者也可以用自定义的初始化策略来代替系统的默认初始化。返回的是内存中的随机数,很可能会有极大值,这在实际训练网络时会造成溢出或者梯度消失。中,它的设计非常灵活,能够方便地扩展为自定义的优化方法。
2024-08-15 00:30:00
329
原创 PyTorch深度学习实战(11)—— 常用神经网络层
在上面的例子中,每一层的输出基本上都直接成为下一层的输入,这样的网络称为前馈传播网络(Feedforward Neural Network,FFN)。这意味着,如果使用list保存子module,那么在反向传播时无法调整子module的参数,因为子module中的参数并没有加入到主module的参数中。卷积神经网络的本质是卷积层、池化层、激活层以及其他层的叠加,理解卷积层的工作原理是极其重要的。以上例子都是对module的可学习参数直接进行操作,在实际使用中,这些参数一般会随着学习的进行不断改变。
2024-08-14 15:27:46
995
原创 PyTorch深度学习实战(10)—— 神经网络工具箱nn.Module
中,可以将前面自定义的Linear层(module)作为当前module对象的一个子module。在forward函数中,可以加上各层之间的处理函数(如激活函数、数学处理等),并定义层与层之间的关系。其中x表示输入,y表示输出,b表示偏置,W表示全连接层的参数。是一个抽象的概念,既可以表示神经网络中的某个层(layer),又可以表示一个包含很多层的神经网络。全连接层,又名仿射层,它的输出y和输入x满足y = Wx+b ,其中w和b是可学习的参数。使用时,可以将layer看成数学概念中的函数,调用。
2024-08-14 01:45:00
462
原创 Java并发编程(17)—— ThreadLocal 让每个线程拥有自己的变量副本
然而,在一些场景下,我们并不希望数据被多个线程共享,而是希望每个线程都拥有自己独立的一份数据。ThreadLocal 是 Java 中的一个类,它提供了线程本地变量的功能。简单来说,就是为每一个使用该变量的线程提供了一个独立的变量副本。这样一来,每个线程都可以独立地改变自己的副本,而不会影响到其他线程。,gc执行后key引用的对象回收,导致内存泄漏。,那么gc执行后,key的引用仍然存在,仍然无法进行回收,内存泄露仍然存在。不仅简化了多线程编程中的数据管理,还能提高程序的并发性能。类的内部结构比较简单。
2024-08-13 03:15:00
388
原创 PyTorch深度学习实战(9)—— 用autograd实现线性回归
相比于上文的线性回归,利用autograd实现的线性回归不需要手动实现反向传播,可以自动计算微分。这一点不单是在深度学习中,在许多机器学习的问题中都很有用。在上文中讲解了如何利用Tensor实现线性回归,本文将讲解如何利用autograd实现线性回归,读者可以从中体会autograd的便捷之处。需要注意的是,在每次反向传播之前,需要先把梯度值清零,避免累加。
2024-08-12 04:00:00
189
原创 PyTorch深度学习实战(8)—— 自动求导autograd和计算图基础
在这个图中,输入网络的Tensor称为叶子节点,网络输出的Tensor称为根节点。autograd从根节点开始遍历,并对其中所有requires_grad=True的Tensor进行求导操作,这样逐层遍历至叶子节点时,可以通过链式操作计算梯度,从而自动完成反向传播操作。计算图(Computation Graph)是包括PyTorch和TensorFlow在内的许多现代深度学习框架的核心,它为反向传播(Back Propogation)算法提供了计算基础,了解计算图在实际写程序的过程中会有极大的帮助。
2024-08-11 04:15:00
691
原创 PyTorch深度学习实战(7)—— 线性回归
上面提到了Tensor的许多操作,这里不要求读者全部掌握,今后使用时可以再查阅这部分内容或者查阅官方文档,在此读者只需有个基本印象即可。线性回归是机器学习的入门内容,应用十分广泛。线性回归利用数理统计中的回归分析来确定两种或两种以上变量间相互依赖的定量关系,其表达形式为。其中,x和y是输入输出数据,w和b是可学习参数,误差e服从均值为0的正态分布。本文利用随机梯度下降法更新参数w 和b 来最小化损失函数,最终学得w 和b 的数值。可见程序已经基本学出w=2、b=3,并且图中直线和数据已经实现较好的拟合。
2024-08-10 04:45:00
208
原创 PyTorch深度学习实战(6)—— 改变Tensor的形状
在设计上,PyTorch允许一个Tensor是另外一个Tensor的视图(view),这有效避免了显式的数据复制,从而更加高效便捷地进行Tensor的变形、切片等操作。:在调整Tensor的形状时,用户不需要指定每一维的形状,可以把其中一个维度指定为-1,PyTorch会自动计算对应的形状。另外,虽然在大多数情况下转置操作的输出和输入的Tensor共享存储,但是转置操作会使得Tensor变得不连续,此时最好通过。:将Tensor中尺寸为1的维度去掉,例如形状(1, 3, 1, 4)会变为(3, 4)。
2024-08-09 03:30:00
873
原创 PyTorch深度学习实战(5)—— Tensor的命名张量和基本结构
Tensor分为头信息区(Tensor)和存储区(Storage),头信息区主要保存Tensor的形状(size)、步长(stride)、数据类型(type)等信息,真正的数据在存储区保存成连续数组。Tensor的内存地址指向Tensor的头(head),不同Tensor的头信息一般不同,但可能使用相同的Storage。在进行张量的运算时,命名张量可以提供更高的安全性。例如,在进行Tensor的加法时,如果两个Tensor的维度名称没有对齐,那么即使它们的维度相同也无法进行计算。在内存共享方面的区别。
2024-08-08 03:30:00
1133
原创 PyTorch深度学习实战(4)—— Tensor的基本操作
其中,大多数索引操作通过修改Tensor的stride等属性与原Tensor共享内存,即修改了其中一个Tensor,另一个Tensor会跟着改变。HalfTensor是专门为GPU版本设计的,同样的元素个数,HalfTensor的显存占用只有FloatTensor的一半,因此使用HalfTensor可以极大缓解GPU显存不足的问题。用户可以沿着某一维度进行指定的归并操作,例如,加法。的输入对象都是多个Tensor组成的一个序列(如列表、元组等),所有的Tensor在拼接之外的维度必须相同或者可以进行广播。
2024-08-07 03:45:00
1084
原创 PyTorch深度学习实战(3)—— 小试牛刀:CIFAR-10分类
CIFAR-10是一个常用的彩色图片数据集,它有10个类别:airplane、automobile、bird、cat、deer、dog、frog、horse、ship和truck。神经网络训练:以CIFAR-10分类为例,演示了神经网络的训练流程,包括数据加载、网络搭建、模型训练及模型测试。Tensor:类似NumPy数组的数据结构,它的接口与NumPy的接口类似,可以方便地互相转换。拷贝上面的LeNet网络,因为CIFAR-10数据集中的数据是3通道的彩色图像,所以将。
2024-08-06 03:30:00
800
原创 PyTorch深度学习实战(2)——PyTorch快速入门
在forward函数中不仅可以使用Tensor支持的任何函数,还可以使用if、for、print、log等Python语法,写法和标准的Python写法一致。PyTorch的简洁设计使得它易于入门,在深入介绍PyTorch之前,本文先介绍一些PyTorch的基础知识,以便读者能够对PyTorch有一个大致的了解,并能够用PyTorch搭建一个简单的神经网络。中最重要的类,它可以看作是一个神经网络的封装,包含神经网络各层的定义以及前向传播(forward)方法,通过。如果需要共享内存,那么可以使用。
2024-08-05 17:08:59
1247
原创 PyTorch深度学习实战(1)——PyTorch安装与配置
同时,VS Code提供了十分丰富的插件,来提高用户的开发效率,例如Python(用于代码调试、变量检测等)、Remote-SSH(用于连接远程服务器)、Jupyter(用于加载Jupyter Notebook)等。魔术方法,还可以直接粘贴多行代码、doctest代码和IPython的代码(下面的代码都是使用“Ctrl+V”直接粘贴的,如果是Linux终端,那么应该使用“Ctrl+Shift+V”直接粘贴,或者单击鼠标右键,选择"粘贴"选项)。在这种开发模式下,代码启动更快,读取远程数据也更方便。
2024-08-05 17:03:01
770
原创 Leetcode算法题总结6-树
一棵树要么是空树,要么有两个指针,每个指针指向一棵树。树是一种递归结构,很多树的问题可以使用递归来处理。平衡树左右子树高度差都小于等于 1。3 两节点的最长路径。
2024-08-02 22:56:04
222
原创 Leetcode算法题总结5-数组和矩阵
题目描述:S[i] 表示一个集合,集合的第一个元素是 A[i],第二个元素是 A[A[i]],如此嵌套下去。题目描述:数组的度定义为元素出现的最高频率,例如上面的数组度为 3。让前 k+1 个元素构建出 k 个不相同的差值,序列为:1 k+1 2 k 3 k-1 ... k/2 k/2+1.6. 一个数组元素在 [1, n] 之间,其中一个数被替换为另一个数,找出重复的数和丢失的数。n 的整数,要求构建数组,使得相邻元素的差值不相同的个数为 k。主要思想是通过交换数组元素,使得数组上的元素在正确的位置上。
2024-08-01 22:14:20
304
原创 数据结构常见算法题总结4-字符串
由于本题的字符串只包含 26 个小写字符,因此可以使用长度为 26 的整型数组对字符串出现的字符进行统计,不再使用 HashMap。s1 进行循环移位的结果是 s1s1 的子字符串,因此只要判断 s2 是否是 s1s1 的子字符串即可。使用长度为 256 的整型数组来统计每个字符出现的个数,每个字符有偶数个可以用来构成回文字符串。记录一个字符上次出现的位置,如果两个字符串中的字符上次出现的位置一样,那么就属于同构。因为回文字符串最中间的那个字符可以单独出现,所以如果有单独的字符就把它放到最中间。
2024-07-31 18:06:02
305
PyTorch深度学习实战常用神经网络层.docx
2024-08-14
基于多任务卷积网络(MTCNN)和Center-Loss的多人实时人脸检测和人脸识别系统.rar
2024-07-22
ChatGPT大模型学习笔记.rar
2024-07-22
Java+Servlet学生信息管理系统全部源码+SQL+课程设计文档.rar
2024-07-22
Java Spring AOP 面向切面编程的4种实现
2024-07-16
CNN深度学习检测胸部疾病的项目数据集
2024-07-10
北京大学人机交互开放实验室发布的PCB缺陷数据集.txt
2024-07-10
混合型晶圆缺陷探测数据集
2024-07-10
单个和混合缺陷模式的晶圆映射数据集
2024-07-10
用于质量检查的铸件产品图像数据
2024-07-10
工业铸造产品缺陷预测图像数据集
2024-07-10
学生信息管理系统-JavaWeb课程设计-完整代码+初始化SQL+文档
2024-06-26
大数据课程设计-MapReduce实现基于物品相似度的协同过滤推荐-全部代码和数据.rar
2024-06-20
大数据课程设计-Hadoop-MapReduce实现sql的统计、groupby和join-全部源码
2024-06-20
基于MapReduce的网站访问数据指标统计-Hadoop-大数据课程设计-全部源码和数据.rar
2024-06-20
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人