- 博客(45)
- 收藏
- 关注
原创 带权图的 Dijkstra 最短路径算法
Dijkstra算法用于求解带权非负图的最短路径问题。核心思想是通过贪心策略,逐步确定从起点到各顶点的最短路径。算法维护距离数组dist[]、路径计数cnt[]、最大点权和max_quan[]等数据结构,优先队列优化后时间复杂度更优。样题"城市间紧急救援"要求输出最短路径数量、最大救援队数量及具体路径,通过邻接表存储图结构,使用优先队列实现堆优化Dijkstra算法,在更新距离时同步维护路径计数和点权和,最后通过前驱数组回溯得到完整路径。
2026-04-01 17:21:35
380
原创 并 查 集
并查集是一种处理不相交集合的高效数据结构,支持查找和合并操作。它通过父节点数组记录元素归属,初始时每个元素自成一个集合。查找操作采用路径压缩优化,将节点直接指向根节点;合并操作则按秩合并,将较小树合并到较大树下。这两种优化使操作接近常数时间。示例代码展示了并查集的初始化、查找和合并实现,适用于集合合并与查询场景。
2026-03-11 15:31:36
70
原创 堆与优先队列
堆是一种基于完全二叉树的特殊数据结构,分为大根堆和小根堆。大根堆的父节点值≥子节点,小根堆相反。堆通常用数组存储,索引计算方便。堆排序通过建堆和下沉调整实现,时间复杂度O(nlogn),空间复杂度O(1),是不稳定排序。C++的priority_queue基于堆实现,提供push、pop等操作,适用于TopK问题。例如求最小K个数可用小根堆实现,时间复杂度最优为O(nlogK)。堆结构在内存受限场景下优势明显,适合处理大规模数据。
2025-11-24 22:44:25
941
原创 二叉树糕手
摘要:二叉树具有节点数与高度的特定关系,高度为h时最少h个节点(斜树),最多2^h-1个节点(满二叉树)。关键性质包括:叶节点数=度为2的节点数+1;完全二叉树可由节点数反推层数;存储结构分为顺序存储(适合完全二叉树)和链式存储;遍历方式包括深度优先(栈实现)和广度优先(队列实现)。二叉树结构与二进制数存在相似性,递归特性使其操作多可通过递归实现。
2025-11-24 15:50:42
308
原创 滑动窗口与单调队列
本文介绍了滑动窗口算法的三种典型应用场景。1)定长窗口问题,如力扣最大区间平均数,通过维护固定长度的窗口和来求解;2)变长窗口问题,如最大连续1个数,通过动态调整窗口边界满足条件;3)窗口内最值问题,如滑动窗口最大值,需使用单调队列维护窗口内元素的单调性,保证队首始终为当前最值。文章通过具体代码示例展示了每种场景的实现方法,并分析了时间复杂度的优化效果,从O(nk)提升到O(n)。
2025-11-21 18:38:15
473
原创 指针和内存地址
计算机内存以字节为单位连续存储,每个字节有唯一地址。32位系统地址范围0x00000000-0xFFFFFFFF(4GB),64位系统更大。1字节=8位二进制,可用2位十六进制简洁表示。指针是存储内存地址的变量,其大小由系统位数决定:32位系统指针为4字节,64位系统为8字节。十六进制最适合表示内存地址,因其与字节二进制完美对应。现代主要采用64位系统,其16EB寻址能力远超实际需求。
2025-11-21 15:22:13
179
原创 单调栈神养成手册
摘要:单调栈是一种保持栈内元素单调递增或递减的特殊数据结构,用于高效解决数组元素间大小关系问题。主要分为单调递增栈(栈底到栈顶递增)和单调递减栈(栈底到栈顶递减),时间复杂度为O(n)。典型应用包括:1)寻找右侧第一个更大元素(使用单调递减栈);2)计算直方图最大矩形面积(维护左右两侧第一个更小值);3)求解股票价格跨度(寻找左侧第一个更大值)。通过灵活选择入栈顺序和比较条件,单调栈能高效处理多种区间极值问题。
2025-11-20 15:46:38
1169
原创 <vector>
本文详细解析了C++标准库中的vector容器实现原理与使用方法。vector作为动态数组,具有内存连续存储、高效随机访问和自动扩容的特点。其底层通过三个指针管理内存(begin、end、_end_of_storage),当元素数量超过容量时会触发1.5-2倍的动态扩容,导致原有迭代器失效。文章从创建初始化、元素访问、修改操作、容量管理和迭代器等五个维度系统介绍了vector的常见使用方式,并强调了操作时的注意事项,如扩容机制和迭代器失效问题。掌握这些核心知识有助于开发者更高效地使用vector容器。
2025-11-17 22:04:03
634
原创 Makefile入门指南
功能:将变量var作为 “函数模板”,用替换模板中的(参数占位符)。示例:# 定义模板变量(参数$(1)、$(2)为占位符)# 调用模板,传递参数a和bresult = $(call template,a,b) # result的值为a_b.txtMakefile 通过规则定义、变量、函数等机制,实现了项目的自动化、增量构建,是 C/C++ 项目中最常用的构建工具。掌握其基础规则和进阶用法,可大幅提升大型项目的开发效率。
2025-11-16 16:56:23
1213
原创 欧拉筛——找出 [2, n] 区间内的所有素数
欧拉筛(线性筛)是一种高效的素数筛选算法,时间复杂度为O(n)。其核心思想是让每个合数只被其最小质因数筛除,避免重复标记。算法通过遍历每个数进行素性判断,将素数存入数组,同时用当前数与其已发现的素数相乘来标记合数。关键优化在于当当前数能被素数整除时立即终止内层循环,确保每个合数仅被其最小质因数筛除一次。这种机制有效减少了不必要的计算,使算法效率达到线性级别,适用于大规模素数查找需求。
2025-11-16 16:18:15
344
原创 GCC入门指南
GCC是Linux环境下开发的核心编译器工具集,支持C/C++等语言。其编译流程分为预处理、编译、汇编和链接四个阶段,可通过选项单独控制。常用命令包括:-o指定输出文件,-Wall开启警告,-g生成调试信息,-I/-L指定头文件和库路径,-D定义宏。GCC支持静态库(.a)和动态库(.so),并可通过优化选项(-O2)提升性能。多文件项目可统一编译或分段处理,数学库等需用-l参数链接。掌握GCC命令能有效控制编译过程,提高开发效率。
2025-11-09 16:44:17
1675
原创 Linux实用操作
本文介绍了Linux终端常用快捷键、软件包管理工具apt、系统服务管理工具systemctl、软连接创建方法、网络传输命令(ping/wget/curl)、端口基础知识、环境变量操作以及压缩工具(tar/zip)的使用。主要内容包括:1. 终端快捷键如Ctrl+C强制停止、Ctrl+D退出等高效操作;2. apt安装/更新/卸载软件包及依赖管理;3. systemctl管理服务状态和系统运行级别;4. 软连接创建与使用技巧;5. 网络诊断与文件传输命令;6. 端口类型与管理方法;7. 环境变量设置与永久配置
2025-11-06 20:18:28
836
原创 Linux用户和权限
本文介绍了Linux系统中的用户权限管理机制。系统包含普通用户和root管理员用户,root拥有最高权限但需谨慎使用。文章详细讲解了用户切换命令su和sudo的使用方法,以及用户组管理操作如groupadd、useradd等。同时阐述了Linux权限控制的三个级别(用户、组、其他)和三种权限(读r、写w、执行x),并介绍了修改权限的chmod命令和修改属主/属组的chown命令。重点强调了普通用户与root用户的权限差异,以及通过sudo临时获取root权限的安全操作方式。
2025-11-06 15:26:48
768
原创 Linux 基本命令
Linux常用命令摘要 Linux命令通过Shell与系统交互,基本格式为命令 [选项] [参数],支持选项组合(如ls -la)。核心命令包括: 文件操作:ls(列出文件)、cd(切换目录)、mkdir(创建目录)、rm -rf(删除目录,慎用)、cp/mv(复制/移动)、cat/less(查看文件内容); 系统信息:df -h(磁盘空间)、top/htop(进程监控)、ps aux(进程快照); 权限管理:chmod(修改权限)、sudo(临时提权); 网络工具:ping(连通测试)、ip addr(查
2025-11-04 22:36:20
839
原创 STM32F103C8T6--DMA
DMA(直接存储器访问)技术可实现外设与存储器间的高效数据传输,无需CPU干预。其核心优势在于减少CPU负担,提升系统效率。存储器类型包括ROM(存储程序代码)、RAM(存储临时变量)和外设寄存器等,各有特定地址范围。DMA初始化涉及配置源/目标地址、数据宽度、传输方向等参数,通过AHB总线工作。使用时需先禁用通道、设置传输计数器再启用,并通过标志位判断传输完成。该技术支持外设到存储器、存储器间等多种传输模式,能显著优化嵌入式系统性能。
2025-10-26 20:59:27
503
原创 STM32F103C8T6--ADC
STM32F103C8T6的ADC模块采用12位逐次逼近型转换器,支持10个外部和2个内部通道。其核心原理是将0-3.3V模拟信号转换为0-4095的数字值,转换过程包括采样保持和二分法逼近。转换时间受时钟频率影响,最大14MHz(PCLK2/6=12MHz),包含1.5周期采样和12.5周期转换。使用前需校准以消除电容误差,可选择单次/连续转换和扫描模式。分辨率达0.8mV(3.3V/4096),寄存器采用16位右对齐存储12位结果。
2025-10-26 20:46:36
425
原创 STM32F103C8T6--外部中断
EXTI中断机制通过GPIO电平变化触发中断,同号引脚共享EXTI线(如PA0/PB0共用EXTI0),需通过AFIO寄存器配置映射。支持上升沿、下降沿和双边沿三种触发方式,中断请求经NVIC裁决后执行。EXTI0-4为独立中断通道,EXTI5-9和EXTI10-15分别共享中断通道,需通过NVIC设置优先级。
2025-10-25 15:18:35
341
原创 STM32F103C8T6--定时器
定时器是嵌入式系统中的重要模块,主要功能包括计数、触发事件和信号生成。根据功能分为高级、通用和基本三类定时器,通过预分频器(PSC)和自动重载寄存器(ARR)控制计数速度和范围。定时器支持多种时钟源和触发模式,包括内部触发(ITR)、边沿检测(TI1_ED)和外部触发(ETR)。输入捕获功能可测量脉冲参数,输出比较可生成PWM等信号。从模式提供复位、门控等同步方式,编码器接口支持正交解码。这些功能共同实现了精准定时、电机控制等应用需求。
2025-10-25 15:18:14
1863
1
原创 STM32F103C8T6--深入GPIO
STM32的GPIO是微控制器与外部交互的基础接口,可实现数字信号输入输出及复用功能。其硬件结构包含保护电路、输出电路和输入电路,支持8种工作模式。输出电路包括推挽和开漏两种方式,输入电路则通过施密特触发器处理信号波动,并提供模拟、浮空、上下拉等多种输入模式。GPIO引脚具有保护二极管,可防止异常电压损坏芯片,5V容忍引脚还支持更高电压输入。
2025-10-20 19:53:42
714
原创 向上取整 和 四舍五入
摘要:本文分析了整数运算中的向上取整和四舍五入技巧。对于向上取整问题(n/m),提出通过计算(n+m-1)/m来实现,利用整数除法的截断特性确保结果正确。对于四舍五入,介绍了(x+y/2)/y的计算方法,该技巧能正确处理边界情况,但仅适用于非负整数运算。这两种方法都利用了整数除法的特性,为计算机编程中的数值处理提供了有效解决方案。
2025-10-20 12:46:44
569
原创 PID——双环PID
摘要:多环PID通过串级控制实现对多个物理量的精确调节,在工业控制中广泛应用。其中双环PID(如位置环+速度环)具有显著优势:1)内环快速抑制扰动;2)分层调试简化参数整定;3)提升系统稳定性和动态性能;4)提高稳态精度;5)增强系统鲁棒性。文中提供了基于STM32的双环PID电机控制代码实现,展示了外环位置控制通过内环速度控制最终输出PWM的典型架构。这种控制方式在需要兼顾动态响应与稳态精度的场合(如电机控制、机械传动)具有重要价值。
2025-10-09 18:03:53
1684
1
原创 PID——输出偏移输&输入死区
摘要:本文介绍了PID控制中输出偏移和输入死区两种优化方法。输出偏移通过在非零输出值上叠加固定偏移量(±5),解决执行器在低输出时无动作的问题;输入死区则在误差绝对值小于5时停止调控,避免微小波动导致的频繁调节。两种方法通常结合使用,既能提高响应速度,又能有效抑制抖动问题。
2025-10-09 18:03:34
339
原创 PID--微分项D
摘要:PID控制中的微分项通过误差变化斜率预测未来趋势,增强系统稳定性但易受噪声干扰。普通PID微分项对目标值突变敏感,微分先行将其改为对实际值微分以减少影响。不完全微分通过低通滤波器平滑微分输出,缓解噪声干扰问题。两种改进方法分别通过调整微分项计算方式(目标值vs实际值)和引入加权平均机制,有效提升了PID控制器的抗干扰能力和响应平稳性。
2025-10-08 18:50:54
705
原创 PID公式的部署与选择
本文介绍了PID控制器的两种离散形式:位置式和增量式。位置式PID直接由连续形式离散化得到,输出全量控制值;增量式PID通过位置式推导得到,输出控制增量。两种形式可通过调整中间变量实现不同特性。文中还给出了位置式PID的C语言代码实现,包括误差计算、积分处理、输出限幅等关键步骤。通过比较两种PID形式的特点,为选择合适的控制算法提供了参考。
2025-10-08 17:27:13
285
原创 PID--积分项I
本文探讨了PID控制中积分项的作用及优化方法。积分项通过累积历史误差消除稳态误差,但会导致系统滞后性和超调问题。文章分析了离散化积分实现方式,指出积分项权重过大时会影响响应速度。针对积分项带来的问题,提出了三种解决方案:积分限幅防止积分饱和、积分分离避免早期误差积累、变速积分动态调整积分作用。这些方法通过合理设置阈值和参数,在保证消除稳态误差的同时,优化系统响应特性。实际应用中需根据具体场景平衡积分项作用,以获得最佳控制效果。
2025-10-06 18:40:32
1771
原创 PID --比例项P
摘要:纯比例(P)控制的PID系统中,输出仅与当前误差成正比。较大的比例系数可加快响应速度但会增大超调,系统通常存在稳态误差。以汽车速度控制为例,当牵引力与阻力平衡时,实际速度将稳定在低于目标值的状态,形成稳态误差。这种现象源于被控对象的自发偏移特性:当比例输出为0时,系统仍会产生固有偏差。实验显示增大比例系数虽能减小稳态误差,但会导致系统震荡。因此仅靠比例控制难以完全消除稳态误差。
2025-10-06 18:40:05
490
原创 以江协科技STM32入门教程的方式打开FreeRTOS——STM32C8T6如何移植FreeRTOS
本文介绍了FreeRTOS实时操作系统在STM32F103C8T6上的移植过程。FreeRTOS通过多任务管理和实时调度,解决了传统单任务系统的局限性,实现多任务有序并发运行。移植核心在于适配硬件环境,包括任务上下文切换、系统时钟节拍和内存管理三个关键问题。文章详细说明了移植步骤:从工程模板准备、FreeRTOS源码获取、文件配置(特别是关键的FreeRTOSConfig.h文件),到中断优先级设置和系统时钟配置。最后通过LED闪烁示例验证移植成功,展示了FreeRTOS在STM32
2025-10-01 19:45:59
1595
4
原创 标准库容器——<set>
C++标准库中的set是一种关联容器,基于红黑树实现,具有自动排序和去重的特性。set通过红黑树保持元素有序性,支持O(logn)时间复杂度的查找、插入和删除操作。元素不可直接修改,必须删除后重新插入。set支持多种初始化方式,提供insert、find、erase等核心操作,以及迭代器遍历功能。与multiset和unordered_set相比,set具有有序性和元素唯一性的特点,适用于需要自动排序且元素唯一的场景。
2025-09-29 15:55:22
929
原创 一次性搞懂异或^
异或运算(XOR)是一种基本位运算,符号为^,遵循"相同为0,不同为1"的规则。它具有自反性(x^x=0)、恒等性(x^0=x)、交换律和结合律等特性,在编程中有多种实用价值:1)无临时变量交换数值;2)查找数组中唯一出现一次的数字;3)翻转特定位;4)判断整数同号;5)简单加密解密;6)计算汉明距离。这些应用利用了异或运算的还原律和位操作特性,实现高效简洁的解决方案,在算法优化和数据加密等场景中有重要作用。
2025-09-28 18:13:24
1706
原创 Brian Kernighan 算法
Brian Kernighan算法是一种高效计算二进制数中1的个数的算法,其核心是利用位运算n&(n-1)消除最右边的1。该算法通过循环次数等于1的个数实现高效计算,优于逐位遍历的暴力法。算法流程包括初始化计数器、循环消除1并计数,直到n变为0。此外,该算法原理还可用于判断2的幂次方,并可通过动态规划扩展计算多个数的比特位数。LeetCode相关题目展示了该算法在解决二进制计数问题中的实际应用。
2025-09-28 17:38:56
1362
原创 C++————快慢双指针寻找链表循环
slowfast在链表中寻找循环点可以使用双指针法,也就是著名的弗洛伊德判圈算法(Floyd's Cycle-Finding Algorithm)。此算法运用两个指针,一个快指针和一个慢指针,借助它们移动速度的差异来判断链表是否存在循环,若存在则找出循环点。
2025-03-13 20:10:14
941
原创 C++————广度优先搜索(基础)
广度优先搜索(Breadth-First Search,简称 BFS)是一种用于遍历或搜索树或图的算法。包含我的世界的模拟,算法讲解,2道进阶题。
2025-02-11 17:39:32
1454
原创 C语言————快速幂
在 C 语言中,快速幂是一种用于高效计算幂运算(即,其中 a是底数base,n 是指数power)的算法。常规的幂运算方法是通过循环将底数a连乘n次,时间复杂度为O(n)。而快速幂算法利用了指数的二进制特性,将时间复杂度优化到了O(log n),在处理大指数时能显著提高计算效率。
2025-02-09 23:02:28
1196
原创 试除法素数判断
素数是指一个大于 1 的自然数,除了 1 和它自身外,不能被其他自然数整除的数。该函数通过排除小于 2 的数、能被 2 或 3 整除的数,然后只检查6k ± 1形式的数是否能整除num,从而高效地判断一个数是否为素数。
2025-02-08 16:16:59
1076
原创 五花八门的排序算法
本文介绍了多种排序算法及其实现原理。冒泡排序通过相邻元素比较交换实现排序,时间复杂度O(n²);选择排序每次选择最小元素放在已排序末尾,复杂度同样O(n²);插入排序将元素插入到已排序部分的正确位置,最好情况O(n)。归并排序采用分治思想,稳定时间复杂度O(nlogn),但需要额外空间;快速排序选择基准值分区递归排序,平均O(nlogn),最坏O(n²)。桶排序通过分桶和桶内排序实现,平均O(n+k)复杂度,适合均匀分布数据。文章还比较了不同算法的时空复杂度及适用场景,指出桶排序在特定情况下能以空间换时间提
2025-02-07 15:09:39
2095
原创 队列<queue>和双端队列<deque>
队列是一种遵循FIFO原则的线性数据结构,支持入队(push)、出队(pop)、判空(empty)等操作。C++中可通过<queue>实现,包含front()获取队首、back()获取队尾元素等功能。双端队列(deque)则支持两端高效操作,底层采用"分段连续存储+中控数组"结构,实现O(1)时间复杂度的双端插入删除和随机访问。deque通过数据块和中控指针数组的配合,既保持随机访问能力,又避免了单一连续数组扩容时的性能问题,是STL中功能灵活的容器之一。
2025-02-03 09:00:00
2685
原创 快速读取技巧
C++快读技术通过优化输入操作提升性能,适用于大规模数据处理。相比标准cin,快读方法(如使用getchar手动解析)能减少类型检查开销,提高读取速度。实现方式包括读取正整数、带符号整数等,也可通过引用简化代码。此外,通过ios::sync_with_stdio(false)和cin.tie(nullptr)可进一步加速标准输入输出,但会禁用与C标准库的同步和输入输出绑定,适合非交互场景。这些优化在算法竞赛等需要高效输入输出的场景中尤为重要。
2025-02-02 09:00:00
1238
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅