- 博客(62)
- 收藏
- 关注
原创 计算机网络基础:从协议到通信全解析(大致框架)
本文系统介绍了计算机网络的基础知识,主要包括:1. 计算机网络发展背景及局域网/广域网概念;2. 网络协议的分层模型(OSI七层和TCP/IP五层);3. 数据传输过程中的封装与解包机制;4. MAC地址和IP地址的作用与区别。重点阐述了协议分层的必要性、各层功能特点,以及数据在网络中的传输过程,包括报头封装、路径选择等关键环节,为理解网络通信原理提供了系统框架。
2025-07-18 12:01:02
926
原创 C++哈希表:冲突解决与高效查找
本文系统讲解了哈希表及其相关技术。首先介绍了哈希表的两种底层实现方式:闭散列(开放定址法)和开散列(链地址法),重点分析了它们的冲突处理机制,包括线性探测、二次探测和哈希桶设计。然后详细阐述了位图和布隆过滤器原理,说明位图适用于海量数据判重,而布隆过滤器通过多哈希函数降低误判率。文章还提供了哈希表的完整实现代码,包括迭代器设计、哈希函数优化等关键技术点。最后讨论了哈希在分布式系统中的应用,如一致性哈希解决节点动态变化问题。全文结合理论分析和实际应用,为理解哈希技术提供了全面的视角。
2025-06-02 15:37:10
774
原创 C++哈希表:unordered系列容器详解
C++中的unordered系列容器(unordered_map/unordered_set)采用哈希表实现,相比红黑树结构的map/set具有O(1)的查询效率,但元素无序。二者功能相似但底层实现不同:红黑树保持有序(logN时间复杂度),哈希表提供更快访问(O(1)平均复杂度)。unordered容器支持基本操作如insert/erase/[]访问,但迭代器为单向。适用于需要快速查找但对元素顺序无要求的场景,与有序容器形成互补选择。
2025-05-31 17:49:31
632
原创 深度刨析树结构(从入门到入土讲解AVL树及红黑树的奥秘)
本文系统梳理了树形数据结构及其应用,涵盖以下核心内容: 基础概念与分类 详细解析树的基本术语(根节点、叶节点、度等)及存储结构(双亲/孩子表示法) 特殊二叉树类型(满二叉树、完全二叉树)及其数学特性 核心数据结构实现 堆的构建与操作(Floyd建堆算法O(n) vs插入法O(nlogn)) 二叉搜索树的插入/删除策略(含替换法处理双子树情况) AVL树的平衡机制(四种旋转场景及平衡因子维护) 高级树结构 红黑树的五条性质与颜色调整规则(三类uncle情况处理) 对比AVL与红黑树的性能差异(旋转次数与平衡严
2025-05-30 22:15:51
1094
1
原创 STL的map和set(关联式容器深度解析)
本文介绍了C++中的关联式容器map、set及其多键值版本multimap、multiset。关联式容器通过键(key)存储元素,底层使用红黑树实现,保持元素有序性。重点讲解了set(存储唯一值)、map(存储键值对)的构造方法、插入删除操作,以及map特有的[]运算符实现原理。对比了set/map与multiset/multimap的区别,指出后者允许键重复但不支持[]操作。文章还简要提及了底层红黑树结构,强调关联式容器在查找效率(O(logn))和有序性方面的优势。
2025-05-25 20:00:22
672
原创 c++之多态(揭秘多态:面向对象编程的核心魅力)
本文系统讲解了面向对象编程中的多态概念及其实现机制。主要内容包括:1.多态的概念与定义("一个接口,多种实现");2.多态的实现条件(基类指针/引用调用+虚函数重写);3.虚函数表的工作原理(vptr指向虚函数地址数组);4.继承关系中的虚函数表现(单继承和多继承差异);5.抽象类与接口继承(纯虚函数强制派生类实现);6.多态相关面试问题解析(内联函数、静态函数限制等)。文章通过售票系统等实例,详细阐述了多态在编译期和运行期的绑定机制,以及虚函数表在动态绑定中的关键作用。
2025-05-24 13:06:18
832
原创 c++之继承(深入解析C++继承机制与代码复用技巧)
本节主要探讨了面向对象编程中的继承机制及其相关概念。首先介绍了继承的基本定义,即允许派生类复用基类的特性并扩展功能,从而减少代码冗余。接着详细讲解了基类与派生类之间的对象赋值转换、作用域规则、派生类的默认成员函数、继承与友元及静态成员的关系。特别强调了复杂的菱形继承及其带来的数据冗余和二义性问题,并提出了通过虚继承来解决这些问题的方法。最后,对比了继承与组合的优缺点,建议在实际开发中优先使用组合以降低类之间的耦合度,提高代码的可维护性。本节还通过学生管理系统的例子,展示了如何通过继承来优化类设计,减少重复代
2025-05-23 19:14:41
1333
原创 C++之模板进阶(探索C++模板:非类型参数与特化技巧)
本节主要介绍了C++模板编程中的几个关键概念:非类型模板参数、类模板的特化、模板特化的应用(如类型萃取)以及模板的分离编译。非类型模板参数允许使用常量作为模板参数,适用于需要固定大小的场景,如静态数组。类模板的特化分为全特化和偏特化,全特化针对特定类型提供特殊实现,而偏特化则对模板参数进行进一步限制。模板的分离编译问题指出,模板的声明和定义通常需要放在同一文件中,以避免链接错误。模板编程虽然提高了代码的复用性和灵活性,但也可能导致代码膨胀和编译时间增加。
2025-05-21 23:13:20
1315
原创 STL之priority_queue(揭秘C++优先队列:高效管理数据优先级)
优先队列(priority_queue)是一种容器适配器,遵循严格弱序原则,确保队列顶部始终为最大元素,类似于堆结构。它通过封装底层容器(如vector或deque)实现,支持插入和删除操作,并自动维护堆性质。优先队列默认使用less仿函数实现大堆,但可通过greater仿函数改为小堆。仿函数通过重载operator()实现类对象像函数一样调用。优先队列不支持迭代器遍历,但底层容器支持。其核心功能包括top()返回堆顶元素和pop()删除堆顶元素,适用于需要高效维护元素优先级的场景。
2025-05-21 21:15:08
999
原创 专题六:记忆化搜索(递归优化的秘密武器)
首先我们要先理解递归的解法:也就是右边那个递归展开图,不难发现递归时间复杂度很大O(2^N)我们发现d(3)的展开左边和右边是一样的,此时是不是可以想方法当左边递归下去返回d(3)时把d(3)的结果记住,也就是充当备忘录的身份(这个备忘录可以是一个数组/哈希表等)记住了当右边递归下去时,发现需要用d(3),而备忘录当中又有d(3),就不用在展开,直接用时间复杂度就会减小,这种方法就叫记忆化搜索,(带备忘录的递归)。
2025-05-20 14:49:54
906
原创 专题五:floodfill算法(扫雷游戏精讲)
M表示:未挖出的地雷E表示:未挖出的空白方块什么叫未挖出,就是你没玩的时候,棋盘是什么样的,就是你站在上帝视角看待棋盘B:表示挖出来是空白的,如果是空白的要延伸到有数字的才会停止1~8是如果你周围有地雷,当你挖出来时就显示周围的地雷数X:表示挖出来的地雷,如果挖出来是地雷就用X表示,并且游戏结束看示例:一开始点了左下角,左下角是空白就用B表示,知道遇到数字就停返回:当你点一次,返回棋盘的结果算法原理分析:其实本质就是一道深度搜索的题目。
2025-05-19 23:14:49
265
原创 专题五:floodfill算法(太平洋大西洋水流问题)
整张图,左边深蓝的是太平洋,右边浅蓝的是大西洋,你需要在矩阵中找到一个点,使其可以流向太平洋又可以流向大西洋,并且你每次流的时候只能由高到低,或者相等到相等。
2025-05-19 18:17:07
335
原创 专题五:floodfill算法(图像渲染深度优先遍历解析与实现)
给一个初始坐标(sr,sc)比如示例中的粉色的1,如果周围上下左右都是1,就是连通块(性质相同的地方),把它涂上颜色(2)即可,右下角不算,因为不算对角线的。
2025-05-19 10:45:33
467
原创 专题四:综合练习(最经典的回溯题之N皇后详解)
下过国际象棋的都知道,皇后可以在它所在的行,所在的列,还有所在的斜线进行移动这道题就是给n个皇后,nxn的棋盘,让这n个皇后不能互相吃彼此。
2025-05-18 11:43:08
321
原创 专题二:二叉树的深度搜素(二叉树的所有路径)重点理解回溯算法的”恢复现场“
全局变量的path:需要我们手动恢复现场(需要掌握,因为难题中会用到这种方法)函数头的path:函数自动帮我们完成恢复现场 (难题不易设计函数头)代码编写:回溯的恢复现场在哪???//这一句完之后就回溯了而且你没有改变这一层的path,这一层的path还是原来那个path你传进去的那个path进去之后是下一层的,你回退到这一层根本没有改变函数自动帮我们恢复现场了注意这里不要加&(引用)引用就类似全局变量;
2025-05-13 16:55:53
458
原创 回溯算法:深度优先搜索的终极指南
关于二叉树的遍历:这里讲解后序遍历,左右根,当我们遍历一个结点时,先考虑左子树,右子树,根,遍历左子树时,又把左子树看成根节点,在左右根,依次递归下去。我们在研究主问题时,发现子问题也是相同的,如果设解决主问题需要用到函数f,解决相同的子问题也会用到f,因为他们是相同的问题,此时就会出现。以走迷宫为例:每走到一个拐点,都可以分左右,那我第一个往左走,发现行不通,就回到上一级的这个操作就称之为回溯,然后在由上一级往另一边走。在归并那里,就是一个数组,然后标记一下数组的左边和右边,完成数组的排序。
2025-05-11 11:56:46
1004
原创 动态规划之二维费用的背包问题解析
给一个m和一个n,m表示最多有多少个0,n表示最多有多少个1,选出来的子集,记录0和1的个数,在不超过的情况下能选的最大子集,也就是能选多少个元素从这里,如果观察敏锐的话,可以发现这是一个背包问题,就是选一堆东西,不能超过巴拉巴拉但这里是有两个背包,也就是m和n,所以这就叫二维背包问题就是由原来的一个体积限制,到现在的体积和重量限制m和n就是两个限制。
2025-05-10 19:39:14
362
原创 动态规划之背包问题(分割等和子集问题)
给一个正整数的数组,让你分隔成两个相等的数组通过观察,我们可以发现,总和是一定的,也就是sum,把sum分成两部分,每部分都是sun/2转换为01背包问题,每个元素都是0或1,挑出的元素总和是sun/2,剩下的那部分就是sum/2了。
2025-05-10 11:57:20
307
原创 动态规划之背包问题:组合优化中的经典NP挑战
背包问题是一种经典的组合优化的NP问题,在计算机科学、运筹学等领域有着广泛的应用。问题可以简单的描述为:假设有一个容量为C的背包和n个物品,每个物品i都有重量w[i]和价值v[i]。目标是选择一些物品放入背包,使得放入背包的物品总价值最大,同时背包中物品的总重量不能超过背包的容量。这里先简单介绍两种背包问题:1.01背包:也就是你物品的个数是1个,你拿了就剩0个,没拿就剩1个2.完全背包:物品个数无数个,可以拿0/1/2/3/4至无穷多个背包也可以分两种:1.背包不需要装满。2.背包必须装满。
2025-05-09 22:20:52
1828
原创 STL之stack&&queue
1.栈是没有迭代器的,因为栈的特性是先进后出,不能随便访问,所以不支持迭代器2.如何遍历?先判断为不为空,不为就取栈顶的数据,取完之后pop就行3.为什么没有析构函数?因为它底层是别的容器,当stack出了作用域自动销毁时会调底层容器的析构函数1.队列是一种容器适配器,专门用于在FIFO(先进先出)中操作,其中从容器的一段插入元素,另一端提取元素2.队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素,元素从队尾入队列,从对头出队列。
2025-05-06 21:30:36
1148
原创 动态规划之子序列问题1
以leetcode300题为例此题最为经典,所有的算法书在讲子序列问题时都以这个为模板题,后面的题可以按照此题的分析方法进行分析。
2025-05-05 17:40:58
386
原创 动态规划之最大子数组(环形数组)
第二种就是你可能前面一部分和后面一部分成环了,你求的是最大,那里面就剩最小。无非就两种情况,一个是你在普通数组的情况下能求最大值,也就是你没有成环。环形数组也就是在普通数组上的变形。
2025-05-04 16:05:43
111
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人