使用Python实现希尔排序算法
希尔排序是插入排序的改进版,通过分组缩小元素间隔,先“粗排”再“精排”提升效率。核心是选择初始增量(如数组长度的一半),将数组分为若干组,组内元素间隔为增量,对每组用插入排序;随后增量减半,重复分组排序,直至增量为1时完成“精排”。 其关键逻辑是通过分组减少元素移动次数:初始分组大(元素间隔大),先让数组基本有序;逐步缩小增量,最终以插入排序收尾。时间复杂度平均为O(n log n),最坏O(n²),空间复杂度O(1),适用于中等规模、元素分布不均的数组,是原地排序的高效算法。
阅读全文使用Python实现插入排序算法
本文介绍插入排序算法,核心思想是将元素逐个插入已排序子数组,类似整理扑克牌时的有序插入。基本思路:从数组第二个元素开始,将每个元素视为待插入元素,与已排序子数组从后往前比较,找到合适位置后插入,确保子数组始终有序。 以Python实现为例,外层循环遍历待插入元素(从索引1开始),内层循环通过while比较并后移元素,用临时变量temp保存当前元素,最终插入到正确位置。代码为原地排序,仅用一个临时变量,空间复杂度O(1)。 时间复杂度:最好情况(数组已排序)O(n),最坏情况(逆序)O(n²);空间复杂度O(1)。适用于小规模数据或基本有序数据,实现简单且稳定。
阅读全文使用Python实现快速排序算法
快速排序基于“分而治之”思想,核心是选基准值分区并递归排序。基本思路:选基准值(如数组首元素),将数组分为小于和大于基准值的两部分,再递归处理子数组。 分区过程是关键:通过左右指针遍历,右指针左移找小于基准值元素,左指针右移找大于基准值元素,交换后继续,直到指针相遇,交换基准值到最终位置,完成分区。 Python实现中,`partition`函数确定基准位置,`quick_sort`递归处理左右子数组。测试代码验证了排序效果。 复杂度:平均O(n log n)(分区均衡),最坏O(n²)(如已排序数组且基准选首元素,可通过随机选基准优化)。 快速排序是高效实用的排序算法,广泛应用于实际场景,理解其分区逻辑和递归过程是掌握排序算法的关键。
阅读全文使用Python实现冒泡排序算法
### 冒泡排序:基础排序算法解析 冒泡排序基于“气泡上升”原理,核心思想是重复比较相邻元素,交换错误顺序的元素,使较大元素逐步“冒泡”到数组末尾,直至整体有序。其工作步骤为:多轮遍历数组,每轮比较相邻元素并交换逆序对,每轮结束后最大未排序元素归位;若某轮无交换,说明数组已有序,提前终止。 Python实现中,通过外层循环控制排序轮数(最多n-1轮),内层循环比较相邻元素并交换,用`swapped`标志优化终止条件。时间复杂度最坏为O(n²)(完全逆序),最好为O(n)(已排序,优化后),空间复杂度O(1),且为稳定排序。 冒泡排序简单直观,适合小规模数据,是理解排序思想的基础。通过其原理与Python代码实现,可快速掌握相邻元素比较交换的核心逻辑。
阅读全文使用Java实现基数排序算法
基数排序是一种非比较型整数排序算法,通过按数位从低位到高位处理数字,将每个数字按当前数位分配到“桶”中,再按桶顺序收集回原数组,重复直至所有数位处理完毕,适合位数少的整数,效率较高。基本思想是“分配-收集-重复”:按当前数位(个位、十位等)分配到对应桶,按桶顺序收集回数组,循环处理所有数位。 以数组[5,3,8,12,23,100]为例,经个位、十位、百位三轮处理完成排序。Java代码中,通过找到最大数确定最高数位,用`(num / radix) % 10`获取当前位,以ArrayList为桶实现分配收集。时间复杂度O(d(n+k))(d为最大数位数,k=10),空间O(n+k)。该算法稳定,适合整数排序,负数可分离正负后分别排序再合并。
阅读全文使用Java实现计数排序算法
计数排序是简单直观的非比较型排序算法,通过统计元素出现次数并结合前缀和确定位置,适用于元素范围小(如整数)、重复元素多且需稳定排序的场景。其核心思路:先确定元素范围(找min和max),统计各元素出现次数,计算前缀和得到元素最后位置,再从后遍历原数组生成排序结果。 实现步骤:处理边界(空/单元素数组无需排序),确定min/max,创建计数数组统计次数,计算前缀和(累加得到元素最后位置),从后遍历生成结果。时间复杂度O(n+k)(n为数组长度,k为元素范围),空间复杂度O(n+k)。适用场景为整数范围小(如分数、年龄)、重复元素多且需稳定排序。该算法通过计数和累加实现,无需比较,适合初学者理解排序基本思想。
阅读全文使用Java实现归并排序算法
归并排序是基于分治思想的高效排序算法,核心为分解、解决、合并三步:先将数组递归分解为单元素子数组,再递归排序子数组,最后合并两个有序子数组为整体有序数组。 Java实现中,`mergeSort`方法通过递归分解数组为左右两半,分别排序后调用`merge`合并。`merge`方法使用三个指针遍历左右子数组,比较元素大小并填充结果数组,剩余元素直接复制。 算法复杂度:时间复杂度O(n log n)(每次合并O(n),递归深度log n),空间复杂度O(n)(需额外数组存储合并结果),且为稳定排序(相等元素相对顺序不变)。 归并排序逻辑清晰,适合大数据量排序,是分治算法的经典案例,通过递归分解与合并有序子数组实现高效排序。
阅读全文使用Java实现堆排序算法
堆排序是基于堆数据结构的高效排序算法,时间复杂度O(n log n),空间复杂度O(1),属原地排序,适合大规模数据。堆是特殊完全二叉树,分大顶堆(父节点值大于子节点)和小顶堆,堆排序采用大顶堆。核心思想:每次取出堆顶最大值放数组末尾,调整剩余元素为新大顶堆,重复直至有序。 实现分三步:构建大顶堆(从最后一个非叶子节点开始,用heapify调整各节点);调整堆(递归调整子树,维护大顶堆性质);排序过程(交换堆顶与末尾元素,缩小堆范围后重复调整)。核心函数heapify通过比较父子节点,递归调整子树至大顶堆;buildMaxHeap从倒数第二个节点起构建完整大顶堆;主函数整合上述步骤完成排序。堆排序通过高效调整堆实现有序,适用于空间受限场景,是大规模数据排序的高效选择。
阅读全文使用Java实现选择排序算法
选择排序是一种简单直观的排序算法,核心思想是每次从无序部分选取最小(或最大)元素,放入已排序部分末尾,重复此过程直至全部有序。其基本思路为:外层循环确定已排序部分的末尾位置,内层循环在未排序部分中寻找最小值,交换该最小值与外层循环当前位置的元素,直至完成排序。 Java实现中,`selectionSort`方法通过两层循环实现:外层循环遍历数组(`i`从0到`n-2`),内层循环(`j`从`i+1`到`n-1`)寻找未排序部分的最小值索引`minIndex`,最后交换`i`位置元素与`minIndex`位置元素。以数组`{64,25,12,22,11}`为例,每轮交换后逐步构建有序数组,最终结果为`[11,12,22,25,64]`。 时间复杂度为O(n²),适用于小规模数据。该算法逻辑简单、代码易实现,是理解排序基础思想的典型示例。
阅读全文使用Java实现希尔排序算法
希尔排序是插入排序的改进版,通过分组插入减少逆序时的移动次数。核心是引入步长(Gap),将数组分Gap个子序列,对各子序列插入排序后,逐步缩小Gap至1(等价普通插入排序)。算法步骤:初始化Gap为数组长度一半,对每个子序列执行插入排序,再缩小Gap重复直至为0。Java实现中,外层循环控制Gap从n/2递减,内层循环遍历元素,用临时变量保存当前元素,向前比较并移动元素至正确位置完成插入。测试数组{12,34,54,2,3}排序后为[2,3,12,34,54]。其通过分组逐步有序化提升效率,可优化步长序列(如3k+1)进一步提升性能。
阅读全文使用Java实现插入排序算法
插入排序是一种简单直观的排序算法,核心思想是将未排序元素逐个插入已排序部分的正确位置,类似整理扑克牌。适合小规模数据,实现简单。 基本思路:从第2个元素开始,将当前元素记为“待插入元素”,与已排序部分从后往前比较,若已排序元素更大则后移,直至找到插入位置,重复操作直至所有元素处理完毕。 Java实现需保存待插入元素,通过循环比较并后移元素完成插入。算法时间复杂度:最好O(n)(已排序),最坏和平均O(n²);空间复杂度O(1)(原地排序);稳定排序,适用于小规模数据或几乎有序数据。 其核心在于“逐步插入”,实现简单,稳定性和原地性使其在小规模排序中表现良好。
阅读全文使用Java实现快速排序算法
快速排序基于分治思想,核心是选基准元素分区(小于和大于基准),递归处理子数组,平均时间复杂度O(n log n),是常用高效排序算法。基本步骤:选基准(如最右元素),分区后递归排序左右子数组。分区逻辑:以最右元素为基准,定义i指向“小于基准区域”末尾,遍历数组交换小于基准的元素,最后将基准移至正确位置。Java代码实现了该逻辑。时间复杂度平均O(n log n),最坏O(n²),空间平均O(log n)。缺点是不稳定排序,最坏性能较差,需注意基准选择优化性能。
阅读全文使用Java实现冒泡排序算法
冒泡排序是基础排序算法,核心思想是重复比较相邻元素并交换位置,使较大元素“冒泡”到数组末尾(升序)。其排序步骤通过多轮迭代完成:每轮确定当前未排序部分的最大元素位置并移至末尾,直到数组有序。 Java代码实现中,外层循环控制排序轮数(最多n-1轮),内层循环比较相邻元素并交换。关键优化是通过`swapped`标记,若某轮无交换则提前终止,最好情况下时间复杂度降为O(n)。时间复杂度最坏和平均为O(n²),空间复杂度O(1)(原地排序)。 冒泡排序原理简单直观,适合教学理解排序核心,但效率较低,仅适用于小规模数据或教学场景,实际大规模数据排序多采用快速排序等高效算法。
阅读全文Pytorch神经网络入门:全连接层与反向传播原理
本文介绍PyTorch神经网络基础,核心围绕全连接层与反向传播。全连接层实现前一层神经元与当前层全连接,输出为权重矩阵乘输入加偏置向量。前向传播是数据从输入层经全连接层、激活函数到输出层的正向计算过程,如两层网络:输入→全连接→ReLU→全连接→输出。 反向传播是神经网络学习的核心,通过梯度下降调整参数。原理基于链式法则,从输出层反向计算损失对各参数的梯度,PyTorch的autograd自动记录计算图并完成梯度计算。流程包括前向传播、计算损失、反向传播(loss.backward())、参数更新(优化器如SGD)。 关键概念:全连接层实现特征组合,前向传播正向计算,反向传播通过梯度下降最小化损失,自动求导简化梯度计算。理解这些原理有助于模型调试与优化。
阅读全文快速入门Pytorch:张量维度变换与常用操作
这篇文章介绍了Pytorch张量的核心知识,包括基础、维度变换、常用操作及练习建议。张量是Pytorch存储数据的基本结构,类似NumPy数组,支持GPU加速和自动求导。创建方式有:从列表/数值用`torch.tensor()`,从NumPy数组用`torch.from_numpy()`,或用内置函数生成全0/1/随机张量。 维度变换是关键操作:`reshape()`灵活调整形状(元素总数不变),`squeeze()`去掉单维度,`unsqueeze()`增加单维度,`transpose()`和`permute()`交换维度。常用操作包括基础算术运算、矩阵乘法`matmul()`、广播机制(自动扩展维度运算)及聚合操作(`sum()`/`mean()`/`max()`等)。 文章建议通过练习巩固张量操作,如维度调整、广播机制和维度交换,以掌握“形状语言”,为后续模型构建奠定基础。
阅读全文Pytorch基础教程:Dataset与DataLoader加载数据实战
数据加载是机器学习训练的关键环节,PyTorch的`Dataset`和`DataLoader`是高效管理数据的核心工具。`Dataset`作为数据存储抽象基类,需继承实现`__getitem__`(读取单个样本)和`__len__`(总样本数),也可直接用`TensorDataset`包装张量数据。`DataLoader`则负责批量处理,支持`batch_size`(批次大小)、`shuffle`(打乱顺序)、`num_workers`(多线程加载)等参数,优化训练效率。 实战中,以MNIST为例,通过`torchvision`加载图像数据,结合`Dataset`和`DataLoader`实现高效迭代。需注意Windows下`num_workers`默认设为0,避免内存问题;训练时`shuffle=True`打乱数据,验证/测试集设为`False`保证可复现。 关键步骤:1. 定义`Dataset`存储数据;2. 创建`DataLoader`设置参数;3. 迭代`DataLoader`输入模型训练。二者是数据处理基石,掌握后可灵活应对各类数据加载需求。
阅读全文零基础玩转Pytorch:数据可视化与模型评估技巧
本文介绍Pytorch中数据可视化与模型评估的核心技能,助力高效调试模型。数据可视化方面,Matplotlib可观察数据分布(如MNIST样本及标签直方图)、TensorBoard监控训练过程(标量变化、模型结构)。模型评估中,分类任务需关注准确率、混淆矩阵(如MNIST分类示例),回归任务用MSE、MAE。实战中,通过可视化发现问题(如“8”“9”混淆),迭代优化模型。进阶可探索GAN可视化、实时指标计算等。掌握这些技能能快速定位问题、理解数据,为复杂模型开发奠基。
阅读全文Pytorch入门到实践:用简单例子理解模型构建
这篇Pytorch入门教程涵盖核心知识点:Pytorch基于Python,动态计算图优势明显,安装简单(`pip install torch`)。核心数据结构是张量(Tensor),支持GPU加速,可创建、操作(加减乘除、矩阵乘法)及与NumPy互转。自动求导(autograd)通过`requires_grad=True`实现梯度计算,如`y=x²+3x`在x=2时导数为7。线性回归模型继承`nn.Module`定义,前向传播实现`y=wx+b`。数据准备生成模拟数据(`y=2x+3+噪声`),通过`TensorDataset`和`DataLoader`批量加载。训练用MSE损失与SGD优化器,循环中梯度清零、反向传播、参数更新,1000轮后验证并可视化结果,学习到参数接近真实值。核心流程涵盖张量操作、自动求导、模型构建、数据加载及训练优化,可扩展至复杂模型。
阅读全文新手友好!Pytorch损失函数与训练循环基础
文章介绍机器学习中损失函数与训练循环的作用及实现。损失函数衡量模型预测与真实标签的差距,训练循环通过调整参数减小损失实现模型学习。常用损失函数:MSE适用于回归任务(如房价预测),CrossEntropy适用于分类任务(如猫狗识别),Pytorch中分别用`nn.MSELoss()`和`nn.CrossEntropyLoss()`调用。训练循环核心四步:前向传播(模型预测)→计算损失→反向传播(求梯度)→参数更新(优化器调整),需注意反向传播前清零梯度。以线性回归为例,生成模拟数据,定义线性模型,用MSE损失和Adam优化器训练,迭代优化参数。关键注意事项:梯度清零、训练/推理模式切换、优化器选择(如Adam)、分批训练(DataLoader)。掌握这些可实现模型从数据中学习规律,为复杂模型奠定基础。
阅读全文Pytorch优化器入门:SGD、Adam等优化算法实战
### 优化器:深度学习的“导航系统” 优化器是深度学习中更新模型参数、最小化损失函数的核心工具,类似爬山时的导航系统,帮助模型从“高损失”山顶走向“低损失”山谷。其核心任务是通过调整参数,提升模型在训练数据上的表现。 不同优化器针对不同场景设计:基础SGD(随机梯度下降)简单但收敛慢,需手动调参;SGD+Momentum加入“惯性”,加速收敛;Adam结合动量与自适应学习率,默认参数效果优异,是大多数任务的首选;AdamW在Adam基础上加入权重衰减(L2正则化),有效防止过拟合。 PyTorch的`torch.optim`模块提供多种优化器:SGD适用于简单模型,SGD+Momentum加速波动模型(如RNN),Adam适配多数任务(CNN、Transformer等),AdamW适合小数据或复杂模型。 实战中,对比线性回归任务可见:Adam收敛更快、损失更平稳,参数更接近真实值(如`y=2x+3`);SGD易震荡。建议初学者优先用Adam,若需控制
阅读全文从0开始学Pytorch:激活函数与卷积层基础讲解
### 激活函数与卷积层概述 **激活函数**:神经网络需非线性变换拟合复杂关系,激活函数引入非线性。常见函数: - **ReLU**:`y = max(0, x)`,计算简单,解决梯度消失,最常用(PyTorch:`nn.ReLU()`)。 - **Sigmoid**:`y = 1/(1+exp(-x))`,输出(0,1)用于二分类,但梯度消失(PyTorch:`nn.Sigmoid()`)。 - **Tanh**:`y=(exp(x)-exp(-x))/(exp(x)+exp(-x))`,输出(-1,1),均值0,易训练但仍有梯度消失(PyTorch:`nn.Tanh()`)。 **卷积层**:CNN核心,通过卷积核提取局部特征。基本概念:输入(如RGB图像,形状`(batch, in_channels, H, W)`)、卷积核(小矩阵)、步长(滑动像素数)、填充(边缘补0控输出尺寸)。PyTorch用`nn.Conv2d`实现,关键参数:`in_channels`(输入
阅读全文Pytorch入门必看:数据加载与预处理实战教程
数据加载与预处理是深度学习模型训练的关键基础,PyTorch通过`Dataset`、`DataLoader`和`transforms`工具高效实现。`Dataset`作为数据容器,定义样本获取方式,如`torchvision.datasets`内置MNIST等数据集,自定义需实现`__getitem__`和`__len__`。`DataLoader`负责批量加载,核心参数包括`batch_size`、`shuffle`(训练设True)、`num_workers`(多线程加速)。数据预处理通过`transforms`实现,如`ToTensor`转张量、`Normalize`归一化、`RandomCrop`等数据增强(仅训练集使用),`Compose`可组合变换。实战以MNIST为例,从定义预处理、加载数据集到创建`DataLoader`完成全流程,需注意归一化参数、数据增强仅训练集、Windows下`num_workers`设0避免多线程错误。掌握这些技能可高效处理数据,为模型训练奠基。
阅读全文轻松掌握Pytorch基础:张量操作与自动求导详解
这篇文章介绍了PyTorch中张量(Tensor)的基础内容。张量是存储和操作数据的基本单位,类似NumPy数组但支持GPU加速,是神经网络核心结构。创建方式包括从列表/NumPy数组(`torch.tensor()`/`as_tensor()`)和构造函数(`zeros()`/`ones()`/`rand()`等)。 基本属性有形状(`.shape`/`.size()`)、数据类型(`.dtype`)和设备(`.device`),可通过`.to()`转换类型或设备。主要操作包括算术运算(加减乘除、矩阵乘法)、索引切片、变形(`reshape()`/`squeeze()`/`unsqueeze()`)及拼接拆分(`cat()`/`stack()`/`split()`等)。 自动求导是核心,通过`requires_grad=True`追踪梯度,`backward()`触发梯度计算,`grad`获取梯度值。需注意非叶子节点梯度处理、梯度累加及`detach()`分离张量。掌握张量操作和自动求导是神经网络学习的基础。
阅读全文Pytorch入门教程:手把手教你搭建第一个神经网络模型
本文是PyTorch入门教程,通过搭建基于MNIST数据集的全连接神经网络(MLP)模型,讲解核心操作。首先安装PyTorch(CPU/GPU版),使用torchvision加载MNIST数据集,经ToTensor转换为张量、Normalize标准化后,用DataLoader批量处理(batch_size=64)。模型定义为输入层784(28×28图像展平)、隐藏层128(ReLU激活)、输出层10(Softmax)的MLP,继承nn.Module实现前向传播。损失函数选CrossEntropyLoss,优化器用SGD(lr=0.01)。训练5个epoch,循环执行前向传播、损失计算、反向传播与参数更新,每100batch打印损失。测试时模型设为eval模式,禁用梯度计算,计算测试集准确率。教程还建议扩展方向,如调整网络结构、更换优化器或数据集等。
阅读全文