自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(111)
  • 收藏
  • 关注

原创 深入 C++ STL:从 unordered_set与unordered_map到底层哈希表的原理与实现

<think>我们还需要生成摘要,所以只输出摘要即可。</think>基于红黑树的set/map与基于哈希表的unordered系列容器,在底层架构、迭代器特性与性能上差异显著。unordered采用链地址法解决冲突,依赖哈希函数与相等判断,平均时间复杂度为O(1)。文中从除留余数法讲到哈希冲突与桶结构,并剖析了迭代器封装与扩容重哈希的实现逻辑。

2026-09-07 21:43:38 326

原创 C++智能指针深度解析:从RAII到现代内存管理

本文系统解析 C++ 智能指针从 RAII 理念到现代内存管理的完整体系。开篇指出手动内存管理的双刃剑属性——任何疏忽都将导致内存泄漏或悬垂指针,从而引出智能指针的诞生价值。文章先阐释 RAII 设计哲学,即"资源获取即初始化",随后逐一剖析标准库四类智能指针:auto_ptr 因拷贝语义缺陷被历史淘汰,unique_ptr 以独占所有权实现零开销转移,shared_ptr 借助堆上引用计数实现共享所有权,weak_ptr 作为旁观者打破循环引用困局。深入底层后,文章揭示 sh

2026-08-31 15:15:35 359

原创 Linux IO模型深度解析:从阻塞IO到epoll高效事件驱动

IO即输入/输出,是计算机与外部设备(如磁盘、网卡、键盘、显示器等)之间交换数据的过程。从操作系统的角度看,IO操作的本质是数据在外设与内存之间的搬运。例如,当程序调用时,操作系统内核会将数据从文件描述符fd对应的外设(可能是磁盘文件、网络套接字、管道等)读取到用户空间的buffer中;调用时,则是将数据从用户空间的buffer写入到外设。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;

2026-08-30 16:50:38 427

原创 HTTP协议深度解析:从请求响应到状态管理与安全传输

HTTP协议作为互联网的基石,其设计简洁而强大。本文从HTTP的本质出发,系统梳理了以下核心知识点:请求与响应格式:HTTP请求和响应都是由报头(头部字段)和正文组成,中间用空行分隔。理解这种格式是进行HTTP编程和调试的基础。GET与POST方法:GET用于获取资源,参数通过URL传递;POST用于提交数据,参数通过正文传递。两者在语义、安全性和使用场景上有明确区分。状态码:1xx信息、2xx成功、3xx重定向、4xx客户端错误、5xx服务器错误。正确理解和使用状态码是设计良好API的关键。

2026-08-27 13:57:07 349

原创 深入理解Linux线程:从进程到轻量级进程的实现原理

从操作系统视角来看,进程是承担分配系统资源的基本实体。一个运行起来的程序,在内核中对应一个结构体,这个结构体包含了进程的所有管理信息——代码、数据、打开的文件、信号处理等。我们以前学习的"进程",本质上是一个内部只有一个执行分支的实体。进程的核心特征在于独立性和资源独占性。每个进程拥有独立的虚拟地址空间、页表、文件描述符表等资源。当创建一个新进程时,操作系统需要为其预先申请一大批资源:内存空间、CPU时间片、I/O设备等,然后将这些资源分配给该进程。fill:#333;important;

2026-08-26 22:16:16 265

原创 Linux网络编程深度解析:从Socket API到自定义协议设计

这篇文章摘要如下: 本文系统介绍了Linux网络编程中Socket通信的核心概念与技术细节。首先讲解了网络地址结构体sockaddr_in及其字节序转换函数,包括htons、inet_pton等关键API的使用场景与线程安全问题。接着深入剖析了TCP协议栈的分层结构和Socket缓冲区机制,通过生产者-消费者模型解释了网络I/O的阻塞原理。最后详细阐述了连接管理相关的listen()和accept()系统调用,包括半连接队列与全连接队列的区别及其对并发性能的影响。文章采用技术图表与代码示例相结合的方式,帮助

2026-08-25 21:22:13 207

原创 UDP Socket编程深度解析:从字节序到服务器架构

本文深入讲解了UDP Socket编程的核心知识点:网络字节序:详细解释了大端序与小端序的区别,介绍了htonl/htons/ntohl/ntohs等字节序转换函数,以及IP地址的字节序处理方法。Socket地址结构体:阐述了sockaddr通用结构体及其派生结构重点讲解了IPv4专用的sockaddr_in结构体介绍了IPv6的sockaddr_in6结构体说明了本地通信的sockaddr_un结构体UDP核心API:socket()创建

2026-08-25 20:36:54 513

原创 网络协议与通信原理深度解析

本文探讨了网络协议的分层设计及其在数据传输中的应用。文章首先阐述了协议分层思想的必要性,指出物理距离、主机定位、数据丢失和进程区分是网络通信面临的四大核心问题。随后详细介绍了TCP/IP协议栈的四层结构:应用层提供网络服务接口,传输层确保端到端可靠传输,网络层负责路由选择,数据链路层处理相邻节点通信。分层设计带来了独立性、灵活性和标准化优势。文章还分析了局域网通信中MAC地址和冲突检测机制的作用,以及跨网络通信时IP地址和路由选择的关键性。通过分层协议的设计,不同设备和系统得以实现高效、可靠的网络通信。

2026-08-24 14:24:32 460

原创 Linux:从中断视角深度解析 信号保存机制

本文从操作系统内核角度深入剖析了中断与信号的关联机制。硬件中断(如时钟、键盘)和CPU异常(如除零、页错误)会触发内核中断处理程序,这些程序运行在不可睡眠的中断上下文中。由于无法立即调用用户态信号处理函数,内核通过以下路径保存信号:1)设置进程控制块中的shared_pending.signal位图;2)标记TIF_SIGPENDING标志;3)在进程返回用户态时通过do_signal()交付信号。文章通过流程图和代码片段详细展示了从中断到信号保存的内核处理路径,揭示了操作系统如何实现异步事件通知的底层机制

2026-04-26 12:12:25 623

原创 Linux 信号保存机制深度解析:从内核数据结构到进程状态管理

本文探讨了Linux内核中信号的保存机制。信号作为异步通知机制,其从产生到处理存在时间差,需要可靠的保存方式。文章分析了信号生命周期的三个阶段(产生、等待、交付),重点阐述了内核如何通过位图数据结构sigset_t高效表示信号集合,并详细解析了进程控制块中与信号相关的关键字段(blocked、pending等)。通过分层保存设计,Linux实现了信号的可靠存储和处理,包括位图操作的高效性和实时信号队列管理。该机制确保了异步信号在进程未准备好处理时不会丢失,为系统可靠性提供了基础保障。

2026-04-26 12:00:36 418

原创 Linux 进程信号深度解析:从概念到产生机制

本文深入解析Linux进程信号机制,从本质概念和产生方式两大维度展开。信号作为异步事件通知机制,是内核与用户进程交互的关键纽带,具有三态生命周期(产生→挂起→递送)和64位挂起位图等核心设计。信号产生方式分为三类:硬件异常(如SIGSEGV/SIGFPE)、软件条件(如SIGPIPE/SIGALRM)和终端输入(如SIGINT/SIGQUIT)。文章通过思维导图系统梳理了信号分类体系,并剖析了底层实现机制,包括硬件异常处理流程和系统调用路径。最后强调信号在调试分析、健壮性设计和系统管理中的实践价值,帮助开发

2026-04-21 16:48:40 489

原创 Linux 进程间通信:命名管道与 System V 共享内存深度解析

本文深入探讨了Linux系统中的两种关键IPC机制:命名管道(FIFO)和System V共享内存。命名管道通过文件系统路径实现进程间通信,突破了匿名管道必须具有亲缘关系的限制,其核心在于文件系统抽象和内核缓冲区的使用。文章详细解析了FIFO的创建、打开规则(包括阻塞语义)以及安全删除模式,并通过多写者单读者模型展示了实际应用。System V共享内存则采用零拷贝设计,通过内存映射实现高性能进程间数据共享。两种机制各有侧重:命名管道强调进程解耦,共享内存注重性能优化,开发者可根据具体场景选择合适的IPC方案

2026-04-14 22:21:11 479 1

原创 Liunx深入理解进程池:从原理到C++实现的全链路解析

本文介绍了C++进程池技术的核心原理与实现。进程池采用Master-Slaver架构,通过预先创建固定数量的子进程复用处理任务,避免频繁创建销毁进程的开销。Master进程负责任务分发和子进程管理,Slaver进程阻塞等待并执行任务。使用匿名管道实现高效IPC通信,支持EOF触发优雅退出。文章详细解析了代码架构设计,包括Channel类、ProcessPool类、任务执行流程等,并讨论了关键问题如FD泄漏、优雅退出机制和负载均衡算法。最后总结了进程池的性能优势、优化方向以及典型应用场景,为高并发服务开发提供

2026-04-01 13:13:36 388

原创 基础算法:搜索(初阶)

本文介绍了两种常见的搜索算法应用:枚举子集和组合型枚举。通过深度优先搜索(DFS)实现,文章首先讲解了搜索算法的基本概念,包括DFS和BFS的区别及回溯思想。接着详细解析了两道典型题目:递归实现指数型枚举(枚举所有子集)和组合型枚举(从n个数中选k个的组合)。解题思路部分通过流程图直观展示了递归过程,强调字典序处理和剪枝优化。参考代码部分提供了清晰的C++实现,展示了如何通过回溯机制遍历所有可能解。全文采用结构化讲解方式,适合编程学习者理解搜索算法的实际应用。

2026-03-28 20:09:33 161

原创 深入理解 Linux 管道通信:从内核原理到并发实现

文章摘要 本文深入剖析Linux管道通信机制,从内核缓冲区原理到实际应用场景,全面解析进程间通信的核心技术。文章首先揭示管道作为内核维护的字节流缓冲区的本质特性,包括单向半双工通信、亲缘进程限制等5个核心特点。随后重点分析4种典型场景下的管道行为:读空/写满阻塞、子进程写入父进程不读导致的阻塞、读端关闭触发EOF检测,以及最危险的写端存在而读端关闭引发的SIGPIPE信号问题。通过Mermaid流程图和时序图直观展示管道读写过程中的内核同步机制和进程交互,帮助开发者深入理解管道通信的底层原理与异常处理要点,

2026-03-28 09:58:10 635

原创 深入理解Linux进程间通信(IPC)——从原理到匿名管道实战

本文介绍了进程间通信(IPC)的基本概念和管道通信机制。主要内容包括: IPC概述 解决进程间数据传递、资源共享等问题 发展历程:从管道到System V IPC再到POSIX IPC和套接字 本质是让不同进程访问同一份公共资源 管道通信 分类:匿名管道(亲缘进程)和命名管道(任意进程) 原理:通过内核缓冲区实现单向数据流动 采用文件I/O接口,符合Linux"一切皆文件"理念 匿名管道详解 使用pipe()系统调用创建 典型通信流程:父子进程通过文件描述符共享管道 支持单向通信,需正确

2026-03-27 18:12:20 391

原创 Linux从启动到运行:深入理解静态链接与动态链接

本文从汇编视角解析程序启动原理,剖析静态链接与动态链接的核心机制。静态链接通过编译时拷贝库代码到可执行文件,实现独立部署但体积膨胀;动态链接则采用运行时共享库技术,多进程共用同一份代码节省资源。文章详细介绍了_start启动例程的初始化过程、链接器的符号解析与地址重定位机制,并对比两种链接方式的优缺点,帮助读者深入理解程序从编译到执行的全链路工作原理。(149字)

2026-03-23 11:54:27 682

原创 Linux从源码到运行:应用程序链接、加载与分发全解析

本文深入解析Linux应用程序从源码到运行的全生命周期,重点剖析编译链接、程序加载、符号解析与重定位等核心机制。文章首先介绍编译四阶段(预处理、编译、汇编、链接)及链接器的符号解析与重定位工作,详细说明ELF文件结构。随后阐述程序加载过程,包括内核创建虚拟地址空间、动态链接器初始化等关键步骤,并图解进程内存布局。最后分类讲解ELF符号类型(全局/局部/弱符号)及其特性,帮助开发者深入理解Linux程序运行背后的系统机制。

2026-03-19 10:16:30 465

原创 Linux下动静态库从入门到实战:原理、制作与踩坑全解析

本文深入解析Linux下C/C++开发中的动静态库原理与实践。静态库(.a)在编译时嵌入代码,生成独立可执行文件但体积较大;动态库(.so)运行时加载,节省内存但需依赖环境。文章通过流程图对比两者差异,并给出具体制作方法:静态库用ar工具打包.o文件,动态库需-fPIC和-shared参数。重点解决动态库"找不到"问题,提供编译参数说明(-I、-L、-l)和验证方法(ldd/file命令)。通过实例演示静态链接程序体积显著增大的现象,帮助开发者根据场景选择合适的库类型。

2026-03-15 14:02:36 406

原创 基础算法:差分

本文介绍了差分数组的概念及其应用。差分数组通过将区间操作转化为两次单点操作,大幅提升了处理区间修改问题的效率。文章详细讲解了差分数组的定义、初始化方式、区间修改操作原理以及最终数组的还原方法,并通过示例演示了具体计算过程。最后提供了两种参考代码实现:双数组版和更节省空间的单数组优化版,适用于高效解决大规模区间修改问题。差分数组特别适合需要多次区间修改后一次性查询结果的场景。

2026-03-11 16:42:30 430

原创 基础算法:前缀和

本文介绍了前缀和算法的核心思想与解题步骤。前缀和通过预处理构建辅助数组,将区间求和问题的时间复杂度从O(n)优化到O(1)。文章详细讲解了一维前缀和的构建方法(pre[i] = pre[i-1] + nums[i-1])和查询公式(sum = pre[r+1] - pre[l]),并通过图表对比传统方法与前缀和方法的效率差异。最后给出前缀和的适用场景(如多次查询区间和、统计子数组数量等)和模板代码实现思路。前缀和算法以空间换时间,是解决区间求和类问题的高效方案。

2026-03-07 19:33:59 448

原创 Linux:从零实现简易IO缓冲区:模拟C标准库文件操作

这篇文章介绍了C语言中文件IO操作的高效原理——内存缓冲区的使用,并通过代码实现了一个简化版的IO缓冲区系统。文章首先通过流程图展示了缓冲区的核心工作原理,包括行缓冲和全缓冲两种模式的差异。随后详细给出了自定义实现的头文件和源文件代码,其中包含了文件打开、数据写入、缓冲区刷新和文件关闭等核心功能的实现。通过模拟标准库的FILE结构体,作者展示了如何利用内存缓冲区减少磁盘IO次数,从而提升程序性能。该实现可作为理解标准库文件操作底层机制的教学示例。

2026-03-06 14:48:56 400

原创 Linux:深入理解缓冲区——从C语言IO到OS内核的效率之道

本文深入解析了C语言编程中缓冲区的核心概念和工作原理。缓冲区分为语言级(用户态)和内核级(内核态)两种:语言级缓冲区由C标准库管理,根据目标设备采用行缓冲或全缓冲策略;内核级缓冲区由操作系统管理,通过页缓存优化IO性能。文章通过代码示例展示了不同缓冲模式的行为差异,特别是fork()调用对缓冲数据的影响。理解缓冲区的运作机制对提升程序IO效率和正确性至关重要。

2026-03-05 14:26:28 439

原创 Linux从基础IO到内核:一文吃透文件操作的底层逻辑(下)

摘要: 本文深入解析Linux文件操作的底层逻辑,揭示文件描述符(fd)在内核中的本质——task_struct中的fd_array[]数组下标,每个元素指向一个struct file结构体。通过关闭标准输出(fd=1)并打开新文件,演示了重定向的底层实现:修改fd_array的指针指向,使上层函数(如printf)自动将输出转向文件。进一步介绍dup2系统调用的原子化实现,通过复制fd指向同一文件,避免竞态问题。全文以代码和流程图结合,阐明从用户态到内核态的文件操作全链路,解答Shell重定向和“一切皆文

2026-03-03 19:59:03 437

原创 基础算法:双指针

本文介绍了双指针算法的核心概念和应用场景。双指针(又称滑动窗口或尺取法)通过两个指针同向移动优化暴力枚举,实现时间复杂度从O(n²)到O(n)的优化。文章以判断回文字符串"racecar"为例,通过7个步骤的流程图解详细演示了双指针的工作过程:初始化指针位置→逐次比较对称字符→指针向中间移动→最终确认回文性质。案例展示了双指针"不回退"的特点——左右指针始终单向移动,最终在中间位置相遇完成验证。该算法适用于字符串处理、数组遍历等多种场景,能有效提升程序效率。

2026-03-02 21:59:39 706

原创 Linux从基础IO到内核:一文吃透文件操作的底层逻辑(上)

本文系统性地讲解了Linux文件操作的底层原理。从文件的二元结构(内容与属性)出发,详细剖析了文件路径解析、打开模式映射、随机访问机制等核心概念。重点阐述了文件描述符的本质是进程文件描述符表的数组下标,以及内核通过三层数据结构(进程描述符、文件对象、inode)管理打开文件的机制。通过Mermaid图表和代码示例,完整呈现了从用户态到内核态的文件IO链路,帮助读者深入理解Linux文件系统的运作原理。

2026-03-01 20:57:18 674

原创 基础算法:枚举(上)

本文介绍了暴力枚举算法的核心要点,并通过两道例题(铺地毯、回文日期)展示具体应用。在铺地毯问题中,采用倒序遍历地毯数组判断目标点覆盖情况;回文日期问题则提出三种策略:暴力枚举所有日期、枚举年份生成回文月日、枚举月日拼接回文年份,重点分析了各策略的时间复杂度与适用场景。代码示例展示了高效实现方法,强调枚举对象选择、遍历顺序优化及边界条件处理的重要性。

2026-02-21 20:50:12 702 1

原创 基础算法:高精度

本文介绍了高精度算法的基本概念和应用场景,重点讲解高精度加法和减法的实现方法。高精度算法通过字符串读入超大整数,用数组逆序存储并模拟竖式计算过程。加法部分通过逐位相加和进位处理完成运算;减法部分需先比较大小,再处理借位和前导零。文章提供了详细的解题思路、代码逻辑和关键细节分析,并附有参考代码实现。该算法有效解决了C++中普通整型无法存储超大整数运算的问题,适用于需要处理超长数字的编程场景。

2026-02-12 20:45:24 674 1

原创 基础算法:模拟

本文介绍了模拟算法的核心思想和应用,通过两道典型题目展示其解题思路。模拟算法的关键在于"依葫芦画瓢"——严格按照题目描述的步骤转化为代码逻辑,重点考察代码严谨性和流程转化能力。在"多项式输出"题中,通过拆解符号、系数、指数的处理规则完成格式化输出;"蛇形方阵"则利用方向向量模拟螺旋填数过程。两题均强调先手动推演流程再编码,适合锻炼基础编程能力。

2026-02-07 22:39:21 701

原创 算法竞赛中cin常用的成员函数

本文总结了C++中cin相关5个关键函数在算法竞赛中的应用:1. cin.get()用于逐字符读取(含空白字符);2. cin.ignore()用于清理缓冲区(特别是换行符);3. cin.getline()用于整行读取(含空格);4. cin.clear()用于重置输入流错误状态;5. cin.peek()用于预读字符。这些函数覆盖了竞赛中95%的输入处理场景,特别强调了ignore()与clear()的搭配使用,以及处理带空格输入时的技巧,是高效处理竞赛输入的核心方法。

2026-01-30 13:07:21 665

原创 算法竞赛:C/C++的输入与输出

本文介绍了C/C++算法竞赛中常用的高效IO函数getchar、putchar以及scanf、printf的使用技巧。重点讲解了getchar和putchar作为字符级IO函数的优势,包括快速读写模板的实现、输入输出格式处理及竞赛避坑要点。同时对比了scanf和printf在格式化IO中的易用性,提供了不同场景下的优化方案。文章还强调了这些函数在算法竞赛中的核心作用,如处理海量数据时的效率优势,并给出了具体代码示例和使用建议,帮助编程竞赛选手提升IO性能。

2026-01-30 10:56:08 660

原创 Linux:环境变量

本文介绍了Linux环境变量的概念、常见类型及获取方式。环境变量是操作系统级别的动态参数,可被所有进程访问,具有全局性。常见环境变量包括PATH(查找命令目录)、HOME(用户主目录)、SHELL(终端程序路径)等。获取方式分为终端操作和编程实现:终端可通过echo、env、printenv等命令查看;编程中C/C++可用getenv()函数或main函数的envp参数获取,Shell脚本直接使用$变量名读取。环境变量与C/C++进程的关系体现在:它们是进程级配置,进程继承父进程环境变量副本,可通过标准库接

2026-01-28 15:58:29 1049

原创 linux:进程的状态

进程状态详解:运行、睡眠、暂停与挂起 本文详细解析Linux系统中进程的各种状态: 运行状态(R):进程正在CPU执行或处于就绪队列等待调度,R+表示前台进程组进程 睡眠状态: 可中断睡眠(S):等待事件发生(如scanf输入),可被信号唤醒 不可中断睡眠(D):进行磁盘IO等关键操作,无法被中断 暂停状态(T):进程被暂停执行(如收到SIGSTOP信号) 挂起状态:系统级休眠,保持内存供电,快速恢复运行 特殊状态: 僵尸状态(Z):进程终止但未被父进程回收 死亡状态(X):资源已完全释放 文章通过代码示例

2026-01-20 11:13:35 936

原创 算法竞赛中的数据结构:图

摘要 本文系统介绍了图数据结构的基本概念、分类及存储方式。首先定义了图的组成(顶点和边)及其与线性表、树的区别,强调图能表示多对多关系。接着详细分类了图的类型,包括按方向(有向/无向)、权重(无权/带权)、密度(稀疏/稠密)、连通性等维度。重点讲解了邻接矩阵存储方法,通过二维数组表示顶点间的邻接关系,并区分了无权图(布尔值)和带权图(权值/∞)的不同处理方式。最后补充了顶点度数和路径长度等关键概念,为后续图算法学习奠定理论基础。

2025-12-26 21:20:36 1124

原创 linux:初识进程

本文介绍了计算机操作系统的基本概念,从冯·诺依曼体系结构到操作系统的数据管理机制。主要内容包括:1)冯·诺依曼体系五大核心部件及其功能;2)操作系统对数据的管理采用"描述-组织"逻辑,通过属性定义和管理机制实现高效管理;3)进程作为程序执行的基本单位,其核心数据结构PCB(Linux中为task_struct)包含进程标识、状态、CPU上下文等关键信息;4)在Linux系统中可通过/proc目录查看进程详细信息。文章以通俗易懂的方式讲解了操作系统的基础原理和实现机制。

2025-12-17 18:20:45 709

原创 算法竞赛之排序算法

先构建大根堆,再反复交换堆顶与堆尾、调整堆结构,最终得到升序数组。通过随机选基准值减少划分失衡风险,再通过三向划分将序列拆分为“小于、等于、大于”基准的三部分,递归处理前后子序列,最终实现整体有序。这种三向划分方式对存在大量重复元素的序列优化效果显著,可减少递归次数和交换操作。通过递归将原数组不断划分为更小的子区间,直到子区间有序;再从最小的有序子区间开始,逐层合并为更大的有序区间,最终整个数组完成排序。临时数组tmp用于合并过程中暂存数据,避免直接修改原数组导致数据覆盖。

2025-12-07 10:21:40 1228

原创 算法竞赛中的堆

本文介绍了堆的概念、实现与应用。堆是一种完全二叉树结构的优先队列,分为大根堆和小根堆,核心操作包括插入、删除堆顶和取堆顶元素。通过数组实现堆时,利用1-based索引简化父子节点计算,并通过up/down调整维护堆性质。堆的典型应用包括高效找最值、堆排序和多路归并。文章还详细讲解了大顶堆的模拟实现,包括存储结构、核心操作原理和代码实现,并介绍了C++中的优先队列(priority_queue)及其应用场景。堆结构在算法竞赛中常用于解决TopK问题、贪心算法等场景。

2025-11-30 16:33:50 878

原创 算法竞赛中的二叉树

本文介绍了二叉树的基本概念、性质以及存储与遍历方法。主要内容包括: 二叉树概述:定义二叉树为最多有两个子节点的有序树,并列举了其数学性质,如满二叉树的节点数与高度的关系。 存储方式:重点讲解链式存储,使用两个数组l[]和r[]分别记录节点的左右孩子编号,通过下标实现快速访问。 遍历方法:详细说明了DFS(前序、中序、后序)和BFS(层次遍历)的实现。DFS采用递归,BFS借助队列实现按层访问节点。 文章以具体二叉树为例,结合代码展示了存储结构和遍历过程,适合算法学习参考。

2025-11-25 19:19:14 646

原创 算法竞赛中的树

本文介绍了树的基本概念和用vector实现树的存储与遍历方法。首先详细讲解了树的核心术语(如节点、根、叶子节点等)和本质特性(连通性、无环性)。然后重点阐述了通过vector数组模拟邻接表存储树结构,并给出深度优先遍历(DFS)和广度优先遍历(BFS)的具体实现代码。DFS采用递归方式优先访问深层节点,BFS使用队列按层次遍历。文章通过示例树结构演示了两种遍历过程,帮助读者理解树结构的存储和遍历原理。

2025-11-20 21:41:06 629

原创 C++11(上)

本文介绍了现代C++(C++11及后续版本)相较于传统C++(C++98/03)的核心改进,重点讲解了列表初始化机制。主要内容包括: 现代C++特点:引入智能指针、自动类型推导、Lambda表达式、移动语义等特性,提高了安全性、易用性和性能。 列表初始化: 使用花括号{}统一各种初始化场景(变量、数组、结构体、容器等) 解决传统初始化语法歧义,禁止窄化转换提升安全性 简化标准库容器和智能指针的使用 列表初始化与std::initializer_list的区别: 列表初始化是语法规则,适用于所有初始化场景 s

2025-11-18 21:41:27 640

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除