形式语言与自动机第五章课后题全解:CFG、PDA与泵引理
1. 为什么第五章的课后题值得单独拎出来聊形式语言与自动机这门课前四章讲的是有限状态机、正则语言、正则表达式这些相对“接地气”的东西到了第五章画风突然就变了。如果你翻的是那本经典的教材第五章大概率是**上下文无关文法Context-Free Grammar, CFG以及下推自动机Pushdown Automaton, PDA**的内容。这一章是整门课的分水岭——前面你还能靠画状态图混过去到了这里推导、归约、栈操作、泵引理一个比一个抽象。我带过几轮这门课的辅导也自己刷过不止一个版本的课后题。说实话第五章的课后题是整本书里最容易让人卡住的地方没有之一。原因很简单前面的题目有“标准动作”第五章的题目开始考验你对“形式化描述”的理解深度。比如给你一个语言让你写文法答案不唯一但你必须写出一个“对”的再比如给你一个文法让你构造PDA步骤是机械的但中间任何一步搞错整个自动机就是废的。这篇内容就是围绕第五章课后题展开的。我会把常见的题型分类拆解把每一类题目的解题思路、易错点、以及我自己在做题和讲题过程中总结出来的“野路子”都写出来。不管你是正在被作业折磨的学生还是想重新捡起这块知识的从业者应该都能找到对你有用的东西。先说一下第五章课后题大致会覆盖哪些内容心里有个谱上下文无关文法的设计与简化给语言写文法、消除左递归、消除二义性、化简文法。文法与语言的等价性证明证明某个文法生成某个语言或者反过来。下推自动机的构造给语言或文法构造PDA包括空栈接受和终态接受两种方式。PDA与CFG的等价转换从PDA到CFG或者从CFG到PDA。泵引理证明非上下文无关用CFG的泵引理证明某个语言不是上下文无关的。确定性下推自动机DPDA与固有歧义性判断语言是否被DPDA接受判断文法是否固有歧义。下面我按题型来拆每一类都会给出具体的解题框架和典型例题的完整思路。2. 上下文无关文法设计题的破题套路2.1 从语言描述到文法的“逆向思维”课后题里最常见的一类就是给定一个语言的自然语言描述要求写出生成该语言的上下文无关文法。比如“写一个文法生成所有由相同数量的a和b组成的字符串”或者“生成所有回文串”之类的。很多同学拿到这种题的第一反应是“凭感觉写”写出来之后自己也不知道对不对。其实这类题有非常清晰的套路我把它叫做**“逆向思维法”**不要从文法出发去想它生成什么而是从目标字符串的结构出发去想“这个字符串是怎么一步步搭出来的”。以“相同数量的a和b”为例。这个语言是 { a^n b^n | n ≥ 0 } 吗不是因为a和b可以交错比如abba、baab、aabb都算。那这个语言其实是 { w | w中a的个数等于b的个数 }。这个语言是上下文无关的但它的文法不是那么直观。我一般会这样引导学生思考假设你有一个字符串你怎么判断它a和b数量相等一个常用的方法是“配对消除”——找到一个a和一个b把它们消掉剩下的字符串如果还能继续配对最后消空那就相等。这个过程对应到文法上就是S → ε | aSb | bSa | SS这个文法怎么理解aSb表示我在左边放一个a右边放一个b中间递归bSa同理SS表示两个合法的子串拼起来还是合法的。这个文法生成的语言恰好就是a和b数量相等的所有字符串。但这里有个坑这个文法是有二义性的。比如字符串ab可以只通过aSb → ab得到也可以通过SS → aSbS → abS → ab得到。课后题如果要求“写出一个无二义性的文法”那这个答案就不合格。不过大多数题目只要求“写出一个文法”不要求无二义性所以这个答案是可以接受的。注意如果题目明确要求“无二义性”那你就需要换一种思路。对于a和b数量相等的语言无二义性的文法需要更复杂的设计通常要引入“前缀性质”来强制唯一推导。2.2 消除左递归的标准化操作另一类高频题是给定一个文法要求消除左递归。这类题是纯机械操作但步骤必须记牢顺序不能乱。直接左递归的形式是A → Aα | β消除后的形式是A → βA A → αA | ε间接左递归稍微麻烦一点需要先通过代入把间接左递归变成直接左递归然后再消除。我见过很多同学在代入这一步出错原因是代入的顺序搞反了。正确的做法是按照非终结符的某个顺序依次把前面的非终结符代入到后面的产生式中确保处理到第i个非终结符时它的所有产生式都不以它自己或它前面的非终结符开头。举个例子假设有文法S → Aa | b A → Ac | Sd | ε这里S和A之间有间接左递归S → Aa → Sda。消除的步骤是先把S的产生式代入A中。A → Ac | Aad | bd | ε。现在A有直接左递归A → Ac | Aad | ...。提取公因子得到 A → (c | ad)A | bd | ε。消除直接左递归A → bdA | AA → cA | adA | ε。再把新的A代入SS → bdAa | Aa | b。这个过程看起来繁琐但每一步都是确定的。我建议做这类题的时候在草稿纸上把每一步的产生式集合都写清楚不要跳步跳步必错。2.3 文法化简去掉无用符号和ε产生式文法化简也是第五章课后题的常客。化简的目标是得到一个“干净”的文法不包含无用符号、ε产生式除非语言本身包含空串、以及单位产生式。化简的顺序很重要我一般推荐先消除ε产生式找出所有可空的非终结符然后修改产生式。再消除单位产生式A → B 这种把B的产生式复制给A。最后消除无用符号包括无法从开始符号到达的符号以及无法推导出终结符串的符号。这个顺序不能乱。如果你先消除无用符号再消除ε产生式可能会发现原本“有用”的符号因为ε产生式的消除而变得无用了又得重新来一遍。实操心得消除ε产生式的时候最容易漏掉的是“组合情况”。比如产生式 A → BCD如果B、C、D都可空那么A可以推导出BC、BD、CD、B、C、D、ε等多种形式。很多同学只考虑了“全部保留”和“全部删除”两种情况中间的组合漏掉了导致化简后的文法生成的语言变小了。3. 下推自动机构造题的实操细节3.1 从文法到PDA的机械转换课后题里有一类题是给定一个CFG构造等价的PDA。这类题有标准算法我把它叫做“三状态法”创建一个开始状态q0一个“主循环”状态q1一个接受状态q2。q0到q1压入栈底符号Z然后压入文法的开始符号S。即 δ(q0, ε, Z) {(q1, SZ)}。q1到q1对于每个产生式 A → αδ(q1, ε, A) {(q1, α)}。这是“推导”步骤。q1到q1对于每个终结符aδ(q1, a, a) {(q1, ε)}。这是“匹配”步骤。q1到q2当栈顶是Z时δ(q1, ε, Z) {(q2, ε)}。这是“接受”步骤。这个算法是万能的任何CFG都可以这样转成PDA。但课后题往往不会只让你套算法而是会加一些限制比如“要求PDA只有一个状态”或者“要求用终态接受而不是空栈接受”。如果要求“只有一个状态”那就不能用上面的三状态法了。单状态PDA的构造需要把“状态”的信息编码到栈里。这种题难度较大但思路是固定的栈里除了存储符号还要存储“当前处于哪个阶段”的信息。3.2 从语言直接构造PDA以a^n b^n为例如果题目直接给语言让你构造PDA而不是给文法那就需要你直接设计栈操作。以经典语言 { a^n b^n | n ≥ 0 } 为例思路很直接读a的时候往栈里压符号读b的时候从栈里弹符号最后栈空则接受。具体构造空栈接受状态q0读a阶段q1读b阶段。开始状态q0初始栈符号Z。δ(q0, a, Z) {(q0, AZ)}读第一个a压入A。δ(q0, a, A) {(q0, AA)}继续读a继续压A。δ(q0, b, A) {(q1, ε)}读到第一个b弹出一个A切换到q1。δ(q1, b, A) {(q1, ε)}继续读b继续弹A。δ(q1, ε, Z) {(q1, ε)}栈空接受。这个构造里q0和q1的区分是关键。如果没有q1那么读完b之后还可以继续读a就会接受a^n b^n a^m这种不该接受的字符串。注意空栈接受的PDA不需要显式的接受状态但需要确保在所有输入读完后栈恰好为空。如果题目要求终态接受那就需要加一个接受状态并且在栈空时转移到该状态。3.3 PDA的确定性DPDA与非DPDA的边界课后题里有一类判断题判断一个给定的PDA是否是确定性的。确定性的定义是对于每个状态、每个输入符号或ε、每个栈顶符号最多只有一个转移。这里最容易踩的坑是ε转移。很多同学只检查了输入符号的转移忽略了ε转移。如果一个状态在某个栈顶符号下既有ε转移又有输入符号转移那它就不是确定性的。比如δ(q0, a, Z) {(q0, AZ)} δ(q0, ε, Z) {(q1, Z)}这两个转移在栈顶为Z时同时存在所以这个PDA是非确定性的。但这里有个微妙的地方非确定性PDA不一定接受非上下文无关语言。有些语言既可以被DPDA接受也可以被NPDA接受但NPDA的构造更简单。课后题如果问“这个语言是否被DPDA接受”你需要判断的是语言本身的性质而不是某个特定PDA的性质。4. 泵引理证明题的完整拆解4.1 CFG泵引理的表述与理解CFG的泵引理是第五章最让人头疼的内容之一。它的表述是如果L是上下文无关语言那么存在一个常数p使得对于L中任何长度≥p的字符串w都可以写成w uvxyz满足|vxy| ≤ p|vy| ≥ 1对于所有i ≥ 0uv^i xy^i z ∈ L这个引理看起来和正则语言的泵引理很像但多了v和y两个部分。理解它的关键是v和y是被“泵”的部分x是中间不变的部分u和z是两边不变的部分。为什么CFG的泵引理需要五个部分因为CFG的推导树比正则语言的自动机更深。在推导树中如果字符串足够长那么从根到叶子的路径上一定有两个相同的非终结符。这两个非终结符之间的部分可以重复任意次对应到字符串上就是v和y可以同时重复。4.2 用泵引理证明非上下文无关的实战步骤用泵引理证明一个语言不是上下文无关的标准步骤是假设L是上下文无关的取泵引理常数p。选择一个长度≥p的字符串w ∈ L。这个选择很关键要选得“巧妙”让后面的分析容易导出矛盾。考虑w的所有可能分解w uvxyz其中|vxy| ≤ p且|vy| ≥ 1。对于每种分解找到一个i使得uv^i xy^i z ∉ L。导出矛盾证明假设不成立。以经典语言 L { a^n b^n c^n | n ≥ 0 } 为例假设L是上下文无关的取常数p。选择w a^p b^p c^p。因为|vxy| ≤ p所以vxy不能同时包含a、b、c三种符号。它最多包含两种符号。如果vxy只包含a和b那么泵之后a和b的数量会变化但c的数量不变导致三者数量不等。如果vxy只包含b和c同理。如果vxy只包含a那么泵之后a的数量变化b和c不变。如果vxy只包含b或c同理。无论哪种情况泵之后字符串都不在L中。矛盾。所以L不是上下文无关的。这个证明看起来简单但实际操作中有几个坑坑一w的选择。如果你选w a^p b^p c^p但p不够大vxy可能跨越三种符号。但因为|vxy| ≤ p而每种符号至少有p个所以vxy不可能同时包含三种符号。这个推理要写清楚。坑二i的选择。通常i 0或i 2就够了。i 0是“抽掉”v和yi 2是“加倍”。大多数题目用i 0就能导出矛盾。坑三分解的穷举。有些同学只考虑了vxy在a区域的情况忽略了vxy跨越a和b边界的情况。虽然最终结论一样但证明过程不完整会被扣分。4.3 泵引理证明的常见变体课后题里还有一些变体比如证明 { a^i b^j c^k | i j k } 不是上下文无关的这个语言比a^n b^n c^n更复杂但用泵引理依然可以证明。选择w a^p b^{p1} c^{p2}然后分析vxy的位置。证明 { ww | w ∈ {a,b}} 不是上下文无关的*这个语言是“字符串重复”选择w a^p b^p a^p b^p然后分析vxy的位置。证明 { a^n b^n c^m | n ≠ m } 不是上下文无关的这个语言看起来“几乎”是上下文无关的但n ≠ m这个条件让它变成了非上下文无关。证明时需要小心选择w。这些变体的证明思路是一样的但选择的字符串不同。我建议做这类题的时候先把目标语言的性质分析清楚然后选择一个“最能暴露矛盾”的字符串。5. 常见问题与排查技巧实录5.1 文法设计题写出来的文法“太强”或“太弱”这是最常见的问题。写出来的文法要么生成了不该生成的字符串太强要么没有生成所有该生成的字符串太弱。排查方法用边界情况测试。对于你写出的文法手动推导几个短字符串看看是否在目标语言中。比如对于“a和b数量相等”的语言测试ε、ab、ba、aabb、abab、abba、baab、baba。如果这些都能生成再测试a、b、aab、abb这些不该生成的看看文法是否能生成它们。如果文法太强通常是某个产生式的“自由度”太大了。比如S → aS | Sb | ε这个文法生成的是所有字符串因为你可以任意插入a和b而不是a和b数量相等的字符串。修正的方法是引入“配对”机制比如S → aSb | bSa | SS | ε。如果文法太弱通常是漏掉了某些“组合情况”。比如S → aSb | ε只生成a^n b^n漏掉了abba这种交错的情况。修正的方法是加入SS或者bSa这样的产生式。5.2 PDA构造题栈操作“提前”或“滞后”PDA构造题最常见的错误是栈操作的时机不对。比如在a^n b^n的PDA中如果读b的时候没有及时切换状态就会接受a^n b^n a^m这种字符串。排查方法画出栈的变化序列。对于输入字符串aabb手动模拟PDA的每一步看看栈的内容是否正确。如果栈在读完所有输入后不为空或者在不该空的时候空了那就是栈操作有问题。另一个常见问题是ε转移的滥用。有些同学为了让PDA“更灵活”加了大量的ε转移结果导致PDA变成非确定性的或者接受了不该接受的字符串。我的建议是能用输入符号转移就不用ε转移ε转移只在必要的时候使用比如从读a阶段切换到读b阶段。5.3 泵引理证明题分解情况“漏了”或“重了”泵引理证明题最常见的问题是分解情况考虑不全。比如对于w a^p b^p c^pvxy可能的位置有完全在a区域跨越a和b的边界完全在b区域跨越b和c的边界完全在c区域很多同学只考虑了“完全在某个区域”的情况漏掉了“跨越边界”的情况。虽然最终结论一样但证明过程不完整。排查方法画出字符串的“分区图”把w分成几个区域然后逐一分析vxy可能落在哪些区域。对于每种情况选择一个i导出矛盾。5.4 常见问题速查表问题类型典型症状排查方法修正思路文法太强生成了不该生成的字符串用短字符串测试减少产生式的自由度加入配对机制文法太弱漏掉了该生成的字符串用边界情况测试加入组合产生式如SSPDA栈操作错误接受不该接受的字符串手动模拟栈变化调整状态切换时机减少ε转移泵引理分解不全证明过程被扣分画出分区图逐一分析vxy的所有可能位置消除左递归出错代入顺序混乱按非终结符顺序逐步代入不要跳步每步写清楚消除ε产生式漏组合化简后语言变小检查所有可空非终结符的组合考虑部分删除的情况5.5 独家避坑技巧技巧一文法设计先写“骨架”再填“血肉”。对于复杂的语言先写出最核心的产生式比如a^n b^n的骨架是S → aSb | ε然后再考虑如何扩展比如加入交错情况。技巧二PDA构造先确定“阶段”再确定“栈操作”。把PDA的工作过程分成几个阶段比如“读a阶段”“读b阶段”“接受阶段”每个阶段对应一个状态然后再设计每个状态下的栈操作。技巧三泵引理证明先选“最坏情况”的字符串。选择的字符串要让vxy无论怎么放都会导致矛盾。通常选择“三种符号各p个”或者“两种符号交替p次”这样的字符串。技巧四化简文法时用“标记法”。在草稿纸上把每个非终结符标记为“可空”“可达”“可终结”然后逐步消除。不要凭感觉删符号。技巧五做完题后“反向验证”。对于文法题用文法推导几个字符串看看是否在目标语言中对于PDA题手动模拟几个字符串看看是否被正确接受或拒绝。这个习惯能帮你发现大部分错误。6. 从课后题到实际应用的思维迁移6.1 为什么这些“抽象”的题目值得认真做很多同学做第五章课后题的时候会想“这些东西有什么用实际工作中又不会让我写文法。”这个想法可以理解但忽略了一个重要的事实上下文无关文法和下推自动机是编译器、解释器、以及各种语言处理工具的理论基础。你写的每一个解析器parser背后都是CFG在支撑。你用的每一个正则表达式引擎虽然主要是正则语言但在处理嵌套结构比如括号匹配时就需要CFG的能力。你设计的每一个协议解析器如果协议有嵌套结构那本质上就是在处理上下文无关语言。课后题里的那些“写文法”“构造PDA”“用泵引理证明”看起来是纯理论但它们训练的是形式化描述能力和边界情况分析能力。这两种能力在实际工作中非常值钱。6.2 从课后题到解析器设计的映射以“写一个文法生成所有平衡括号串”为例。这个课后题的答案很简单S → (S) | SS | ε但在实际应用中这个文法对应的是一个括号匹配解析器。如果你要写一个JSON解析器JSON的语法本质上就是一个CFG。你要处理的嵌套对象、嵌套数组都是通过递归下降或者LR分析来处理的。再比如课后题里让你“消除左递归”这个操作在实际的递归下降解析器中是必须的。因为递归下降解析器不能处理左递归文法否则会无限递归。所以你在设计解析器之前必须先把文法转换成无左递归的形式。6.3 从PDA到栈式虚拟机的映射PDA的栈操作和栈式虚拟机比如JVM、Python虚拟机的执行模型非常相似。PDA的“压栈”“弹栈”对应虚拟机的“push”“pop”指令。PDA的“状态转移”对应虚拟机的“指令跳转”。如果你理解了PDA的工作原理那么理解栈式虚拟机的执行模型就会容易很多。反过来如果你在实际工作中接触过栈式虚拟机那么做PDA的课后题也会更有感觉。6.4 从泵引理到“不可能性证明”的思维训练泵引理证明题训练的是“证明某件事不可能”的能力。这种能力在实际工作中同样重要。比如当你需要证明“某个协议无法在有限状态下实现”或者“某个语言无法用正则表达式描述”时泵引理就是你的工具。虽然实际工作中很少直接用到泵引理但这种“找到反例”的思维方式是非常有价值的。它让你在面对复杂问题时能够快速判断“这个问题有没有解”“这个方案有没有根本性的缺陷”。7. 我个人的做题节奏与复盘方法7.1 做题节奏先分类再逐个击破我自己的习惯是拿到第五章的课后题先花10分钟把题目分类。哪些是文法设计题哪些是PDA构造题哪些是泵引理证明题哪些是化简题。分类之后按照“先易后难”的顺序做。通常的顺序是化简题 → 文法设计题 → PDA构造题 → 泵引理证明题。化简题是机械操作做起来快能帮你进入状态。文法设计题需要一些创造力但难度可控。PDA构造题步骤多需要细心。泵引理证明题最难放在最后做。7.2 复盘方法错题本 模式识别我强烈建议准备一个错题本。不是简单地抄题目和答案而是记录错误的原因和正确的思路。比如错误原因消除左递归时代入顺序搞反了。正确思路按照非终结符的顺序依次把前面的代入后面的。类似题目第5.3题、第5.7题。这样积累下来你会发现自己的错误是有模式的。比如你可能总是在“ε产生式的组合情况”上出错或者在“泵引理的分解情况”上漏掉边界。识别出这些模式之后就可以有针对性地练习。7.3 时间分配建议如果你有10道第五章的课后题我建议的时间分配是化简题2道30分钟文法设计题3道60分钟PDA构造题3道60分钟泵引理证明题2道60分钟复盘和检查30分钟总共大约4小时。如果你发现某类题目花的时间远超预期那说明这类题目是你的薄弱环节需要额外练习。最后再分享一个小技巧做PDA构造题的时候用纸笔画栈的变化序列比在脑子里想要可靠得多。我见过太多同学因为“心算”栈操作而犯错。画出来一步一步走虽然慢一点但正确率高很多。7.4 关于“答案不唯一”的心态调整第五章的很多题目答案不唯一。文法设计题可以写出多个正确的文法PDA构造题也可以有不同的状态设计。这会让很多同学习惯性地怀疑“我的答案是不是不对”。我的建议是只要你的答案满足题目的要求就是对的。不要因为和参考答案不一样就否定自己。当然前提是你需要验证自己的答案确实满足要求。验证的方法就是前面说的“边界情况测试”和“手动模拟”。如果你实在不确定可以把你的答案和同学的对比看看生成的语言是否一致。如果一致那就没问题。如果不一致再分析谁对谁错。7.5 关于“泵引理”的心理障碍泵引理是很多同学的心理障碍。一看到“证明不是上下文无关”就慌了。其实泵引理的证明套路非常固定假设 → 选字符串 → 分析分解 → 导出矛盾。你只需要把每一步写清楚不要跳步就能拿到大部分分数。我见过很多同学在泵引理证明题上得零分不是因为不会而是因为写得太简略。比如只写了“无论怎么分解都会导致矛盾”但没有具体分析每种分解情况。这种答案在考试中会被扣分。所以宁可写得多一点也不要跳步。7.6 从“做题”到“出题”的进阶如果你已经把第五章的课后题刷完了想进一步提升我建议你尝试“自己出题”。比如给定一个语言写出它的文法然后构造PDA然后用泵引理证明它不是正则的如果适用。给定一个文法消除左递归化简然后构造PDA。给定一个PDA写出它的文法然后判断它是否是确定性的。这种“自己出题”的练习能帮你把知识点串联起来形成完整的知识网络。而且当你能够自己出题的时候你就真正掌握了这部分内容。7.7 关于教材选择的补充不同教材的第五章内容可能略有差异。有的教材把CFG和PDA放在第五章有的放在第六章。有的教材把泵引理放在更靠后的章节。如果你发现自己的教材和这篇内容的章节划分不一致不用慌核心知识点是一样的CFG、PDA、泵引理、化简、消除左递归。你只需要根据自己教材的章节安排找到对应的内容即可。如果你用的是那本经典的“龙书”编译原理第五章可能是语法分析的内容。但形式语言与自动机这门课的教材通常是另一本比如那本经典的“乌龟书”Introduction to the Theory of Computation。不同教材的侧重点不同但课后题的题型是相似的。7.8 最后的一点个人体会形式语言与自动机这门课第五章是最“劝退”的一章。但也是最能锻炼“形式化思维”的一章。我自己的体会是这一章的课后题做一遍是不够的。第一遍做的时候你是在“模仿”解题套路第二遍做的时候你是在“理解”背后的原理第三遍做的时候你才能“灵活运用”。如果你现在正在被第五章的课后题折磨我想说这是正常的。几乎每个人都会在这个阶段卡住。但只要你坚持把每一类题目的套路搞清楚把每一个易错点记下来你最终会发现这些题目其实并没有那么难。它们只是需要你换一种思维方式——从“直觉”转向“形式化”。而这种思维方式的转变才是这门课真正想教给你的东西。

相关新闻

PyTorch 18个核心损失函数实战指南:从原理到工业级选型

PyTorch 18个核心损失函数实战指南:从原理到工业级选型

1. 为什么这18个损失函数值得你花一整晚逐个敲一遍PyTorch的torch.nn模块里,损失函数(Loss Function)不是工具箱里可有可无的螺丝钉,而是整个模型训练过程的“方向盘油门刹车”三合一控制器。我带过不少刚从Keras或TensorFlow转过…

2026/10/15 11:49:36 阅读更多 →
RGB、HSV、HSI颜色模型详解:从原理到实战选型

RGB、HSV、HSI颜色模型详解:从原理到实战选型

上周有个朋友甩给我一串十六进制颜色值,说想在一排LED灯上复现出那种“很正的蓝”。我按RGB思路调了一整晚,从#1D4ED8调到#1E50E8,怎么看都不对:要么发紫,要么发灰。后来干脆换到HSV模式,只动了一下色相和一…

2026/10/15 11:49:36 阅读更多 →
1014Python画图

1014Python画图

#本地python环境编写,不是jupyter环境,IDLE就可以运行,后面的代码可以jupyter里面运行,think in Python 第四章练习题 from turtle import * from math import sin,pi def triangle(r,n):forward(r)a1180-(180-360/n)/2left(a1)le…

2026/10/15 11:49:36 阅读更多 →

最新新闻

Spring Boot 部署实践:jar、war、Docker与Compose

Spring Boot 部署实践:jar、war、Docker与Compose

部署这事,看起来简单,实际坑不少。刚学 Spring Boot 的时候,我都是本地mvn spring-boot:run跑起来就完事,直到有一次要把一个“某订单服务”项目丢到测试服务器上给同事联调,才真正体会到“跑起来”和“部署好”是两码…

2026/10/15 13:21:53 阅读更多 →
python爬虫使用正则爬取网站的实现

python爬虫使用正则爬取网站的实现

前言 用正则表达式从网页里提取内容,是很多人接触爬虫的第一步:拿到 HTML 源码,用 re.findall 把链接、标题、价格抠出来。这条路学习成本低,但也最容易被用歪——既容易写出脆弱的模式,也容易忽视抓取的分寸。 本文要…

2026/10/15 13:21:53 阅读更多 →
图像超分辨入门:三种经典插值算法原理与实战对比

图像超分辨入门:三种经典插值算法原理与实战对比

从大一开始接触数字图像处理,我就发现“图像超分辨”这个名字有点劝退。很多人一上来就把它想成需要显卡、需要庞大训练集、需要跑上几天才能完成的深度学习任务。但实际上,在深度学习普及之前,甚至到现在很多工程场景里,基于插值…

2026/10/15 13:21:53 阅读更多 →
教育专用大模型:从问答工具到教学认知协作者

教育专用大模型:从问答工具到教学认知协作者

简介:本资源是之江实验室联合中国教育科学研究院发布的《重构教育图景:教育专用大模型研究报告(简版)》,面向教育技术研究者、AI教育产品开发者、K12学校信息化负责人及教育政策制定者,系统回应教育大模型‘…

2026/10/15 13:21:53 阅读更多 →
FFmpeg音频重采样与AAC编码优化实战指南

FFmpeg音频重采样与AAC编码优化实战指南

1. 音频重采样技术背景解析在数字音频处理领域,重采样(Resampling)是一项基础但至关重要的技术。简单来说,它就像把不同尺寸的图片进行缩放转换,只不过我们处理的对象是音频数据。当我们需要将音频从48kHz降到44.1kHz&…

2026/10/15 13:21:52 阅读更多 →
贪心算法实战:Prim最小生成树从原理到堆优化

贪心算法实战:Prim最小生成树从原理到堆优化

1. 从一个真实场景说起:为什么我们需要最小生成树很多人第一次接触最小生成树这个概念,是在算法课上听老师念PPT,什么“带权无向连通图”“边权和最小”“无环子图”,听完一头雾水,考试前背个模板就过去了。但如果你真…

2026/10/15 13:20:52 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →