自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 map和set【C++】

本文摘要: C++标准库中的关联式容器set和map基于红黑树实现,具有自动排序特性。set存储唯一元素,map存储键值对,两者插入、删除、查找时间复杂度均为O(logn)。set元素不可修改,map的value可改但key不可变。使用时需注意迭代器失效问题,删除元素后原迭代器会失效。map通过[]运算符可实现键值访问/插入,set/map支持自定义排序规则。底层实现上,set和map共用红黑树模板,通过仿函数区分键值比较逻辑。迭代器采用中序遍历方式实现,支持双向移动但不支持随机访问。

2026-07-16 19:18:39 249

原创 红黑树【C++】

红黑树是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black,通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因而接近平衡的。

2026-07-02 21:06:57 186

原创 Git的原理与使用

本文详细介绍了Git版本控制系统的安装、基本操作及高级功能。主要内容包括:1. Git安装与初始化(Ubuntu环境);2. 基本操作:配置用户信息、文件提交、版本查看与状态检查;3. 版本回退与修改撤销的多种方法;4. 分支管理:创建/切换/合并分支及解决冲突;5. 远程仓库操作:克隆/推送/拉取及忽略文件配置;6. 标签管理:创建/删除本地和远程标签。文章通过具体命令示例和操作流程,全面讲解了Git的核心功能和使用技巧,适合开发者系统学习Git版本控制工具。

2026-06-09 14:49:15 282

原创 vector的增删改查模拟实现(简单版)【C++】

vector的增删改查模拟实现(简单版)【C++】

2025-07-31 18:40:47 1045

原创 堆和堆排序【数据结构】

堆(Heap)是一种数据结构,它是 **一种特殊的二叉树** ,其中父节点的键值总是大于或等于(或小于或等于)其任何一个子节点的键值。这意味着在堆中,根节点具有最大(或最小)键值。

2024-01-29 11:50:13 1712 25

原创 二叉树【数据结构】

由一个根结点和两棵互不相交、分别称为根结点的左右子树的二叉树组成每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点左右子树是有顺序的不能颠倒空二叉树只有一个根结点根节点只有左子树根结点只有左子树根结点既有左子树又有右子树满二叉树: 在一棵二叉树中,所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上叶子结点只能出现在最下一层分叶子结点的度一定是2在相同深度的二叉树中,满二叉树的结点个数最多,叶子树最多完全二叉树。

2023-12-19 15:14:00 1969 38

原创 求最大公约数的几种常见的方法 【详解】

这里比较推荐是用 辗转相除法(欧几里得算法)和 《九章算术》中的 更相减损法多说一下,因为当时阿明浅浅学过遍辗转相除法,然后不久后就忘干净了,用的时候还要再去反复找,为了方便使用,干脆把 求解最大公约数 的几种常见的方法详细介绍一下,虽然不是最好,但是多少希望对大家有些帮助!希望大家对这些方法,有更加深刻的印象。加油!!!

2023-10-19 21:02:39 24199 40

原创 Linux文件系统【Linux】

本文系统解析Linux文件描述符、文件系统结构、软硬链接及静态/动态库机制。从fd原理与重定向,到EXT2文件系统层级(磁盘→分区→BlockGroup→InodeTable),揭示文件名与inode的分离存储;对比软链接(符号链接)与硬链接的本质差异;最后剖析静态库(.a)编译期嵌入与动态库(.so)运行时共享的特性,涵盖创建、使用与部署场景,为系统理解与开发实践提供完整技术图谱。

2026-11-02 20:10:22 168

原创 Shell简单实现【Linux】

本文实现了一个简易Shell,支持命令行输入、解析、子进程创建与执行。通过getenv()获取用户名、主机名和当前路径,使用snprintf生成提示符。利用fgets读取命令行,strtok分割命令参数,fork创建子进程,execvp执行外部命令,waitpid等待进程结束。特别处理内建命令cd和echo $?,通过chdir切换目录并更新PWD环境变量,确保提示符路径同步变化。最终实现一个可循环运行、支持基本命令与路径更新的简易命令行解释器。

2026-10-09 17:34:59 237

原创 进程替换【Linux】

本文介绍了进程替换的现象与原理,阐述了通过fork创建子进程并使用exec系列函数实现进程替换的过程。重点说明exec函数不创建新进程,仅替换当前进程的代码和数据,执行新程序。对比了execl、execv、execvp、execle等函数的参数形式与功能差异,强调路径查找、参数传递及环境变量管理机制。结合实例演示了进程替换成功与失败场景,指出替换成功后后续代码不再执行,否则为替换失败。

2026-10-07 20:43:55 229

原创 小白深度学习基础【AI】

深度学习是机器学习的分支,通过多层神经网络自动从原始数据中逐层提取高层次特征,实现图像识别、语音处理、自然语言理解等任务。相比传统机器学习依赖人工特征工程,深度学习具备端到端学习能力,能高效处理复杂数据,但需大量标注数据与强大算力。其核心优势在于自动特征学习与多模态融合,推动了大模型在视觉、语言、语音等领域的统一应用。

2026-09-26 11:28:18 227

原创 小白入门机器学习基础【AI】

本文系统介绍了机器学习的核心概念及其分类。按反馈信号分为监督、无监督、半监督、自监督和强化学习;按任务类型分为分类、回归、聚类、关联规则与序列预测。监督学习依赖标签,无监督学习挖掘数据内在结构,半监督与自监督降低标注成本,强化学习通过奖励机制优化决策。各类任务在实际应用中广泛用于图像识别、预测分析、客户分群、推荐系统及自然语言处理等领域。

2026-09-25 22:38:19 203

原创 继承【C++】

继承是C++实现代码复用的重要机制,支持类层次结构的扩展与灵活性。通过公有继承,派生类可复用基类成员,但私有成员不可直接访问,需通过公有接口间接调用。继承支持对象赋值兼容(切片),且派生类默认成员函数会自动调用基类构造与析构。静态成员在继承中共享,可用于统计实例数量。多继承易引发菱形继承问题,导致数据冗余与二义性,可通过虚继承解决。实践中应优先使用组合(has-a)而非多继承,避免复杂性。

2026-09-20 21:49:03 237

原创 Linux进程【Linux】

本文系统阐述了Linux进程管理的核心机制:进程由PCB(task_struct)描述,包含唯一PID、代码数据及状态信息。通过fork()创建子进程,实现代码共享与数据独立,借助写时拷贝优化内存使用。进程状态涵盖运行(R)、阻塞(S/D)、挂起、僵尸(Z)等,需通过kill信号控制。进程调度采用O(1)算法,基于活跃/过期队列与位图实现高效调度,后演进为更公平的CFS及可扩展的BPF调度器。同时介绍了命令行参数、环境变量(如PATH)的传递与管理,以及进程地址空间的虚拟化与保护机制,全面揭示了进程的生命周

2026-09-18 15:59:55 129

原创 Leetcode: 1089. 复写零

题目要求就地复写数组中的零,使用逆向双指针法:先正向遍历确定最后一个复写位置,处理边界情况后,从后往前复写元素。若遇零则复写两个零,否则复制原值。时间复杂度O(n),空间复杂度O(1)。

2026-09-14 16:53:11 163

原创 Leetcode: 283. 移动零

题目要求将数组中的所有0移动到末尾,同时保持非零元素的相对顺序。使用双指针法:cur遍历数组,dest指向最后一个非零元素位置。遇到非零数时,将其与dest+1位置交换,并推进dest;遇到0则跳过。一趟遍历即可完成,时间复杂度O(n),空间复杂度O(1)。

2026-09-13 20:09:13 70

原创 Linux基础工具使用【Linux】

本文系统介绍了Linux下软件安装的三种方式(源码、RPM包、包管理器),重点推荐包管理器。详细讲解了Vim编辑器的命令模式、插入模式与底行模式操作,涵盖文本编辑、注释、分屏等实用功能。接着阐述GCC编译流程:预处理、编译、汇编、链接,并引入Makefile实现自动化构建。随后通过进度条实例演示缓冲区刷新与fflush的应用,展示彩色美化与多文件场景下的进度条实现。最后介绍GDB调试工具的使用,包括断点设置、单步执行、变量监视及栈帧查看等核心调试技巧,全面覆盖Linux开发基础技能。

2026-09-09 15:09:23 87

原创 Leetcode: 347. 前 K 个高频元素 和 Leetcode: 692. 前K个高频单词

本文介绍了LeetCode两道前K高频元素问题的解法。347题要求返回整数数组中出现频率前K高的元素,通过map统计频次、存入vector排序后取前K项实现。692题扩展至单词列表,需处理频率相同按字典序排序的情况,核心思路相似但比较函数需额外处理字典序,可通过自定义比较函数或仿函数实现。两题均采用"统计-排序-取前K"的通用解法,时间复杂度主要由排序步骤决定,为O(N log N)。改进方案展示了使用仿函数替代静态比较函数的写法。

2026-07-07 21:11:58 215

原创 AVL树【C++】

AVL树是一种自平衡二叉搜索树,通过旋转操作保持左右子树高度差不超过1。文章详细介绍了AVL树的插入操作和平衡因子更新流程,重点分析了四种旋转场景:右单旋、左单旋、右左双旋和左右双旋。针对每种不平衡情况,文章提供了具体的旋转方法和平衡因子更新规则,并给出了完整的C++实现代码,包括节点插入、平衡判断和旋转操作等核心功能。通过维护严格的平衡性,AVL树确保了O(log n)的查找效率,避免了普通二叉搜索树可能出现的退化问题。

2026-06-30 19:31:43 193

原创 二叉搜索树【C++】

本文介绍了二叉搜索树(BST)的基本概念和操作实现。二叉搜索树是一种特殊的二叉树,满足左子树节点值小于根节点、右子树节点值大于根节点的性质。文章详细讲解了BST的插入、查找和删除操作:插入时需要找到合适位置并维护父子节点关系;查找通过比较键值进行;删除操作分为三种情况(无子节点、单子节点、双子节点),其中双子节点情况采用替换法处理。文中提供了C++实现代码,并特别强调了删除操作中处理替换节点时的注意事项。BST的平均时间复杂度为O(logN),是一种高效的数据结构。

2026-06-23 20:38:23 252

原创 list模拟实现(简单版)【C++】

本文介绍了C++中list的模拟实现,重点讲解了其底层数据结构、迭代器设计及常用操作。主要内容包括:1. list底层采用带头双向循环链表结构,通过节点类模板实现数据存储;2. 详细设计了ListIterator迭代器类,重载++、--、*;等运算符实现遍历功能;3. 实现了push_back、insert、erase等核心操作,并处理迭代器失效问题;4. 采用模板参数复用代码实现const迭代器;5. 完善了构造函数、拷贝构造、赋值运算符和析构函数等特殊成员函数。文章通过具体代码示例演示了各功能

2025-10-04 11:36:56 1105

原创 小白学习《PCI Express体系结构导读》——第Ⅰ篇第1章PCI总线的基本知识

本文摘要主要介绍了PCI总线的基本知识。PCI总线作为处理器系统的局部总线,主要用于连接外部设备,具有地址空间隔离、可扩展性强、动态配置机制、高带宽、共享总线机制和中断机制等特点。PCI总线通过HOST主桥与处理器隔离,支持即插即用功能,最大可挂接256个设备,并采用总线仲裁机制实现共享带宽。文章还对比了PCI总线与其他总线的性能差异,强调PCI总线在现代计算机系统中的重要地位及其对PCIe总线的影响。

2025-08-16 22:30:43 1310

原创 string的增删改查模拟实现(简单版)【C++】

string的增删改查模拟实现(简单版)【C++】

2025-07-19 18:45:20 993

原创 string类【C++】

学习使用标准库中的string

2025-07-16 15:38:08 734

原创 模板初阶【C++】

泛型编程是一种编写与类型无关的通用代码的技术,旨在提高代码的复用性。C++中的模板是实现泛型编程的基础,分为函数模板和类模板。函数模板允许定义一个通用的函数,能够处理多种数据类型,编译器会根据传入的实参类型生成相应的函数版本。函数模板的实例化分为隐式实例化和显示实例化,隐式实例化由编译器根据实参推演模板参数的实际类型,而显示实例化则是在函数名后指定模板参数的实际类型。类模板与函数模板类似,但类模板的实例化必须显式指定类型。类模板的声明和定义通常放在同一个文件中,以便编译器能够正确处理模板的实例化。通过使用模

2025-05-21 21:31:24 605

原创 C/C++内存管理【C++】

/ 例如 链表_val = 0;int _val;//构造,_val(val){}int main()//new操作符 在为自定义类型申请空间时,会去调用构造函数//如果new失败了后抛异常,不需要手动检查//delete操作符 会去调用析构函数return 0;在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与free不会。

2024-03-08 19:04:55 1462 3

原创 类和对象 02【C++】

初始化列表:构造函数中用于初始化成员变量的特殊语法。explicit阻止隐式类型转换。static成员为类共享的数据或函数。友元机制突破封装,友元函数/类可访问私有/保护成员。内部函数是类内的嵌套函数。匿名对象常用于初始化或返回值场景。拷贝对象时,编译器进行如深拷贝、RAII等优化。

2024-03-08 07:49:08 1177

原创 类和对象 01【C++】

在C++中,我们使用关键字 class 来定义类。类可以包含数据成员(变量)和成员函数(方法)。对象是类的实例。要创建一个对象,你需要使用类的名称,后面跟着一个或多个参数(如果有构造函数的话)。

2024-02-21 21:59:41 1189 3

原创 初识cpp【C++】

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{ }即可,{ }中即为命名空间的成员。命名空间解决了C语言中的命名冲突问题例如:出现命名冲突的原因:当然,在引入在第三方库时,C语言也容易出现重定义现象;解决方法:将命名冲突的变量放到命名空间域中上图中 namespace lisi 中的 lisi 是 命名空间的名字命名空间中可以定义变量/函数/类型命名空间可以嵌套同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。

2024-02-21 10:29:09 1970

原创 排序【数据结构】

排序是将一组数据按照一定的顺序排列的过程。常见的排序算法有很多种,包括冒泡排序、选择排序、插入排序、快速排序、归并排序等。不同的排序算法有不同的优缺点,适用于不同的场景和数据类型。

2024-01-29 22:11:05 1284 4

原创 Leetcode: 203. 移除链表元素

这里free(cur) 会把第一个结点的内存空间释放返回给操作系统,pre->next = next;即此时的 pre 是NULL ,cur指向的是head(第一个结点),删去结点(free(cur))。先让cur指向第一个结点,遍历结点,把不等于val的值给放到新的链表里。这样的话就要考虑如何找被删除元素的前一个结点,和被删除元素的下一个结点。因为 要删除的元素可能不仅仅是一个,也有可能是多个。前提是:删去的不是第一个结点的情况下。遍历链表,删除指定元素(val)给你一个链表的头节点。

2023-12-19 15:22:13 3550 41

原创 带头结点的双向循环链表

/存放后面结点的指针//存放前面结点的指针}ListNode;

2023-12-01 19:40:26 2296 67

原创 常见基础指令【Linux】

一个文件的ACM时间是:A(Access)文件最近一次被访问的时间;先使用head 读取3010行的内容,再把读取的内容,使用tail 读取3010行中的后10行。绝对路径是指文件或目录的完整路径,包括从根目录(/)开始一直到该文件或目录的路径。需要注意的是:当文件有数据时,先清空,再把hello 放到test.txt里面。上述指令意思是:将hello 输出重定向到test.txt文件中。相对路径是指文件或目录相对于当前工作目录的路径(./)。cp [选项] 源文件或目录 目标文件或目录。

2023-12-01 19:37:31 343 8

原创 栈和队列【详解】

栈:仅限在一端进行插入和删除元素操作。数据插入删除的一端称为栈顶,而另一端称为栈底。数据的插入操作。数据的删除操作。栈中的数据遵循后进先出,简称LIFO)的原则。栈的存储定义这里采用的是顺序栈,以动态数组的形式进行存放栈的元素,当栈满时,可以动态的增加栈的容量。定义一个指针负责指向动态数组,用top来表示栈底,还有就是栈的容量capacity。int top;//栈底//栈的容量}Stack;2.栈的初始化当栈的存储定义完成后,就开始对栈进行初始化。//初始化栈。

2023-11-22 16:31:34 1071 61

原创 Leetcode:622. 设计循环队列 题解【具详细】

首先我们需要定义出一个循环队列的存储定义,这里采用的是使用动态数组来进行模拟循环队列,根据题中给出的接口返回类型,我们可以知道循环队列的数据类型为int。其次,还需定义两个记录数组的下标,一个记录队列的队头,另一个记录队列的队尾(也就是指向要入队的下一个元素的位置)。另外还要提供一个表示要存储数据的具体个数。如图:

2023-11-22 16:25:05 1707

原创 单链表(增删改查)【超详细】

单链表的存储与顺序表的存储不一样,单链表不仅仅存放数值,还要存放下一个结点的地址代码//存放单链表的值//存放下一个单链表的地址}SLNode;当有了单链表的存储定义,我们就可以对单链表进行存放结点。

2023-11-10 16:05:51 4315 59

原创 Leetcode:876. 链表的中间结点 【详解】

head难度:简单由题目可以知道,题目要求返回中间的结点。

2023-11-10 15:53:21 302 6

原创 【数据结构】顺序表

存储单元依次存储。

2023-10-30 20:39:30 4035 65

原创 【时间复杂度和空间复杂度】

首先介绍一下算法(Algorithm)算法是对特定问题求解步骤的一种描述。一个“好”的算法应该达到以下目标:正确性、可读性、健壮性、高效率与低存储量需求算法的效率的度量 是通过时间复杂度和空间复杂度来描述的。

2023-10-30 20:35:06 232 9

原创 Leetcode:【189. 轮转数组】

给定一个整数数组nums,将数组中的元素向右轮转k个位置,其中k是非负数难度:中等向右轮转 1 步:向右轮转 2 步:向右轮转 3 步:向右轮转 1 步: [99,-1,-100,3]向右轮转 2 步: [3,99,-1,-100]

2023-10-24 20:55:45 363 27

空空如也

空空如也

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

TA关注的人

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