- 博客(46)
- 收藏
- 关注
原创 【C++】【STL】vector_OJ题
本文通过九道C++ STL中vector应用的经典OJ题,系统梳理了四种核心解题手法:位运算(异或、计数)、二维递推(杨辉三角)、原地压缩(双指针)、回溯搜索。每组题目聚焦特定操作模式,强调边界处理(空输入、溢出、越界等)与代码鲁棒性,结合实例代码与编译优化实践,全面覆盖vector在刷题中的高频用法,助力高效掌握数据结构与算法实战技巧。
2026-11-06 09:00:00
6001
23
原创 【C++】【STL】vector
本文系统解析C++ STL中vector的核心机制:作为连续内存的动态数组,其通过三个指针实现长度与容量分离,支持高效随机访问。文章详述五类构造方式、花括号初始化的歧义风险、迭代器即指针的本质及四种形态,强调扩容时的成倍增长策略与迭代器失效问题。重点指出reserve与resize的区别、插入删除导致的性能开销,以及vector<bool>的特殊打包设计,揭示其在频繁中间操作、地址稳定性需求场景下的局限性,为高效使用提供理论支撑。
2026-11-04 09:00:00
6831
18
原创 【C++】【STL】string_OJ题
本文总结了9道C++ STL中关于string的OJ题目,按操作类型分为三组:反转与就地修改(如917、541、151)、计数与查找(如387、125、58)、模拟与大数运算(如415、43、8)。核心技巧包括双指针收敛、字符分类处理、进位控制及边界值处理。所有题目使用同一套源码,在标准库std::string与自定义容器MyString间切换仅需宏定义,验证结果一致性。代码通过随机测试用例与Trace函数逐行比对,确保逻辑正确性,强调接口对齐的重要性。
2026-11-02 09:00:00
4355
26
原创 【C++】【STL】STL 与 string
本文系统讲解STL六大组件(容器、算法、迭代器、仿函数、适配器、空间配置器)及其协同机制,结合string实现剖析深拷贝、写时拷贝与引用计数原理。通过对比SGI、P.J.等版本差异,揭示STL可移植性与标准一致性的重要性,并以basic_string.h源码为例,深入解析string的底层设计与性能特征,强调遵循标准而非依赖特定实现的编程原则。
2026-10-31 09:00:00
4814
46
原创 【数据结构】排序总结与规模实测
本文总结九种排序算法,按是否比较分为比较类(如快排、归并)与非比较类(如计数、基数)。通过实测一万、十万、百万规模数据,对比随机、接近有序、逆序、全等值四种形态下的性能。结果表明:插入排序在接近有序时表现优异,基数排序在值域适中时达线性时间;快排与归并稳定高效,堆排序最坏情况较弱;计数与基数排序因额外空间开销不适用于大值域。实验验证了理论复杂度与实际性能的匹配性。
2026-10-28 09:00:00
2156
26
原创 【数据结构】排序_OJ题(三):逆序对与链表归并
本文总结了归并排序在八道经典题目中的两种核心应用:统计跨段贡献(如逆序对、翻转对、区间和个数)与合并有序段(如链表排序、合并区间)。通过双指针技巧在合并过程中高效计数,或仅调整指针实现有序合并。关键点包括:处理边界情况(空数组、前缀和初始化)、避免整数溢出(使用64位)、正确维护下标与指针。所有题目时间复杂度均为 $O(N \log N)$ 或 $O(m+n)$,代码结构统一,支持暴力验证与随机测试,体现归并排序的灵活性与实用性。
2026-10-26 09:00:00
322
28
原创 【数据结构】归并与外排序
归并排序通过将数组递归拆分并合并有序子段实现稳定排序,支持递归与非递归两种写法。其核心是利用临时数组合并两段有序数据,保证相等元素的相对顺序(稳定性)。递归版结构清晰,非递归版避免函数调用开销,性能略优。归并需额外O(N)空间,无法原地完成,但可通过外排序解决大数据量问题:先将数据分块内排,再多路归并成最终有序文件。该方法在内存不足时仍可高效处理海量数据。
2026-10-25 09:00:00
3694
32
原创 【数据结构】排序_OJ题(二):划分与选择
本文系统对比四种快排写法在排序数组(912)中的性能表现,揭示划分策略在重复值、有序数据下的退化问题。通过三路划分与内省排序优化,显著提升处理极端数据的效率。结合75、324、973等题,阐明划分的三大用途:全排、选第k小、定边界。强调实际应用中应根据数据特征选择算法,避免盲目使用经典快排。
2026-10-24 09:00:00
202
21
原创 【数据结构】快速排序专题
快速排序基于前序遍历递归骨架,通过划分将数组分为小于、等于、大于基准值的三部分。主流实现包括Hoare双指针法、挖坑法与前后指针法,三者在重复元素处理上表现各异:Hoare与前后指针落点不同,易导致不平衡递归;三路划分可高效处理重复数据,提升性能。优化策略包括三数取中选基准、小区间转插入排序、递归转栈非递归及内省排序(深度超限时切换堆排),有效避免最坏情况。平均时间复杂度为 $O(N \log N)$,空间复杂度 $O(\log N)$,是实际应用中最高效的排序算法之一。
2026-10-23 09:00:00
794
26
原创 【数据结构】排序_OJ题(一):计数、桶与排序后的处理
本文系统梳理了12道排序相关OJ题的解题套路,核心思想为“排序后线性处理”。根据输出需求分为三类:逐位比对(如高度检查器)、双指针扫描(如两数组交集、有序数组平方)、查表统计(如H指数、小于当前数的个数)。关键在于选择合适策略——值域较小时用计数排序,大时用基数排序,避免不必要的O(n log n)复杂度。实测表明,当值域≤1万时,计数法比快排快数十倍;值域超亿级则需基数排序。代码实现统一采用主解+暴力对照模式,强调高效与验证并重。
2026-10-21 09:00:00
634
20
原创 【数据结构】简单排序:插入、希尔、选择、冒泡与计数排序
本文系统介绍了五种基础排序算法:直接插入排序、希尔排序、直接选择排序、冒泡排序与计数排序。重点分析了它们的时间复杂度、空间复杂度及稳定性。插入排序基于“摸牌”思想,稳定且对近似有序数据高效;希尔排序通过间隔分组进行插入排序,有效提升乱序数据的性能;选择排序与冒泡排序虽简单但效率较低,且均不稳定;计数排序突破比较排序下界,适用于整数范围有限的情况。文中还深入探讨了逆序对与算法性能的关系,并强调稳定性在多级排序中的关键作用。
2026-10-20 09:00:00
2791
28
原创 【Linux】自主 Shell
本文从零实现一个简易Linux Shell,涵盖提示符显示、命令读取与解析、内建命令(如cd、export、exit)处理及外部命令执行。通过fork+execve实现进程替换,利用waitpid等待子进程结束,确保不占用CPU。重点解析了提示符中环境变量的可靠性问题,强调使用gethostname替代HOSTNAME;详细讨论了fgets读行时的边界情况处理,包括长行截断、空行与文件结尾的区分,并指出缓冲区刷新对重定向输出的重要性。最终实现一个能正确运行常见命令的小型交互式Shell。
2026-10-18 09:00:00
2619
26
原创 【Linux】进程程序替换
本文详解Linux中程序替换机制,核心为execve系统调用——它用新程序覆盖当前进程的用户空间,保留进程号、文件描述符等属性。其余六个exec接口均为库函数封装,分别支持参数逐个传递(l)、数组传递(v)、PATH查找(p)及自定义环境表(e)。通过对比各接口行为,揭示其参数与环境变量的继承或自定义特性,强调只有execve直接调用内核,其余均在用户态完成前置处理。
2026-10-17 09:00:00
2593
28
原创 【Linux】进程等待
本文系统讲解Linux进程等待机制,重点剖析僵尸进程成因与回收必要性。通过实例演示子进程退出后父进程必须调用wait或waitpid回收其状态信息,否则将形成僵尸进程(Z状态)。详细解析wait与waitpid参数差异,包括status低16位的退出码、信号等信息提取方法,以及WNOHANG非阻塞轮询与阻塞等待的区别。强调父进程需主动回收子进程,避免资源泄漏,并说明多子进程回收顺序由调度器决定,确保进程管理的正确性与系统稳定性。
2026-10-16 09:00:00
2861
26
原创 【Linux】进程的创建与终止
本文详解Linux中进程创建与终止的核心机制。通过fork()系统调用实现进程分裂,一次调用返回两次:子进程获0,父进程获子进程PID。父子共享代码段,采用“写时拷贝”(COW)优化内存使用,可通过smaps验证。进程退出有三种场景,exit()与_exit()区别在于是否刷新缓冲区。vfork()则共享地址空间,需谨慎使用。文中结合实例演示了进程并发执行的不确定性及同步必要性,揭示了进程管理的本质逻辑。
2026-10-15 09:00:00
4597
30
原创 【C++】模板初阶
本文介绍了C++模板的初阶概念,重点阐述泛型编程的思想——用一套代码适配多种类型。通过对比函数重载与函数模板的写法,展示了模板如何减少重复代码、提升维护性。文中详细讲解了函数模板的定义语法(template<class T>或template<typename T>)、实例化机制(编译期生成对应类型代码)、实参推导规则及匹配原则,并指出模板本质是“代码生成器”,每个类型实例化出独立函数,确保高效与类型安全。
2026-10-14 09:00:00
3780
28
原创 【C++】内存管理
本文系统梳理C++内存管理核心知识,详解进程地址空间分段(栈、堆、数据段、代码段等),通过实际代码演示全局变量、局部变量、动态分配内存等在不同区域的分布。重点对比malloc与new的差异,揭示new底层调用operator new申请内存并调用构造函数的完整流程,以及delete反向执行析构与内存释放的过程。结合/proc/self/maps验证内存映射位置,直观展示堆与栈的生长方向及内存布局规律,为理解动态内存管理提供坚实基础。
2026-10-12 09:00:00
3655
24
原创 【C++】类与对象(末):static、友元与拷贝优化
本文系统讲解C++类与对象中的关键概念:构造函数初始化列表与函数体的执行顺序,强调初始化列表决定成员初值,且初始化顺序由成员声明顺序决定;详解static成员的特性与用途;介绍友元函数/类的访问权限突破机制;阐述内部类与匿名对象的语法应用;最后分析编译器拷贝优化(如拷贝省略)对程序行为的影响,结合实例展示优化前后的差异,帮助开发者避免因优化导致的调试误区。
2026-10-11 09:00:00
5030
24
原创 【C++】类和对象(下):运算符重载
本文深入讲解C++运算符重载的核心概念,涵盖其必要性、实现方式(成员函数与全局函数)、重载规则及限制。通过日期类实例说明重载如何使自定义类型支持内置运算符,保持优先级与结合性一致。文章还解析了符号表中重载函数的命名机制、对象大小不变性,并强调重载仅扩展行为不增加数据体积,最后指出运算符重载需遵循五条严格限制,确保语法合法与语义清晰。
2026-10-10 09:00:00
4507
27
原创 【C++】类和对象(中):默认成员函数
本文系统讲解C++类与对象中的默认成员函数,涵盖构造、析构、拷贝构造、赋值重载等六大默认函数的生成机制与使用场景。通过编译器报错信息分析,揭示不同标准下默认函数的差异,强调构造函数初始化对象状态、析构函数清理资源的核心作用,并以日期类为例展示实际应用。重点指出:编译器仅在必要时生成默认函数,自定义后需注意其联动影响,为深入理解对象生命周期管理提供清晰路径。
2026-10-09 09:00:00
6321
12
原创 【数据结构】二叉树_OJ题
本文系统梳理二叉树经典OJ题的五大解题套路:递归(如单值、对称、翻转)、迭代栈模拟(前/中/后序遍历)、队列层序遍历、序列化比对、利用结构性质优化(如完全二叉树节点数)。强调递归核心为“当前结点+子树结果”,并重点分析空树、链状、满树等边界情况。代码工程统一建树与遍历框架,支持多种实现方式,兼顾效率与可读性,适用于面试与算法训练。
2026-10-08 09:00:00
5238
14
原创 【C++】类与对象(上):类、实例化与 this 指针
本文系统讲解C++类与对象的基础概念,涵盖类的定义格式、访问限定符与封装机制、实例化过程及对象内存布局。重点说明类作为自定义类型,可封装数据与操作函数,实现数据安全;通过this指针解析成员函数调用时的隐含参数,揭示对象在内存中的存储方式,包括空类占1字节的原因及内存对齐规则。结合代码示例,深入剖析类与对象的关系,为后续面向对象编程奠定基础。
2026-10-07 09:00:00
5270
26
原创 【C++】命名空间、缺省参数、函数重载与引用
本文介绍了C++中的命名空间、缺省参数、函数重载与引用等核心概念。通过对比C语言的全局命名冲突问题,阐述了命名空间如何隔离标识符,避免重定义;展示了using namespace std的使用方式及其代价;解析了cout/cin的流式输出机制与编译链接过程;说明了缺省参数与函数重载在类型安全下的灵活应用,并引入引用作为变量别名,提升效率与可读性。
2026-10-06 16:53:55
13078
224
原创 【数据结构】二叉树
二叉树是结点度不超过2且有左右次序的非线性结构,具有递归特性。核心知识点包括:树的术语(如度、层次、高度)、三种存储方式(双亲、孩子、孩子兄弟表示法),二叉树的性质(第i层最多2^(i-1)个结点,深度h的树最多2^h-1个结点,叶子数=度为2的结点数+1),链式存储结构定义,以及前序、中序、后序三种递归遍历。其中,后序遍历用于销毁树,确保子树先于父结点释放。完全二叉树可顺序存储,效率高;手工建树便于理解,后续可通过序列还原。
2026-10-05 09:00:00
5257
31
原创 【Linux】命令行参数、环境变量与程序地址空间
本文系统讲解了Linux中命令行参数、环境变量与程序地址空间的核心概念。环境变量(如PATH、LD_LIBRARY_PATH)用于配置运行环境,全局性但进程独立;命令行参数通过argc和argv传递,由shell解析后传入程序,支持通配符展开与选项解析;指令选项通过字符串匹配实现,遵循短/长选项规范;程序地址空间涉及栈布局、页表及写时拷贝机制,保障内存安全与效率。内容涵盖从输入处理到执行环境的底层原理。
2026-10-04 16:33:08
12295
22
原创 【数据结构】堆_OJ题
本文系统梳理了堆在算法题中的五大核心应用:维护K个候选、多路归并、对顶堆、值域二分与模拟过程,结合边界处理(如K与数据量关系、重复元素、空/单元素等)和十二道典型题目,展示了堆的灵活运用。通过手写堆排序、TOP-K、合并链表、丑数生成等实例,强调堆的核心操作——插入、取顶、调整,并指出实际编码中需关注类型溢出、负数处理及逻辑边界。代码结构清晰,共用堆实现,支持小堆与大堆切换,适用于面试与竞赛场景。
2026-10-04 09:00:00
5282
20
原创 【数据结构】堆
堆是基于完全二叉树的顺序存储结构,通过下标关系(左孩子2i+1、右孩子2i+2、父节点(i-1)/2)实现高效访问。堆分为大堆(父结点不小于孩子)和小堆(父结点不大于孩子),堆顶为极值,支持O(1)取极值。核心操作向下调整算法通过循环比较与交换,确保父子关系满足堆性质,时间复杂度O(log N)。建堆从最后一个非叶子结点开始,整体复杂度为O(N)。堆可应用于堆排序与TOP-K问题,具有高效、稳定的特点。
2026-10-03 09:00:00
2182
20
原创 【Linux】进程(下)上下文、运行队列与调度器的更替
本文系统阐述了Linux进程调度的核心机制:从串行到并发假象的演进,揭示了上下文切换的本质——保存与恢复任务状态(如寄存器、栈、页表等),以实现多任务伪并行。重点分析了调度器如何通过运行队列、优先级体系与时间片管理,在O(1)调度器基础上发展为更精细的CFS与EEVDF调度算法。同时指出并发带来的两大挑战:共享数据竞争与执行时序依赖,并强调程序必须通过互斥与同步机制来保障正确性。
2026-10-02 09:00:00
11822
220
原创 【数据结构】队列_OJ题
本文系统梳理了队列在八道经典OJ题中的应用,按“过程模拟、容器设计、单调队列、循环决策、字符串处理”五类归纳解题套路。重点剖析了最近请求次数、滑动窗口最大值等高频题型,强调边界处理(如时间3000毫秒的闭区间判断)与核心技巧(如单调队列维护下标、循环报数中下标加圈长重入)。通过实例代码展示基于数组的队列实现,均摊时间复杂度优化至O(1),并指出约瑟夫环问题中数学递推法相比队列模拟的效率优势。
2026-10-01 09:00:00
874
14
原创 【数据结构】队列
队列是遵循先进先出(FIFO)原则的线性数据结构,插入在队尾,删除在队头。实现方式包括链表和数组,链表实现通过头尾指针支持O(1)的入队与出队,但存在内存分散问题;数组实现中,循环队列通过下标取模解决空间浪费,但需区分队空与队满。常用场景包括任务调度、消息队列等。实测表明,避免数据搬移的循环队列性能远优于普通数组队列。
2026-09-30 09:00:00
613
6
原创 【数据结构】栈_OJ题
本文系统梳理了栈在十二道经典OJ题中的六大应用套路:配对消除、容器互倒、辅助栈记账、过程模拟、单调栈与字符串分层。通过分析每类题的核心逻辑与边界处理(如栈空、嵌套、内存管理),总结出判断是否用栈的两大依据:是否存在“最近未处理”关系或“找右侧首个更大/小元素”需求。十二题覆盖主流考点,时间复杂度普遍为O(n),空间上除原地栈外多为O(n)。代码实现基于三类动态数组栈,强调判空、内存安全与可读性,适合面试准备与算法训练。
2026-09-29 09:00:00
541
6
原创 【数据结构】栈
栈是一种后进先出(LIFO)的线性结构,仅允许在栈顶进行插入(入栈)和删除(出栈)操作。实现上通常采用数组(静态/动态栈),动态栈通过翻倍扩容策略保持均摊O(1)性能,装载因子控制在50%~100%之间。链表实现虽灵活但开销大,工程中优先选用数组。七个核心接口包括初始化、销毁、入栈、出栈、取栈顶、判空与求大小,统一以top指向栈顶下一位置,避免边界混乱。初始化不申请空间提升鲁棒性,销毁后清零指针便于调试。实测表明数组栈性能远超链表栈,且内存分配更高效。
2026-09-28 09:00:00
624
8
原创 【数据结构】链表_OJ题
链表OJ题核心在于指针操作,掌握三类技巧:改指针(如删除、反转)、快慢指针(找中点、环检测)、哨兵位(统一头节点处理)。重点应对空链表、单节点、头节点变动等边界情况。典型题目涵盖移除元素、反转、合并、相交、成环判断及深拷贝,均以O(1)空间复杂度为目标,强调画图分析与逻辑严谨性。
2026-09-27 15:00:00
870
6
原创 【数据结构】链表
链表是重要的线性数据结构,核心在于通过指针实现逻辑连续。八种结构由方向(单向/双向)、头结点(带头/不带头)和循环性(循环/非循环)组合而成,实际应用中以无头单向非循环和带头双向循环链表为主。前者适合面试,后者工程常用。链表节点包含数据域与指针域,物理存储不连续,访问需遍历,故无随机访问;但插入删除只需修改指针,效率高。带头哨兵位可统一接口逻辑,避免空表特判。顺序表与链表对比凸显其动态性优势,但内存开销大。结合CPU缓存局部性原理,链表因节点分散导致缓存命中率低,影响性能。
2026-09-27 09:00:00
494
4
原创 【数据结构】顺序表_OJ题
本文系统梳理了数组类OJ题的五大核心解题套路:快慢指针(移除元素、去重)、左右指针(合并有序数组)、三次逆置(轮转数组)、位运算(异或求和、摩尔投票)及二分查找。强调原地操作与边界处理的重要性,涵盖空数组、全符合/不符合、进位溢出等典型场景。通过12道经典题目解析,展示如何在O(1)空间复杂度下高效解决问题,突出算法思维与细节把控的关键作用。
2026-09-26 15:00:00
543
6
原创 【数据结构】顺序表
顺序表是线性表的顺序存储实现,通过数组+管理信息(size、capacity)构成。动态顺序表支持扩容,尾插均摊O(1),头插/删为O(n)。核心设计包括:类型别名提升可维护性,三成员分工明确,按需分配内存。接口分三类:内存管理(初始化/销毁/扩容)、数据操作(增删查改)、打印展示。扩容采用“首次4个,之后翻倍”策略,结合realloc实现高效扩展,配合valgrind验证内存安全。
2026-09-26 09:00:00
570
4
原创 【数据结构】时间复杂度和空间复杂度
本文系统讲解数据结构中的时间复杂度与空间复杂度,介绍大O表示法的推导方法及七种常见复杂度类型。通过实例分析循环、递归等场景下的时间复杂度计算,强调关注增长趋势而非精确次数。重点解析O(1)随机访问、O(log n)二分查找、O(n)线性遍历等典型模式,并阐明递归空间复杂度取决于调用深度而非次数。结合代码实测,直观展示不同复杂度随数据规模的增长差异,为算法性能评估提供理论依据。
2026-09-25 15:00:00
2022
9
原创 【Linux】进程(中)状态、优先级、内核链表与调度
问:进程有哪些状态?核心要点:内核里定义了 R、S、D、T、t、X、Z 七种。常用的说法是运行、可中断睡眠、不可中断睡眠、停止、追踪停止、死亡、僵尸。R 只表示在运行队列里,不代表正在执行。问:僵尸进程是怎么产生的?核心要点:子进程退出后,退出状态要留给父进程读,所以 task_struct 不能立刻释放。父进程一直不调用 wait 或 waitpid 读走退出码,子进程就一直停在 Z 状态。问:僵尸进程有什么危害?
2026-09-25 09:00:00
885
2
原创 【Linux】进程(上)从冯诺依曼到 fork
本文从冯诺依曼体系结构出发,阐明数据必须通过内存流转的原理,引出操作系统作为“管理者”的核心角色。通过“描述(结构体)+组织(链表)”的管理范式,解析进程的本质:进程 = task_struct(PCB) + 代码与数据。结合系统调用与库函数分层,揭示用户程序如何通过接口访问内核资源。重点剖析 fork 的双重返回机制,实现代码共享、数据私有,最终展现进程创建与管理的底层逻辑。
2026-09-24 09:00:00
489
7
原创 【Linux】gdb/cgdb 实战
本文通过四版进度条代码,实战演示了gdb与cgdb调试工具的使用。重点讲解了-g编译选项对调试信息的重要性,cgdb的上下分屏界面与快捷键操作,以及break、step、watch、display、bt等核心调试命令的应用。结合条件断点解决循环中偶发错误,深入剖析函数指针与回调机制,并通过越界问题揭示静态变量、缓冲刷新与内存安全等关键概念,全面展现Linux下高效调试的完整流程。
2026-09-23 09:00:00
566
8
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅