- 博客(51)
- 收藏
- 关注
原创 【VLLM启动大模型共享内存不足-AI知识点】
摘要: 在Docker中使用vLLM部署大模型时,NCCL多卡通信常因默认64MB共享内存(/dev/shm)不足而报错,导致模型崩溃。NCCL依赖共享内存实现高速多卡通信,但Docker的默认限制无法满足大模型需求。解决方案包括:1)通过--shm-size=4g(或更大)调整容器共享内存;2)在docker-compose中配置shm_size字段。禁用共享内存(NCCL_SHM_DISABLE=1)虽可行但会降低性能。建议优先扩容共享内存以保障高效通信,避免部署过程中的“隐形大坑”。
2026-05-18 10:00:42
459
原创 【图谱融合-AI知识点】
摘要: 图谱融合(Knowledge Fusion)是将多源异构知识(如维基百科、行业数据库)整合为统一知识图谱的技术,核心解决异构性(属性命名差异)、冗余性(重复信息)和冲突性(矛盾事实)三大挑战。其流程分为:1. 模式对齐(统一属性语义,如用编辑距离算法匹配“author”与“writer”);2. 实体对齐(识别同一对象,如通过名称、属性、关联关系判断“Beijing”与“北京”);3. 冲突消解(基于可信度、时效性或投票机制裁决矛盾)。图谱融合是构建高质量知识库(如KAG)的基础,与RAG(文本检索
2026-04-28 17:41:19
390
原创 【异步接口:Flask vs FastAPI 实战笔记】
这篇文章对比了Flask和FastAPI在处理高并发请求时的性能差异,揭示了同步与异步编程的本质区别。通过银行柜台和海底捞服务员的生动比喻,解释了同步阻塞与异步非阻塞的工作原理。文章提供了Flask同步写法和FastAPI异步写法的完整代码示例,并重点讲解了如何将同步代码改造为异步的正确方法(包括使用run_in_executor处理阻塞代码)。最后总结了WSGI/ASGI的区别、协程优势以及Pydantic的数据校验特性,推荐开发者拥抱FastAPI来提升性能。全文兼顾技术深度与通俗易懂,帮助读者理解异步
2026-04-28 16:54:39
472
原创 【力扣-102.二叉树的层序遍历】Python笔记
摘要:本文详细解析LeetCode102题二叉树的层序遍历,重点讲解BFS算法中"队列+记录层大小"的核心技巧。通过分析为什么需要记录每一层节点数,揭示了分层遍历的关键所在,并提供Python代码实现。文章还深入探讨了时间复杂度(O(N))和空间复杂度(O(W)),帮助读者掌握这一基础算法模板,为后续解决类似问题(如求树深度、锯齿遍历等)打下坚实基础。
2026-04-25 12:25:58
372
原创 【力扣-108.将有序数组转换为二叉搜索树】Python笔记
摘要:LeetCode108题通过有序数组构建平衡二叉搜索树,巧妙运用分治法实现高效转换。关键在于选取数组中间元素作为根节点,递归构建左右子树,确保树的高度平衡。该方法时间复杂度O(n),空间复杂度O(log n),完美结合了二分查找和二叉树的特性,是处理有序数据结构的经典范例。
2026-04-25 12:22:55
352
原创 【LLM & VLLM-AI知识点[特殊字符]】
本文深入浅出地解析了 LLM 与 vLLM 的本质区别,详细讲解了 vLLM 的核心技术 PagedAttention 与连续批处理原理,并提供了基于 OpenAI 格式的 Python 部署与调用实战代码。助你从原理到落地彻底掌握大模型高性能推理。
2026-04-22 14:59:34
370
原创 【关于“0.0.0.0 无法作为 HTTP 请求地址”-Python知识点】
摘要:本文解释了为什么在浏览器输入0.0.0.0会无效。0.0.0.0作为服务端监听地址时表示"绑定所有网卡",但作为客户端请求地址时却是无效目标。作者用"房子与门"的比喻形象说明:服务端监听0.0.0.0相当于打开所有入口,而客户端访问0.0.0.0则像要求邮递员投递到"所有门",导致系统困惑。文章还提供了实用建议:服务端应监听0.0.0.0以便多设备访问,客户端则应使用127.0.0.1或具体局域网IP。
2026-04-22 14:53:23
830
原创 【一文搞懂本地模型调用-AI知识点】
本文深入浅出地解析了"本地调用大模型"与"调用本地API"的核心区别:前者是数据不出本地的战略选择,后者是实现本地调用的技术手段。文章通过"在家做饭"的生动比喻,将三种AI部署方式(云端API、本地部署、本地API)形象化为外出就餐、自家下厨和传菜口取餐,并配有实战代码演示如何通过Python调用本地模型API。特别强调本地化部署在数据隐私、长期成本和定制化方面的优势,为开发者提供了清晰的架构选型思路。
2026-04-17 22:13:18
415
原创 【Docker基本知识-AI知识点】
Docker实战指南:从原理到可视化开发摘要:本文深入浅出讲解Docker核心原理(Namespace、Cgroups、UnionFS三大技术),通过IDE可视化操作、常用命令速查和实战案例,帮助开发者快速掌握容器化技术。内容涵盖镜像构建、容器管理、VSCode插件使用及Docker Compose编排,并提供最佳实践建议,解决"环境不一致"的痛点问题,让开发部署更高效可靠。(149字)
2026-04-17 22:06:55
401
原创 【力扣-101.对称二叉树】Python笔记
摘要:本文介绍判断二叉树对称性的高效递归解法。通过分析镜像对称的本质条件(根节点值相同、左右子树互为镜像),提出双指针递归思路。代码实现采用辅助函数check(left,right),通过三步终止条件(双空、单空、值不等)和递归检查左右子树的内外侧对应关系,实现O(n)时间复杂度的优雅解法。该方法突破了单节点递归的思维定式,适用于类似比较两棵树的场景,是LeetCode101题的理想解法。
2026-04-08 09:45:03
209
原创 【力扣-226.翻转二叉树】Python笔记
摘要:本文以幽默风格解析LeetCode经典题"翻转二叉树",通过镜像比喻讲解递归解法。文章指出翻转本质是交换每个节点的左右子树,重点剖析递归三要素:终止条件、问题拆解和当前层逻辑,并给出详细注释的Python代码实现(后序遍历版本)。同时提及迭代解法思路,强调递归思维在树问题中的重要性。最后总结解题心法:信任递归函数定义,避免过度追踪完整流程,为更复杂的树形DP问题打下基础。
2026-04-08 09:44:51
313
原创 【力扣-104.二叉树的最大深度】Python笔记
摘要:本文深入解析LeetCode104题"二叉树最大深度",通过分治思想讲解递归解法。将问题拆解为左/右子树最大深度的较大值加1(根节点),用通俗比喻解释递归逻辑。提供Python代码示例,详细拆解执行过程,包括终止条件、任务分派和回溯合并。同时探讨递归的栈溢出风险和迭代替代方案(BFS)。掌握这一递归范式,就能解决类似树形DP问题。全文用大白话讲解,帮助读者轻松理解二叉树深度计算的核心思路。
2026-04-07 21:11:28
213
原创 【力扣-94.二叉树的中序遍历】Python笔记
摘要:本文系统讲解二叉树前序、中序、后序遍历的迭代实现方法。通过对比递归与迭代的区别,提出"统一迭代法"思路,详细解析三种遍历的核心逻辑:前序(中左右)采用先右后左入栈,中序(左中右)使用指针辅助一路向左入栈,后序(左右中)通过修改前序逻辑并反转结果实现。文章提供Python代码示例和对比表格,帮助读者彻底掌握二叉树遍历的迭代写法,提升面试解题能力。
2026-04-07 21:11:13
259
原创 【力扣-146LRU缓存】Python笔记
摘要:LRU缓存算法是面试高频考点,其核心在于"哈希表+双向链表"的黄金组合。哈希表实现O(1)查找,双向链表维护访问顺序。本文详解LeetCode146题解法,引入虚拟头尾节点简化边界处理,提供Python完整实现代码。通过辅助函数封装链表操作,确保get/put操作均为O(1)时间复杂度,并重点讲解节点删除时同步清理哈希表的关键细节。掌握这一数据结构设计思路,可从容应对相关面试问题。
2026-04-07 08:58:04
352
原创 【力扣-23. 合并k个升序链表】Python笔记
摘要:本文介绍LeetCode23题"合并K个升序链表"的高效解法。采用分治策略将问题分解为两两合并,复用合并两个有序链表的方法,时间复杂度优化至O(NlogK)。详细解析了分治法的实现步骤:递归切分链表数组到单个链表,然后逐层合并。相比暴力法的O(N×K)复杂度,分治法显著提升效率。文章包含完整的Python代码实现和复杂度分析,帮助读者掌握处理多路归并问题的核心技巧。
2026-04-07 08:57:49
416
原创 【python:浅拷贝vs深拷贝】
Python拷贝机制避坑指南:赋值、浅拷贝和深拷贝的区别至关重要。赋值(=)只是创建别名,共享内存地址;浅拷贝(copy.copy())复制外层对象但共享内层引用;深拷贝(copy.deepcopy())则完全克隆所有层级。处理嵌套数据结构时,误用浅拷贝会导致内层数据被意外修改,而深拷贝能确保数据独立性。建议对复杂业务数据直接使用深拷贝以避免隐患,虽然性能略有损耗,但能有效防止数据污染问题。掌握这些概念能帮助开发者正确处理Python中的对象复制场景。
2026-04-06 18:51:33
344
原创 【力扣-148. 排序链表】Python笔记
本文介绍了归并排序在链表排序中的优雅应用。归并排序天然契合链表特性,通过快慢指针分治(O(n)时间找中点)、递归排序(O(logn)深度)和双指针合并(O(n)时间)三个步骤,实现O(nlogn)时间复杂度且无需额外空间的排序方案。重点解析了LeetCode 148题的解题思路,强调切断链表连接的关键操作(prev.next=None)以避免无限递归,并提供了完整的Python代码实现。该算法综合考察了快慢指针、递归思维和双指针合并等核心链表操作技巧。
2026-04-06 18:48:46
223
原创 【力扣-138. 随机链表的复制 ✨】Python笔记
摘要:本文详解LeetCode 138题"随机链表的复制"问题,提出两种解决方案:1)"拼接-赋值-拆分"三步法,通过$O(1)$空间复杂度实现深拷贝,巧妙利用节点位置关系解决random指针问题;2)递归+哈希表法,以$O(N)$空间换取更直观的逻辑。文章对比了两种方法的优缺点,强调迭代法适合空间敏感场景,而递归法代码更简洁。核心在于理解深拷贝的本质及链表操作的技巧,为处理类似数据结构问题提供清晰思路。
2026-04-05 20:22:25
244
原创 【力扣-25. k个一组翻转链表 ✨】Python笔记
本文介绍了K个一组翻转链表的两种实现方法。迭代法通过创建虚拟头节点简化处理,遍历时检查剩余节点数量,对满足条件的子链表进行反转并维护连接关系。递归法则通过递归检查节点数量,反转前k个节点后递归处理后续链表。两种方法都需要注意链表连接不断链、保存前后节点信息,迭代法使用虚拟头节点简化首节点处理,递归法则需注意栈空间使用。核心反转操作均采用经典的三指针法实现。
2026-04-05 20:22:14
43
原创 【力扣-24. 两两交换链表中的节点 ✨】Python笔记
本文详细讲解了两两交换链表节点的两种解法。核心技巧包括使用虚拟头节点统一操作和三指针法进行指针重连。迭代法通过四步断链重连实现,时间复杂度O(n),空间复杂度O(1)。递归法则将问题分解为交换前两个节点并递归处理剩余链表,代码更简洁但空间复杂度为O(n)。两种方法都强调画图辅助理解指针变化,特别指出虚拟头节点对处理边界情况的重要性。文章通过清晰的步骤拆解和Python代码实现,帮助读者掌握链表节点交换的关键技术。
2026-04-04 15:30:15
576
原创 【力扣-19. 删除链表的倒数第n个节点 ✨】Python笔记
摘要:本文介绍高效删除链表倒数第N个节点的双指针解法。通过创建虚拟头节点统一处理边界情况,使用快慢指针实现单次遍历:快指针先移动N步建立间距,然后同步移动直至链表末尾,此时慢指针即指向目标节点的前驱位置。该算法时间复杂度O(L),空间复杂度O(1),巧妙解决了传统方法需要两次遍历的问题,并完整处理了删除头节点等边界情况,是链表操作的经典范例。
2026-04-04 15:29:59
195
原创 【力扣-2. 两数相加 ✨】Python笔记
摘要:LeetCode第2题"两数相加"通过链表模拟整数加法运算,利用逆序存储特性实现从低位到高位的计算。核心解法采用虚拟头节点简化操作,配合进位变量记录每位相加结果。时间复杂度O(max(m,n)),空间复杂度O(1)。关键点包括:处理不等长链表时补零、最终进位处理,以及逆序存储带来的计算顺序优势。该解法可扩展至正序链表加法和二进制加法等变种问题,是掌握链表操作的经典范例。
2026-04-03 21:09:39
62
原创 【力扣-21. 合并两个有序链表 ✨】Python笔记
本文解析LeetCode 21题"合并两个有序链表"的解题方法。通过虚拟头节点(dummy node)和双指针技术,可以优雅地实现链表合并:1)创建虚拟头节点简化边界处理;2)使用双指针比较节点值,将较小节点接入新链表;3)处理剩余节点直接拼接。该方法时间复杂度O(m+n),空间复杂度O(1),代码简洁高效,避免了头节点特殊判断的麻烦。
2026-04-03 21:05:20
230
原创 【力扣-142. 环形链表2 ✨】Python笔记
摘要:LeetCode 142题详解如何定位环形链表的入口节点。通过快慢指针法,第一阶段寻找相遇点证明有环,第二阶段重置快指针并同速移动,最终相遇点即为环入口。数学推导揭示原理:从头到入口距离a,入口到相遇点距离b,环周长c,满足a = n(c) - b。Python代码实现分为两阶段:快慢指针遍历和重置指针同步移动。该算法是解决链表环问题的经典套路,适用于类似场景。
2026-03-31 22:32:23
68
原创 【力扣-141. 环形链表 ✨】Python笔记
摘要:本文巧妙地将职场困境类比为链表中的"环形结构",通过LeetCode141题讲解快慢指针算法(龟兔赛跑)的环检测原理。核心解法是让快慢指针以不同速度遍历链表,若相遇则存在环(O(1)空间复杂度),否则无环。文章不仅提供Python代码实现,更将算法思想延伸至职场哲学:当工作陷入重复循环时,需要转换思路而非盲目努力。这种算法与现实的类比,既生动解释了技术原理,又赋予职场思考新视角。
2026-03-31 22:30:14
68
原创 【力扣-234. 回文链表 ✨】Python笔记
本文介绍了判断回文链表的三种方法,重点分析了最优解法。暴力法通过转为数组比较正逆序,简单但空间复杂度高;递归法利用递归栈逆序访问,空间复杂度仍为O(n);最优解结合快慢指针找中点和反转后半链表,将空间复杂度降至O(1)。文章详细解析了LeetCode 234题的解法步骤:找中点、反转后半部分、双指针比较,并提供了Python实现代码。最后总结指出,暴力法适合快速实现,而"快慢指针+链表反转"是最优解,建议重点掌握。
2026-03-30 20:34:24
63
原创 【力扣-206. 反转链表 ✨】Python笔记
链表反转是链表操作的基础问题,迭代法通过维护pre和cur两个指针逐步反转节点方向。初始化时pre为None,cur指向头节点;遍历时保存cur.next,反转指针后更新pre和cur;最终返回pre作为新链表头。LeetCode206题展示了该算法的应用,时间复杂度O(n),空间复杂度O(1)。掌握这一高效原地解法有助于解决更复杂的链表问题。
2026-03-30 20:34:15
51
原创 【力扣-160.相交链表 ✨】Python笔记
链表是一种常见的数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表可以分为单向链表和双向链表,单向链表每个节点只指向下一个节点,而双向链表每个节点可以指向下一个和上一个节点。 链表的时间复杂度取决于操作的类型。例如,访问链表中的某个节点的时间复杂度是O(n),因为需要从头节点开始逐个遍历直到找到目标节点。插入和删除操作的时间复杂度是O(1)如果知道目标节点的位置,否则是O(n)因为需要找到目标节点。
2026-03-29 23:27:28
70
原创 【力扣-240. 搜索二维矩阵2 ✨】Python笔记
本文解析LeetCode240题「搜索二维矩阵II」,提出高效查找策略。面对行列均有序的特殊矩阵,传统二分查找效率不足(O(mlogn))。创新性地采用从右上角开始的Z字形查找法:当前值大于目标则左移,小于目标则下移,充分利用行列有序特性。该方法将时间复杂度优化至O(m+n),空间复杂度保持O(1)。核心突破在于将矩阵视为二叉搜索树,通过指针移动快速排除行列,比逐行二分更高效。示例代码演示了如何用行列指针实现这一策略,展现了算法设计中利用数据结构特性的重要性。
2026-03-29 23:25:33
207
原创 【力扣-54. 螺旋矩阵 ✨】Python笔记
摘要:本文介绍了一种顺时针螺旋遍历矩阵的算法。通过维护四个边界指针(top,bottom,left,right)来动态控制遍历范围,按照"右→下→左→上"的顺序循环访问元素,每完成一圈后收缩边界。算法时间复杂度为O(MN),空间复杂度O(1)。实现时需注意边界检查和更新顺序,防止重复访问或越界。该方法能高效处理各种矩阵情况,包括空矩阵和单行/单列矩阵。
2026-03-24 21:56:40
59
原创 【力扣-73. 矩阵置零 ✨】Python笔记
LeetCode 73题要求在O(1)空间复杂度下将矩阵中的零元素所在行列置零。关键思路是利用矩阵第一行和第一列作为标记空间:首先检查第一行/列是否有零并记录;然后遍历内部区域,发现零时将对应行首和列首置零标记;最后根据标记批量置零内部区域,再处理第一行/列。该方法通过两次遍历实现,时间复杂度O(mn),空间复杂度O(1)。需注意避免标记覆盖原始数据,并正确处理边界情况。
2026-03-24 21:50:41
40
原创 【力扣-41. 缺失的第一个正数 ✨】Python笔记
原地哈希法通过数组索引存储信息,避免额外空间。将正整数x交换到索引x-1位置,遍历时检查i+1是否匹配当前值,首个不匹配处即为缺失的最小正整数。时间复杂度O(N),空间复杂度O(1)。需注意避免交换死循环和数组越界问题。
2026-03-23 22:41:44
211
原创 【力扣-238. 除了自身以外数组的乘积 ✨】Python笔记
摘要:本文介绍Python高效解题技巧与LeetCode238题解法。首先讲解Python实用工具:defaultdict自动初始化字典和float('inf')处理极值。针对"除自身以外数组乘积"问题,提出两种解法:1)左右乘积数组法(空间O(n)),通过预处理左右乘积求解;2)优化版(空间O(1)),复用输出数组动态计算。两种方法时间复杂度均为O(n)。最后指出这种左右分解思想可扩展应用于接雨水、股票买卖等数组处理问题。
2026-03-23 22:39:38
302
原创 【力扣-189. 旋转数组 ✨】Python笔记
数组轮转问题通过三次反转实现高效原地操作。核心步骤:1)处理k值取模;2)反转前n-k和后k个元素;3)整体反转。该方法时间复杂度O(n),空间复杂度O(1),优于切片法和循环替换。以[1,2,3,4,5,6,7]右移3位为例:先反转前4位和后3位,再整体反转即得[5,6,7,1,2,3,4]。该算法可拓展为左旋转和区间旋转,是解决轮转问题的经典方案。
2026-03-20 09:21:25
198
原创 【力扣-56. 合并区间 ✨】Python笔记
区间问题通用解法是排序后遍历合并:先按左端点排序消除无序性,初始化合并区间为第一个区间。遍历时若当前区间左端点≤合并区间右端点则合并(右端点取两者最大值),否则将合并区间加入结果并开始维护新区间。该解法时间复杂度O(nlogn),适用于合并、插入、求交集等区间问题。如LeetCode 56题合并区间,排序后只需与前一个合并区间比较即可完成所有重叠区间的合并。
2026-03-20 09:20:01
206
原创 【力扣-53. 最大子数组和 ✨】Python笔记
摘要:贪心算法通过局部最优选择构建全局最优解,适用于可分治的问题。以最大子数组和为例,贪心解法遍历数组时维护当前和,若为负则重置,否则累加,始终记录最大值。相比动态规划,贪心空间效率更高(O(1)时间复杂度O(n))。该思想还可扩展应用于最小子数组和等问题。核心在于负数累计会拖累结果,需及时重置计算起点。
2026-03-19 10:54:48
31
原创 【力扣-76. 最小覆盖字串[特殊字符]】Python笔记
本文介绍了滑动窗口算法解决子串/子数组问题的通用框架。该算法通过左右指针维护动态窗口,配合哈希表统计字符出现次数,用valid变量判断窗口有效性。以LeetCode76题为例,详细演示了如何寻找覆盖目标串的最小子串:初始化双指针和计数器,右扩窗口直至满足条件,再收缩左边界优化窗口长度,最终返回最小覆盖子串。该模板时间复杂度O(n),适用于各类字符串覆盖、子数组和等问题,具有通用性强、效率高的特点。
2026-03-19 10:54:32
196
原创 【力扣-239. 滑动窗口最大值[特殊字符]】Python笔记
本文介绍了单调队列在滑动窗口极值问题中的应用。通过维护一个双端队列,保证队列元素单调递减,可以高效获取每个窗口的最大值。算法实现包含三个关键步骤:维护队列单调性、移除过期元素和记录结果。该方法将时间复杂度优化至O(n),空间复杂度为O(k)。代码示例展示了如何使用双端队列实现该算法,并给出了具体应用案例。该技术适用于各类需要快速查询区间极值的场景,能有效提升滑动窗口问题的处理效率。
2026-03-18 16:06:58
49
原创 【力扣-560. 和为 K 的子数组[特殊字符]】Python笔记
本文介绍了使用前缀和与哈希表高效解决子数组和问题的算法。前缀和将区间和计算优化为O(1),哈希表记录前缀和出现次数以实现快速查询。以LeetCode560题为例,通过维护当前前缀和,在哈希表中查找target=pre_sum-k的出现次数,累计符合条件的子数组数量。算法时间复杂度O(n),空间复杂度O(n),相比暴力法的O(n²)显著提升。关键点包括初始化prefix_count={0:1}和核心计数逻辑result_count += prefix_count[target]。该方法适用于各类子数组和问题。
2026-03-18 16:06:41
217
原创 【python知识点—map()函数】
Python的map()函数是一个内置高阶函数,用于将指定函数批量应用到可迭代对象的每个元素上,返回一个迭代器。其基本语法为map(函数,可迭代对象),支持单个或多个可迭代对象,并可与lambda表达式或内置函数配合使用。主要特点包括:可替代循环实现批量处理;支持多参数操作;返回的迭代器需转换为列表等序列格式才能重复使用。与列表推导式相比,map更适合简单批量操作,而列表推导式在复杂逻辑处理上更具可读性。使用时需注意函数参数与可迭代对象数量匹配、迭代器只能遍历一次等细节。
2026-03-17 22:16:24
549
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅