- 博客(63)
- 收藏
- 关注
原创 MySQL在Centos 7 环境下安装
摘要 本文详细介绍了在CentOS 7.6系统上安装MySQL数据库的完整流程。主要内容包括:检查并卸载系统自带的mariadb/mysql环境,备份相关配置文件;通过官网下载MySQL 5.7的yum源安装包并配置本地yum源;使用rpm命令安装MySQL社区版服务端和客户端组件。文章提供了完整的命令行操作步骤和注意事项,帮助读者顺利完成MySQL环境的搭建,为后续数据库使用奠定基础。操作过程涵盖环境检查、软件包管理、yum源配置等Linux系统管理关键技能。
2025-11-22 15:16:51
526
14
原创 环境变量和程序地址空间 虚拟地址空间页表存在意义 附进程概念总结图干货云集
本文探讨了Linux系统中的环境变量和进程地址空间概念。环境变量是操作系统运行参数,存储在bash进程表中,可通过命令行参数表和环境变量表进行管理。文章介绍了获取环境变量的方法,如getenv函数,并演示了如何通过环境变量限制程序执行权限。在进程地址空间部分,解释了父子进程共享虚拟地址但独立物理空间的机制,通过页表实现虚拟地址到物理地址的映射。重点阐述了fork()创建子进程时如何拷贝父进程的task_struct,以及写时复制技术如何保证进程独立性,即当子进程修改变量时会创建新的物理页并更新映射关系。这些
2025-11-22 15:06:28
997
4
原创 包管理器,yum工具,vim编辑器常见指令,解决sudo权限问题,Linux项目自动化构建工具-make/Makefile
本文介绍了Linux系统中软件包管理工具yum和vim编辑器的使用。主要内容包括:1)yum包管理器的功能与常用命令(安装、卸载、搜索软件等),以及Windows与Linux文件互传方法;2)vim编辑器的命令模式和底行模式操作技巧,包括光标移动、复制粘贴、批量注释等;3)gcc/g++编译器的工作流程(预处理、编译、汇编、链接),并对比分析了动态库和静态库的优缺点。文章还提供了vim配置方法和条件编译的实用案例,帮助开发者高效使用Linux开发工具。
2025-11-19 20:20:42
747
35
原创 进程状态,孤儿进程僵尸进程,Linux真实调度算法,进程切换
摘要:本文探讨了Linux进程状态管理与数据结构设计。通过运行队列和设备队列的双队列机制,操作系统实现进程调度与资源管理。进程状态包括运行(R)、阻塞(S/D)、挂起等,其中深度睡眠(D)可防止数据丢失。Linux采用list_head实现PCB的网状关联,支持多维度管理。僵尸进程(Z)保留了子进程退出信息供父进程查询。文章剖析了进程状态转换、阻塞/挂起机制及数据结构设计原理,并给出代码示例演示进程阻塞状态。
2025-11-19 19:59:15
997
38
原创 进度条创建,版本控制器Git,如何从Linux系统下提交代码到gitee远程仓库,GDB调试指令
本文介绍了两种Vim批量注释方法及进度条实现。第一部分详细说明了Vim中使用Ctrl+V可视化块选择模式进行多行注释的操作步骤(包括选中行、插入#号和保存)。第二部分展示了进度条的实现代码,包含基础版本(process_v1)和结合下载场景的改进版本(FlushProcess)。改进版通过计算下载百分比动态更新进度条,搭配旋转动画,并支持自定义总大小和下载速度参数,最后输出下载完成信息。文中强调了fflush(stdout)对缓冲区刷新的重要性,并提供了完整的代码示例。
2025-11-17 23:44:12
745
8
原创 进程概念,冯诺依曼体系结构,系统调用,父子进程初解
摘要: 冯诺依曼体系结构由存储器、控制器、运算器和输入输出设备组成,数据流动需经过内存处理。操作系统作为软硬件管理核心,采用“先描述再组织”方式管理进程,通过系统调用接口提供安全访问。进程是正在运行的程序,由PCB(进程控制块)封装代码和数据,操作系统通过增删查改PCB链表管理进程。CPU与操作系统协同工作,确保程序高效执行。 关键词: 冯诺依曼体系、操作系统、进程管理、PCB、系统调用
2025-11-17 23:33:59
1420
26
原创 RAII智能指针底层实现 智能指针弊端引起循环引用 ,怎么解决内存泄漏问题
📝 智能指针与RAII机制解析 RAII机制:利用对象构造获取资源、析构释放资源,确保异常场景下资源自动回收,避免内存泄漏。 智能指针实现: RAII封装:智能指针通过构造函数获取资源,析构函数释放资源。 浅拷贝问题:多个指针管理同一资源时,默认浅拷贝会导致重复析构。 解决方案: auto_ptr:拷贝时转移所有权(不推荐,易悬空)。 unique_ptr:禁用拷贝,仅支持移动语义。 shared_ptr:引用计数(_pcount)跟踪资源持有者,析构时计数归零才释放资源。 weak_ptr:解决shar
2025-11-10 23:04:23
1487
27
原创 C++11 面试题插入(左值引用和右值引用的区别)移动构造和移动赋值C++新标准如何解决传值返回但对象销毁问题
🎯文章摘要 本文介绍了C++中的列表初始化、右值引用和移动语义。列表初始化支持内置类型和自定义类型的直接构造,通过{}简化对象创建,并详细分析了const引用对临时对象生命周期的延长机制。右值引用(&&)用于标识临时资源所有权,与左值引用的区别在于:右值引用允许移动语义优化性能,减少拷贝开销。通过代码示例演示了右值引用如何延长对象生命周期并支持修改,而const左值引用仅支持访问。最后讨论了函数重载中左值/右值参数的匹配规则,以及移动语义在避免深拷贝时的应用场景。核心结论:左值引用共享对象
2025-11-02 21:37:56
2257
61
原创 set/map刷力扣题/(哈希表+排序类型)仿函数和捕获-两种方法解决
本文分析了C++中set、unordered_set、map、unordered_map的底层实现与性能差异,并提供了三个高频算法题的解决方案: 容器特性对比: set/map基于红黑树,key需支持<比较,O(logN)复杂度,输出有序 unordered_set/unordered_map基于哈希表,key需支持哈希和==比较,平均O(1)复杂度,输出无序 算法题解: 前k个高频元素:哈希统计频率+sort自定义排序(仿函数或lambda) 字符频率排序:哈希统计后按频率降序+ASCII码排序 前
2025-10-30 22:03:40
1149
30
原创 类和对象深层回顾:(内含面试题)拷贝构造函数,传值返回和传引用返回区别
摘要:本文探讨构造函数的本质及其必要性,分析拷贝构造函数与普通构造函数的区别,并讨论传值返回与传引用返回的优劣。构造函数用于替代初始化函数,自动完成对象构建;拷贝构造函数解决默认浅拷贝导致的资源管理问题,需显式实现深拷贝。传值返回会产生临时对象调用拷贝构造,而传引用返回避免拷贝但可能引发野引用问题。通过Buffer类的实例分析,演示了深拷贝解决重复析构的方法,以及静态对象避免野引用的方案。 关键词:构造函数、拷贝构造、深拷贝、传值返回、传引用返回、资源管理
2025-10-29 16:34:54
1263
41
原创 算法入门:专题攻克二---滑动窗口3(将x减到0的最小操作数,水果成篮)
这篇文章介绍了LeetCode 1658题的解法,题目要求找到将整数x减到0所需的最小操作数,每次操作可以移除数组最左或最右元素。文章解析了题目要求,提出算法思路:通过滑动窗口寻找使剩余元素和等于sum-x的最长子数组长度,从而确定最小操作数。具体步骤包括:1)计算数组总和sum;2)初始化返回值ret=-1;3)使用双指针遍历数组,维护窗口内元素和Add;4)当Add等于目标值时更新ret;5)最后返回数组长度减去ret。文章附有C++代码实现,帮助读者理解解题过程。
2025-10-27 20:53:24
560
40
原创 封装map和set(红黑树作为底层结构如何实现map和set插入遍历)
摘要: 红黑树作为map和set的底层结构,通过泛型设计同时支持两种容器。关键点在于引入仿函数KeyOfT,用于提取键:set直接返回键本身,map从键值对中提取键。迭代器按中序遍历实现,插入操作返回pair<iterator, bool>,既定位元素又反馈插入结果。map的operator[]通过插入缺省值实现查找或修改,简化用法。红黑树迭代器需显式构造函数,维护节点与根的关系以支持遍历。设计巧妙融合泛型与仿函数,兼顾通用性与效率。 (149字)
2025-10-27 15:37:00
1583
64
原创 算法入门---专题二:滑动窗口2(最大连续1的个数,无重复字符的最长子串 )
文章摘要: 本文探讨了两种滑动窗口算法的经典应用:最大连续1的个数和无重复字符的最长子串。对于最大连续1问题,通过双指针与计数器结合,动态维护窗口内0的个数不超过k,优化暴力枚举为O(n)复杂度;对于无重复子串问题,利用哈希表记录字符频率,滑动窗口确保字符唯一性。两题均通过进窗口、判断、出窗口三步策略高效求解,代码实现简洁。文末附LeetCode题目链接与示例图解,帮助读者理解滑动窗口的核心思想——通过调整边界避免重复计算,提升算法效率。 关键词:滑动窗口、双指针、哈希表、算法优化、LeetCode
2025-10-24 21:22:14
783
28
原创 红袍加身:红黑树里的 “ 双色平衡艺术拆解(超详细图文详解) ”
红黑树插入操作解析 本文介绍了红黑树的基本规则、结构及插入操作的实现。红黑树通过颜色约束(根节点黑、红节点不相邻、路径黑节点数相同)保证平衡,插入时需根据父节点和叔叔节点的颜色进行不同调整: 变色处理:当父节点和叔叔节点均为红色时,将其变黑,祖父节点变红; 单旋+变色:父节点红且叔叔节点黑时,根据父子位置进行左/右单旋并调整颜色; 双旋+变色:父节点红且孩子节点与父节点方向相反时,先局部旋转再整体旋转并变色。 代码实现中,插入节点默认红色,通过循环向上调整违反规则的情况,最终确保根节点为黑色。红黑树的插入操
2025-10-23 20:52:15
1091
100
原创 AVL树手撕,超详细图文详解
摘要:《AVL树的结构与平衡操作》探讨了AVL树的节点结构及插入过程中的平衡维护机制。AVL树通过平衡因子(_bf)和父指针(_parent)确保平衡,节点结构包含键值对(_kv)和左右子树指针。插入时通过比较键值确定位置,随后更新平衡因子:右子树插入使_bf++,左子树插入使_bf--。当_bf为±2时触发旋转(左单旋/右单旋)以恢复平衡,旋转需处理子树链接并更新父节点关系。代码示例展示了节点定义、插入逻辑及旋转实现,强调通过调整子树高度差维持全局平衡性。关键词:AVL树、平衡因子、旋转、节点插入、数据结
2025-10-21 21:35:59
1969
37
原创 set_map的实现+set/map加持秒杀高频算法题锻炼算法思维
文章摘要: 本文介绍了C++中set和map容器的基本用法与实现原理。set基于红黑树实现,具有排序和去重功能,增删查效率为O(logN)。通过代码示例展示了set的构造、迭代器遍历、插入、删除及查找操作,并对比了multiset允许值冗余的特性。map的insert和operator[]方法详解了其插入、修改和查找的复合功能,强调[]既能修改值又能插入新键值对的特性。最后提及count、lower_bound等实用方法,适用于区间操作。整体内容结合代码演示,适合快速掌握这两种关联容器的核心用法。
2025-10-19 20:40:40
2812
127
原创 二叉树搜索树插入,查找,删除,Key/Value二叉搜索树场景应用+源码实现
摘要: 本文介绍了二叉树搜索树的基本概念与实现方法。二叉搜索树具有左子树小于根、右子树大于根的特性,最优情况下时间复杂度为O(log2N)。文章详细讲解了二叉树的插入、查找和删除操作,其中删除操作分为三种情况:叶子节点、单子节点和双子节点。对于复杂的双子节点删除,采用替代法进行处理。代码实现采用C++模板,通过递归和循环结合的方式完成操作,并提供了测试案例进行验证。文章还探讨了类设计中封装递归细节的重要性,确保用户友好性。(150字)
2025-10-16 19:41:57
1109
55
原创 算法入门:专题二---滑动窗口(长度最小的子数组)类型题目攻克!
📌 摘要: 本文讲解了长度最小的子数组问题(LeetCode 209题)。给定一个正整数数组和目标值target,需找到连续子数组使其和≥target,并返回最小长度。 🔍 解法分析: 暴力枚举:固定左边界,遍历右边界求和,但效率低(O(N²))。 滑动窗口(同向双指针):利用单调性优化,窗口动态伸缩,始终维护最小长度,时间复杂度O(N)。 💻 代码实现: 使用滑动窗口,left和right指针标记区间,通过sum累加和判断是否出窗口,更新最小长度len。 🚀 核心点: 滑动窗口的四步操作(进窗口、
2025-10-15 23:46:25
1127
20
原创 C++中的父继子承(2)多继承菱形继承问题,多继承指针偏移,继承组合分析+高质量习题扫尾继承多态
🔍 摘要: 本文探讨C++继承中的关键技术问题: 禁止继承的两种方法:父类构造函数私有化(子类无法调用)或使用final修饰父类。 友元与继承:友元关系不可继承,需在派生类中重新声明。 静态成员在继承体系中唯一,所有子类共享同一静态变量。 菱形继承引发二义性与数据冗余,通过虚继承(virtual)解决,但增加了复杂度。 多继承指针偏移:基类指针指向派生类时,地址因内存布局(声明顺序)可能不同,需注意类型转换时的隐式调整。 ⚡ 核心结论: 菱形继承应避免,虚继承慎用;多继承需警惕指针偏移问题,优先使用单一继
2025-10-15 21:41:37
1009
13
原创 算法入门:专题攻克一---双指针4(三数之和,四数之和)强推好题,极其锻炼算法思维
🎬 胖咕噜的稞达鸭 - 算法专栏解析 三数之和:通过排序+双指针法,固定一个数后转化为两数之和问题,注意去重处理(跳过重复元素)。核心代码使用双指针寻找和为 -nums[i] 的组合,并优化遍历过程。 四数之和:类似三数之和,先排序,再双层循环固定两个数,转化为两数之和问题。通过双指针找到剩余两数,确保和为 target-nums[a]-nums[b],同时处理重复元素。 个人主页 提供更多算法详解,如《数据结构》《C++初阶高阶》《算法入门》等专栏。 ⛺️ 技术的杠杆,撬动整个世界!
2025-10-14 10:31:24
1122
55
原创 多态:(附高频面试题)虚函数重写覆盖,基类析构重写,重载重写隐藏对比,多态原理,虚表探究一文大全
多态与虚函数解析摘要 基类析构函数建议为虚函数:确保派生类对象通过基类指针删除时能正确调用派生类析构函数,避免内存泄漏(如子类资源未释放)。 函数重载、重写(覆盖)、隐藏区别: 重载:同名函数,参数列表不同(同一作用域); 重写(覆盖):派生类虚函数与基类虚函数三同(函数名、参数、返回类型,协变除外); 隐藏:派生类同名函数屏蔽基类函数(不要求虚函数或参数相同)。 虚函数限制:静态成员函数不能为虚函数(无this指针),构造函数不能为虚,其他成员函数均可设为虚函数。 虚函数与虚表存储:虚函数代码存在代码段,
2025-10-14 10:11:58
844
46
原创 C++中的父继子承:继承方式实现栈及同名隐藏和函数重载的本质区别, 派生类的4个默认成员函数
摘要:本文探讨了C++继承中的关键问题,包括父类私有成员在子类中的不可见性、子类对象大小与父类的关系、函数重载与隐藏的区别、派生类构造函数的初始化顺序等。通过代码示例(如Person、Student、Teacher类的继承关系)和模板实现栈的案例,阐述了公有继承下的对象赋值兼容性、作用域规则及构造函数调用顺序。文章还指出父类私有成员虽被继承但不可访问,protected成员在子类中的可见性,并强调实践中多用public继承。最后通过宏替换展示了容器适配的灵活性,为理解继承机制提供了实用指导。
2025-10-11 23:03:06
1340
69
原创 缝合怪deque如何综合list和vector实现及仿函数模板如何优化priority_queue实现
容器适配器与数据结构实现 本文介绍了三种容器适配器(stack、queue、priority_queue)的实现原理及其应用。通过容器适配器模式,我们可以基于现有容器快速构建新的数据结构功能: 栈与队列实现:利用vector/list等容器作为底层存储,通过限制操作接口实现栈和队列的LIFO/FIFO特性。 deque设计:作为vector和list的"缝合怪",deque通过中控数组管理多个buffer块,结合了随机访问和动态扩展的优点,但中间插入效率较低。 优先队列:基于堆结构实现,
2025-10-09 23:43:13
852
52
原创 算法入门:专题攻克一---双指针(3)有效三角形的个数 查找总价格为目标值的两个商品(剑指offer题目)
摘要: 本文介绍了如何高效计算数组中能构成三角形的三元组个数。通过排序数组并利用双指针技术,将时间复杂度优化至O(n²)。核心思路是固定最大边c,然后使用双指针法在剩余区间内快速统计满足a+b>c的组合数。具体实现时,先对数组排序,外层循环固定最大数,内层用双指针left和right遍历,当a+b>c时直接计算有效组合数,否则移动指针。该算法有效避免了暴力枚举的高时间复杂度问题。
2025-10-07 23:37:07
449
21
原创 二叉树进阶面试题:最小栈 栈的压入·弹出序列 二叉树层序遍历
摘要: 本文通过三个算法题解析栈与队列的应用。首先设计最小栈,通过双栈(主栈+辅助栈)实现O(1)获取最小值;其次验证栈的压入弹出序列,模拟入栈出栈过程匹配给定序列;最后实现二叉树层序遍历,利用队列分层记录节点,通过levelsize控制每层数据量。代码均给出关键思路与实现,突出栈的"先进后出"与队列的"先进先出"特性在算法中的灵活运用。 关键词: 最小栈、辅助栈、层序遍历、队列、广度优先搜索
2025-10-06 16:53:49
862
10
原创 算法入门:专题攻克主题一---双指针(2)快乐数 呈最多水的容器
摘要: 本文解析了两道LeetCode算法题:快乐数与盛最多水的容器。 快乐数:通过快慢双指针判断数字平方和是否进入1的循环,利用鸽巢原理证明必然存在环,代码实现中封装bitSum计算各位平方和。 盛最多水的容器:双指针从两端向中间移动,每次排除较短边并更新最大容积,利用单调性优化至O(n)时间复杂度。两题均通过双指针高效解决,代码简洁且逻辑清晰。
2025-10-04 20:50:13
731
33
原创 算法入门:专题攻克主题一---双指针(1)移动零 复写零
本文介绍了双指针算法在数组操作中的应用,通过两个LeetCode题目《移动零》和《复写零》进行详细解析。 移动零:使用双指针cur和dest将数组划分为已处理区间、零元素区间和待处理区间。通过交换操作将非零元素前移,零元素后移,最终实现所有零元素位于数组末尾。 复写零:同样采用双指针算法,先找到最后一个需要复写的数字,然后从后向前进行复写操作。特别处理了边界情况,确保算法正确性。 两题的解法均展示了双指针算法在数组操作中的高效性和灵活性,适合处理原地修改数组的问题。
2025-10-03 23:44:34
910
19
原创 list 实现链表封装节点的底层逻辑:如何克服不连续无法正常访问挑战
本文介绍了C++中list容器的功能实现与底层结构。通过代码示例展示了list的遍历、插入删除、查找排序等操作,重点分析了emplace_back与push_back的区别。在底层实现部分,提出了使用list_node类模板构建双向链表节点结构,包含数据成员T_data、前驱指针_prev和后继指针_next,实现双向链接功能。所有实现封装在Keda命名空间下,为后续模拟实现list容器奠定基础。
2025-10-03 17:24:11
1408
35
原创 C++篇 Vector模拟实现(1) 初始化 迭代器遍历 插入尾插尾删 一文详解
🔍 摘要 本文系统介绍了C++ STL中vector的基本用法,包括初始化、遍历、扩容及二维数组构建等核心操作。重点解析了vector的构造方式、迭代器使用、空间管理(resize/reserve)以及增删查改接口,并通过代码示例演示了动态二维数组的实现。文章还结合杨辉三角算法题,展示了vector在动态规划中的实际应用,帮助读者快速掌握这一重要容器的使用技巧。 📌 关键词:vector、C++ STL、动态数组、二维数组、迭代器
2025-09-28 21:32:48
888
30
原创 C++篇 String实现避坑指南:搞定构造,拷贝与析构,增删查改,流提取流插入与比对大小 一文全解
本文介绍了C++中string类的常用接口和实现方法,主要包括构造函数、容量操作、访问遍历、修改操作等核心功能。文章首先列举了string类的常见构造方法和容量操作函数,如size()、capacity()、reserve()等。然后详细讲解了访问和遍历操作,包括operator[]、迭代器等方法。在修改操作部分,重点介绍了push_back、append等字符串修改函数。文章还提供了string类的实现代码,包括初始化、拷贝构造、析构函数等底层实现细节,特别强调了深拷贝问题和swap交换技巧的应用。通过注
2025-09-27 14:13:49
1189
21
原创 C++篇 类和对象(3)万能工具怎么用?
文章摘要: 本文介绍了C++运算符重载的几种实现方式,重点探讨了如何解决全局重载时访问私有成员变量的问题。提供了四种解决方案:1.将成员变量设为公有;2.通过公有成员函数访问;3.使用友元函数;4.重载为成员函数。文中还通过日期类的实现,详细演示了运算符重载(如 +=、+、-=、- 等)的具体应用,并比较了引用返回与拷贝传值的区别。代码示例清晰展现了日期计算的逻辑,帮助理解运算符重载的实际应用场景。 关键词: C++、运算符重载、私有成员访问、日期类、友元函数
2025-09-23 15:53:35
542
21
原创 C++篇 类和对象(2)万能工具怎么用?
文章摘要: 本文介绍了C++类的6个默认成员函数,包括构造函数、析构函数、拷贝构造函数等。构造函数用于初始化对象,析构函数负责资源清理,拷贝构造函数实现对象拷贝。默认生成的构造函数和析构函数对内置类型不做处理,但对自定义类型会调用其默认函数。文章通过代码示例展示了构造函数重载、析构函数资源释放、拷贝构造传参方式等核心概念,并强调了资源管理的重要性。适合C++初学者理解类的默认成员函数及其应用场景。
2025-09-21 16:44:43
1226
33
原创 C++ 篇 类和对象(1)万能工具怎么用?
【摘要】 本文以C++类的定义与使用为核心,详细讲解了类的基本结构、访问限定符、类域、实例化及this指针等关键概念。通过Stack和Date类的代码示例,展示了成员变量与成员函数的定义方式,对比了class与struct的差异,并解析了内存对齐规则。重点探讨了this指针的隐式传递机制及其在成员函数中的显式调用。文章还通过计算空类与带成员类的大小,深入分析了对象内存布局,帮助读者理解C++面向对象编程的基础原理与实现细节。 关键词:C++类、访问限定符、内存对齐、this指针、实例化
2025-09-19 13:35:07
1536
31
原创 数据结构排序入门(3):核心排序(归并排序,归并非递归排序,计数排序及排序扫尾复杂度分析)+八大排序源码汇总
归并排序采用分治思想,通过递归将数组对半拆分至单个元素后合并,非递归版本通过gap变量控制归并区间大小逐步扩大。计数排序通过统计元素出现频次实现排序,先确定数据范围,建立计数数组统计频率,最后按顺序重构数组。两种算法均需额外空间,归并排序时间复杂度为O(nlogn),计数排序为O(n)但受数据范围限制。关键实现包括归并的有序合并过程和计数排序的频次统计与重构步骤。
2025-09-17 19:19:49
486
17
原创 数据结构排序入门(2):核心排序(选择排序,快速排序及优化)
本文介绍了两种排序算法及其优化方法。1.选择排序:通过遍历数组选出最小和最大值,分别插入到前后有序位置。优化后的双指针版本减少了遍历次数。2.快速排序:详细分析了hoare版本、挖坑法和前后指针法的实现原理,重点讨论了分割策略和递归过程。其中挖坑法简化了相遇位置的分析,前后指针法提高了效率。最后还介绍了非递归实现,使用栈来避免递归过深导致的溢出风险。每种算法都给出了关键代码实现和优化思路。
2025-09-16 22:04:57
476
31
原创 数据结构排序入门:核心排序(插入,冒泡,希尔,堆排序)(1)图文详解
本文介绍了常见的排序算法及其实现。主要内容包括:1.排序的基本概念和分类(插入、选择、交换、归并);2.直接插入排序的实现及其特性(时间复杂度O(N^2)、空间复杂度O(1));3.冒泡排序的优化方法(使用flag提前终止);4.希尔排序的改进思想(通过预排序提升效率,时间复杂度约O(N^1.3));5.堆排序的实现(使用向下调整建堆)。各算法均给出C语言代码实现,并分析了其时间复杂度和适用场景,其中希尔排序是对插入排序的重要优化,堆排序则利用了完全二叉树的性质。
2025-09-15 00:31:47
1187
11
原创 二叉树基础学习(图文并茂)万字梳理
本文系统介绍了树和二叉树的数据结构及其实现。主要内容包括:1.树的基本概念、表示方法和递归定义;2.二叉树的特性、分类(满二叉树、完全二叉树)及相关性质;3.二叉树的两种存储结构(顺序存储和链式存储)及其实现,重点讲解了堆的概念和实现方法;4.二叉树的基本操作,包括前中序遍历、节点计数、高度计算等递归算法;5.二叉树相关OJ题的解题思路和实现代码。文章通过理论讲解结合代码实现,详细阐述了树形数据结构的特点和应用,为理解和实现树形结构提供了完整的技术指导。
2025-09-13 16:41:32
947
20
原创 链表OJ题讲解---试金石含金量
本文详细讲解了环形链表的判断方法及拓展问题。核心算法使用快慢指针(slow每次1步,fast每次2步),若fast追上slow则链表有环,否则无环。文章通过数学推导证明:当fast和slow初始距离为N时,若N为偶数则第一轮相遇;若N为奇数且环周长C-1为偶数,则第二轮相遇。此外还给出了求环入口节点的算法:相遇后,分别从head和相遇点出发的两个指针再次相遇点即为入口。最后简要介绍了随机链表的复制方法,通过三次遍历实现节点复制、random指针设置和链表分离。这些算法在面试中经常出现,需要重点掌握。
2025-08-17 23:49:53
1154
1
原创 复杂度扫尾+链表经典算法题
本文分析了几个经典算法的时间复杂度及链表算法题。时间复杂度部分:阶乘递归Fac为O(N),带循环的阶乘递归为O(N²),斐波那契递归Fib为指数级,冒泡排序空间复杂度为O(1)。链表部分包含三个算法:1)快慢指针法求倒数第k个节点;2)判断回文链表(通过找中间节点和反转链表实现);3)求相交链表的交点(先计算长度差再同步遍历)。这些算法都采用了双指针技巧,展示了链表问题的常见解法。
2025-08-15 23:52:45
804
3
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅