Java实现ε-closure:NFA转DFA的核心算法实战
简介本资源是一份面向计算机专业本科生的《编译原理》课程设计报告聚焦NFA空闭包ε-closureI的Java程序实现解决有限自动机中状态子集经ε弧可达性计算这一核心教学难点。报告完整覆盖需求分析、概要与详细设计、测试用例、用户说明及源码附录含状态转换图自动生成模块强调算法逻辑与工程落地结合。资源为单文件DOCX文档177KB内容结构清晰含6大章节需求/概设/详设/测试/使用说明/总结、参考文献及可直接运行的Java源代码附录便于理解算法原理并复现验证。已有1284人学习下载适合课程设计参考、编译原理实验拓展及NFA向DFA转换前置知识巩固尤其对递归求闭包、空弧遍历与状态图可视化实现有细致剖析。1. ε-closureI不是数学题是NFA转DFA的“启动钥匙”一份能跑通、能调试、能交作业的Java课程设计实录你写完NFA状态图画满ε弧却卡在“怎么把I{1,3}变成ε-closure(I)”这一步不是算法没看懂而是手头缺一个能输入真实NFA字符串、能输出可验证结果、能对着控制台一行行debug的Java程序——这正是这份《ε-closureI的程序实现》课程设计报告的核心价值。它不是教科书里的伪代码而是一份华北水利水电学院信息工程学院2019级计算机专业学生亲手敲出来、跑通三组测试用例、附带完整源码和调试日志的实战交付物。它解决的不是“什么是ε-closure”而是“我改了第7行代码后为什么输出多了一个空串”“为什么状态X读空后没递归进Y”“为什么map里key是[1,3]但value却是[1,3,5]却死活打不出来”这类真正在写课程设计时会撞墙的问题。适合正在赶编译原理实验 deadline 的本科生、需要快速复现核心逻辑验证自己理解的研究生以及想用Java带学生过一遍NFA→DFA转换全流程的一线教师。它不讲λ-NFA的理论完备性只告诉你当你的NFA用(X,ε)→1 (1,a)→2 (2,ε)→Y这种字符串格式存进txt程序就能吐出ε-closure({X}) {X,1}且你能立刻在IDEA里打断点看到RestltList(X, strings)第一次调用返回X1、第二次调用返回X1、第三次返回X1——然后你突然明白哦原来递归出口要靠字符串长度不变来判停。2. 从NFA字符串到ε-closure三步落地的Java实现逻辑与数据流拆解2.1 NFA输入格式不是随意写的为什么必须用(1,ε)→3这种字符串解析这份课程设计没有用JSON或XML定义NFA而是采用极简字符串规则每个转移函数写成(src, label)→dst格式例如(5,ε)→1、(1,a)→3。这种设计看似原始实则精准匹配教学场景——学生手动画NFA后直接按箭头抄进文本文件即可无需额外学序列化。程序通过String.split()和charAt()硬解析关键在于位置索引的稳定性strings[i].charAt(1)→ 源状态如5strings[i].charAt(3)→ 标签ε或astrings[i].charAt(6)→ 目标状态如1提示原文档中所有测试用例都严格遵循此格式括号、逗号、箭头、单字符状态名若你输入(start,ε)-end或(1, epsilon)-3charAt(3)会越界或取到空格导致ε.equals(...)永远为false。这是第一道隐形门槛。解析后的String[] functionStrings数组就是整个NFA的“内存镜像”。后续所有计算——读空、读字母、求闭包——全部基于这个数组遍历完成不建图、不封装State类、不引入第三方库纯粹用字符串操作模拟状态转移。这种“裸奔式”实现恰恰让算法逻辑暴露无遗你看得见每一次charAt(1)比对也看得见result ...如何拼接状态ID。2.2 ε-closure的核心是“可达性搜索”但Java里它被拆成了三个递归函数ε-closure的本质是从集合I中每个状态出发沿任意条ε弧能到达的所有状态的并集。但Java没有内置图遍历API学生用三个高内聚函数分阶段实现1RestltList(String start, String[] funcs)单状态起点的ε-可达搜索带递归public static String RestltList(String string, String[] strings) { for (int i 0; i strings.length; i) { // 检查当前字符串末尾状态是否等于产生式源状态 if (String.valueOf(string.charAt(string.length() - 1)).equals( String.valueOf(strings[i].charAt(1)))) { // 检查该产生式是否为ε转移 if (ε.equals(String.valueOf(strings[i].charAt(3)))) { // 拼接目标状态并递归搜索该目标 String newStr string String.valueOf(strings[i].charAt(6)); RestltList(newStr, strings); // 关键递归传入新字符串 } } } return string; // 注意此处return的是初始string非累积结果 }逻辑说明输入X找到(X,ε)→1拼成X1再递归调用RestltList(X1,...)在X1中charAt(1)取1匹配(1,ε)→3拼成X13继续递归致命缺陷函数返回值始终是入参string而拼接结果存在静态变量里见2.3节。此处return string仅作语法占位实际结果靠副作用传递。2DuKong(String result, String[] strings)多状态集合的ε-闭包聚合public static String DuKong(String result, String[] strings) { for (int i 0; i result.length(); i) { char state result.charAt(i); for (int j 0; j strings.length; j) { if (String.valueOf(state).equals(String.valueOf(strings[j].charAt(1)))) { if (ε.equals(String.valueOf(strings[j].charAt(3)))) { result String.valueOf(strings[j].charAt(6)); // 递归处理新加入的状态 DuKong(result, strings); } } } } return result; }参数说明result初始状态集合字符串如13内层循环对每个字符state1、3单独找ε转移result ...直接修改入参Java中String不可变此处实际是创建新对象但原引用未更新——这是严重bug见避坑章节递归调用DuKong(result, strings)试图扩展新状态但因result是局部变量递归中的修改无法回传给上层。3RestltListA(String states, String letter, String[] funcs)读字母a的“纯转移”函数public static String RestltListA(String states, String s, String[] strings) { String resultA ; for (int i 0; i strings.length; i) { // states是状态字符串如13需逐个字符匹配源状态 for (int k 0; k states.length(); k) { char c states.charAt(k); if (String.valueOf(c).equals(String.valueOf(strings[i].charAt(1)))) { if (s.equals(String.valueOf(strings[i].charAt(3)))) { resultA String.valueOf(strings[i].charAt(6)); } } } } return resultA; }关键设计不处理ε弧只做I → Ia映射states是字符串而非Set故用states.charAt(k)遍历每个状态返回值resultA是纯字母转移结果如I{1,3}、aa返回2假设(1,a)→2后续需将此结果喂给DuKong()做ε闭包即ε-closure(Ia)这才是NFA→DFA真正的move(I,a)。2.3 静态变量是“玄学”的根源为什么RestltList必须用static String原文档明确写道“因为每次调用函数只能返回一个状态节点而我们需要的是一个状态子集的集合所以这里也试了很多方法最后才想到用静态变量的。” 这句话直指Java初学者的痛处——如何让递归函数累积结果程序中定义了一个static String RestltListResult ;虽未在代码块中显示但文档第4页明确提及。所有RestltList()和DuKong()函数内部不是返回拼接结果而是执行RestltListResult String.valueOf(strings[i].charAt(6)); // 累加到静态变量参数说明RestltListResult是全局静态变量生命周期贯穿整个JVM每次递归调用都向其追加新状态避免了返回值丢失但带来严重副作用多线程不安全、连续调用需手动清空、调试时难以追踪赋值源头正确做法应是ListString入参返回或用StringBuilder传引用但学生选择了最直觉也最危险的方案。2.4 状态子集生成NFA→DFA的“血泪引擎”如何运转课程设计的终极目标不是算单个ε-closure而是生成DFA所有状态。其流程严格遵循教材算法初始状态ε-closure({X})→ 得到第一个DFA状态S0对每个已知DFA状态Si和每个输入符号a∈Σ计算T ε-closure(move(Si, a))若T不在已有状态集中加入并标记为新状态重复直到无新状态。程序中对应逻辑在主函数// 初始化X的ε-closure作为第一个状态子集 String firstClosure Utils.RestltList(X, functionStrings); SetString firstSet stringToSet(firstClosure); // 转为Set便于去重 allStates.add(firstSet); // 主循环对每个已知状态子集尝试所有字母 for (String letter : alphabet) { String moved Utils.RestltListA(setToString(currentSet), letter, functionStrings); String closure Utils.DuKong(moved, functionStrings); SetString newSet stringToSet(closure); if (!allStates.contains(newSet)) { allStates.add(newSet); // 将newSet加入待处理队列... } }关键细节alphabet从输入字符串中提取如ab确保覆盖所有符号setToString()和stringToSet()是隐含的工具函数负责{1,3}↔13转换allStates是ListSetString存储所有DFA状态未实现自动机最小化生成的是标准子集构造法结果可能含冗余状态。3. 避坑那些让课程设计挂掉的5个真实翻车现场与修复方案3.1 现象RestltList(X, funcs)返回X但ε-closure({X})明明该是{X,1,3}原因RestltList()函数体中return string返回的是初始值而拼接结果全存在静态变量RestltListResult里。若调用前未清空该静态变量或调用后未读取它就永远拿不到正确结果。解决在调用前强制清空Utils.RestltListResult ;调用后立即读取String closure Utils.RestltListResult;更优方案重构函数用StringBuilder传参替代静态变量public static void restltList(StringBuilder sb, String start, String[] funcs) { for (int i 0; i funcs.length; i) { if (start.equals(String.valueOf(funcs[i].charAt(1))) ε.equals(String.valueOf(funcs[i].charAt(3)))) { String next String.valueOf(funcs[i].charAt(6)); if (sb.indexOf(next) -1) { // 去重 sb.append(next); restltList(sb, next, funcs); } } } }3.2 现象DuKong(13, funcs)输出13但(1,ε)→5和(3,ε)→5明明存在原因DuKong()中result ...创建新String但result是局部变量递归调用DuKong(result, funcs)时传入的是旧值新拼接内容丢失。解决放弃result 改用StringBuilder传引用public static void duKong(StringBuilder sb, String[] funcs) { String current sb.toString(); for (int i 0; i current.length(); i) { char state current.charAt(i); for (int j 0; j funcs.length; j) { if (String.valueOf(state).equals(String.valueOf(funcs[j].charAt(1))) ε.equals(String.valueOf(funcs[j].charAt(3)))) { String next String.valueOf(funcs[j].charAt(6)); if (sb.indexOf(next) -1) { sb.append(next); duKong(sb, funcs); // 传同一StringBuilder } } } } }3.3 现象输入(X,ε)→1 (1,a)→2 (2,ε)→Yε-closure({X})输出X1Y但Y是终态不该在闭包里原因ε-closure定义是“从I出发经ε弧可达的状态”不包括I本身不标准定义是I ∪ {所有ε可达状态}。但学生误将Y当作普通状态参与ε转移而Y本应是添加的辅助终态不应有出边。解决在解析NFA时识别X和Y为特殊节点DuKong()中跳过Y的ε转移因其无出边或更严谨预处理时过滤掉Y作为源状态的产生式。3.4 现象状态名含两位数如10时charAt(1)取到0导致(10,ε)→5被误判为源状态0原因字符串解析硬编码charAt(1)假设所有状态名是单字符。一旦出现10、start等索引完全错乱。解决改用正则解析Pattern.compile(\\((.*?),(.*)\\)-(.*))或约定状态名用分隔符(X,ε)-1、(10,ε)-5用split(,|\\)|-)提取课程设计妥协方案文档明确要求“状态结点大小位置布局合理”暗示状态名应为单字母/单数字实际使用时遵守此约束。3.5 现象MapSetString, SetString mapmax输出时key为[1, 3]但value为[1, 3, 5]控制台打印乱码原因SetString的toString()默认输出[1, 3]但Set无序且HashSet的迭代顺序不固定导致每次运行输出不同。更严重的是Set作为Map key时若其内容被修改如add操作hashcode突变Map行为不可预测。解决Key改用TreeSetString保证有序new TreeSet(Arrays.asList(1,3))或转为不可变表示String keyStr String.join(,, sortedList)最简方案调试时用System.out.println(Key: keySet , Value: valueSet)接受无序但确保逻辑正确。4. 把ε-closure变成可验证的“黑匣子”三步构建本地测试流水线4.1 构建最小可验证输入用test.nfa文件驱动整个流程不要依赖GUI或交互式输入——课程设计最怕“运行一次成功改一行就崩”。建立标准输入文件test.nfaStates: X,1,2,Y Alphabet: a,b Start: X Accept: Y Transitions: (X,ε)-1 (1,a)-2 (2,ε)-Y程序启动时读取此文件解析出functionStrings、alphabet、startState、acceptStates。这样每次mvn compile exec:java都跑同一组输入结果可复现。关键技巧在main()开头加日志System.out.println(Loaded NFA with functionStrings.length transitions); System.out.println(Alphabet: Arrays.toString(alphabet));一眼确认输入是否被正确加载。4.2 单元测试模板用JUnit 5验证核心函数原子性哪怕课程设计不要求你也该为自己写三个测试堵住最易错的环节Test void testRestltList_singleEpsilon() { String[] funcs {(X,ε)-1}; Utils.RestltListResult ; // 清空静态变量 Utils.RestltList(X, funcs); assertEquals(X1, Utils.RestltListResult); } Test void testRestltList_chainEpsilon() { String[] funcs {(X,ε)-1, (1,ε)-2}; Utils.RestltListResult ; Utils.RestltList(X, funcs); assertTrue(Utils.RestltListResult.contains(X) Utils.RestltListResult.contains(1) Utils.RestltListResult.contains(2)); } Test void testRestltListA_letterTransition() { String[] funcs {(1,a)-2, (2,b)-3}; String result Utils.RestltListA(1, a, funcs); assertEquals(2, result); }执行命令mvn test -DtestUtilsTest#testRestltList_singleEpsilon精准定位问题函数。4.3 可视化验证用Graphviz生成状态转换图肉眼比对课程设计要求“以状态转换图方式输出”但Java Swing绘图复杂且难调试。更务实的做法是生成DOT文件用Graphviz渲染// 在计算完所有状态子集后 try (PrintWriter writer new PrintWriter(nfa.dot)) { writer.println(digraph NFA {); writer.println( rankdirLR;); // 添加所有状态节点 for (String state : allStatesFlattened) { String shape state.equals(X) ? circle : state.equals(Y) ? doublecircle : circle; writer.println( state [shape shape ];); } // 添加ε转移边 for (String func : functionStrings) { if (func.contains(ε))) { String src func.substring(1, 2); String dst func.substring(func.length()-1); writer.println( src - dst [labelε];); } } writer.println(}); }然后终端执行dot -Tpng nfa.dot -o nfa.png open nfa.png效果自动生成带ε标签的清晰图与手绘图逐边比对瞬间发现(1,ε)→3是否漏画。4.4 参数表核心函数输入输出契约供你抄作业函数名输入参数输出含义典型调用示例注意事项RestltList(String start, String[] funcs)start: 单字符起始状态如Xfuncs:(src,ε)-dst字符串数组副作用向静态变量RestltListResult追加所有ε可达状态RestltList(X, funcs); String closure Utils.RestltListResult;必须调用前清空静态变量RestltListA(String states, String letter, String[] funcs)states: 状态字符串如13letter: 输入符号如a纯字母转移结果字符串如2String moved RestltListA(13, a, funcs);不处理ε弧结果需再喂给DuKong()DuKong(String states, String[] funcs)states: 状态字符串如2副作用向静态变量DuKongResult追加ε闭包DuKong(2, funcs); String fullClosure Utils.DuKongResult;同样需清空静态变量且states不能含重复字符5. 从课程设计到工业级实践我把ε-closure封装成可复用的Java工具类5.1 重构核心告别静态变量拥抱不可变对象与函数式风格当年写课程设计时static String是救命稻草现在回头看它是技术债的起点。我把它重构成一个无状态、无副作用、可单元测试的工具类public class EpsilonClosure { // 不再用static变量所有状态通过参数传递 public static SetString compute(SetString states, ListTransition transitions) { SetString closure new HashSet(states); QueueString queue new ArrayDeque(states); while (!queue.isEmpty()) { String state queue.poll(); for (Transition t : transitions) { if (t.source.equals(state) ε.equals(t.label)) { if (closure.add(t.target)) { queue.offer(t.target); } } } } return closure; } // Transition是不可变POJO public static class Transition { public final String source, label, target; public Transition(String source, String label, String target) { this.source source; this.label label; this.target target; } } }优势compute()输入SetString输出SetString符合函数式编程范式使用Queue实现BFS避免递归栈溢出风险Transition类封装转移逻辑比字符串解析更健壮可直接用于Spring Boot服务无需担心静态变量污染。5.2 扩展能力支持带权重的ε-NFA与可视化导出课程设计只要求基础ε-closure但实际项目常需更多。我在EpsilonClosure上叠加两层权重支持Transition增加double weight字段compute()改为computeWithWeight()返回MapString, Double记录各状态到达成本DOT导出新增toDot(SetString states, ListTransition transitions)方法生成带颜色、边权重的DOT字符串支持neato布局算法自动优化节点位置。5.3 生产环境适配如何在Spring Boot中安全调用课程设计是单机命令行但企业系统需要并发安全。我的做法是Service public class NfaService { private final EpsilonClosure epsilonClosure; public NfaService(EpsilonClosure epsilonClosure) { this.epsilonClosure epsilonClosure; } Async // 异步执行避免阻塞Web线程 public CompletableFutureSetString calculateClosureAsync( SetString inputStates, ListEpsilonClosure.Transition transitions) { return CompletableFuture.supplyAsync(() - epsilonClosure.compute(inputStates, transitions) ); } }关键配置EnableAsync启用异步Bean定义TaskExecutor限制线程池大小防NFA过大导致OOM输入transitions从数据库或缓存加载避免每次解析字符串。5.4 我的血泪习惯从那以后我每次写状态机逻辑都强制走一遍“三验法”一验输入用正则校验NFA字符串格式^\\([^)]*?,[^)]*?\\)-[^)]*$拒绝非法输入二验中间态在compute()中插入log.debug(Processing state: {}, state)用-Dlogging.level.com.xxxDEBUG开关控制三验输出对返回的SetString做断言!result.contains(X) || result.size() 1X必在闭包中且通常不止X这套流程让我在蓝桥杯省赛调试NFA题时3分钟定位到charAt(3)越界问题——当时选手用(1,ε)-2而我的校验器直接报错“标签位置超出范围”不用看堆栈。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

风光储互补微电网Simulink仿真建模全流程与控制器调参实战

风光储互补微电网Simulink仿真建模全流程与控制器调参实战

搞风光储互补微电网仿真这件事,说难不难,说简单也真不简单。我前前后后搭过好几版模型,从最开始只有一个光伏Boost加个简单蓄电池,到最后完整的“光伏风电储能负荷”能并网能离网还能平滑切换,中间踩过的坑比想象中多得…

2026/10/11 23:16:13 阅读更多 →
Django宿舍管理系统开发实战:从数据模型到Admin后台

Django宿舍管理系统开发实战:从数据模型到Admin后台

1. 项目整体拆解与业务设计思路做宿舍管理系统这类项目,最怕的就是上来就对着IDE写代码。我见过不少同学拿到“基于Django的学生宿舍管理系统”这个题目,第一反应是去搜代码、下源码,结果要么跑不起来,要么跟自己的需求天差地别。…

2026/10/11 23:16:13 阅读更多 →
别再急着上向量数据库:PostgreSQL+pgvector+BM25混合检索实践

别再急着上向量数据库:PostgreSQL+pgvector+BM25混合检索实践

去年我们团队给 RAG 系统选型时,差点就按主流路径下单了一个专用向量数据库。年费报上来那一刻,我盯着预算表沉默了:当时的切片总量只有几十万条,真正在服务的业务也就一条产品线,买专用向量库的预算足够我们把主库 Po…

2026/10/11 23:16:13 阅读更多 →

最新新闻

基于LSTM的五类动作识别源码包:从视频特征提取到可视化全流程

基于LSTM的五类动作识别源码包:从视频特征提取到可视化全流程

简介:这份资源面向深度学习入门者、课程设计与毕业设计学生,以及需要快速验证行为识别方案的技术人员,提供一套可直接运行的五类动作识别项目源码。项目覆盖jump、walk、pickup、salute、wave五种日常动作,并实现LSTM、TA-LSTM、S…

2026/10/13 1:59:18 阅读更多 →
Ventoy 多合一启动盘实战:一次部署,镜像即拷即用

Ventoy 多合一启动盘实战:一次部署,镜像即拷即用

简介:Ventoy 是一款开源的可启动 U 盘制作工具,面向系统运维、装机测试与多系统启动盘需求的技术人员。它解决的核心痛点是无需反复格式化磁盘,只需将 ISO/WIM/IMG/VHD(x)/EFI 等镜像文件复制到 U 盘即可启动,并支持一次放入多个镜…

2026/10/13 1:59:18 阅读更多 →
Win10下用VS2017与CMake编译OpenCV 4.5.1并集成contrib模块的完整指南

Win10下用VS2017与CMake编译OpenCV 4.5.1并集成contrib模块的完整指南

简介:一份专为Windows平台计算机视觉开发者准备的OpenCV 4.5.1contrib重新编译成果,基于win10、VS2017与CMake构建,解决在官方发行版中无法直接使用SIFT、SURF等contrib模块功能的痛点。包体为RAR压缩包,共992个文件、约47.65MB&a…

2026/10/13 1:59:18 阅读更多 →
STM32CubeIDE集成RT-Thread实战:从裸机到多任务调度

STM32CubeIDE集成RT-Thread实战:从裸机到多任务调度

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

2026/10/13 1:59:18 阅读更多 →
Visual Studio 2010 Shell(Isolate):轻量级遗产系统调试环境搭建指南

Visual Studio 2010 Shell(Isolate):轻量级遗产系统调试环境搭建指南

简介:Microsoft Visual Studio 2010 Shell (Isolate) 是面向Windows平台C、C#、VB.NET等开发者的一套轻量级、可定制IDE运行环境,专为无需完整VS安装但需调试器、编辑器及扩展框架的场景设计,适用于旧系统维护、第三方工具集成或精简开发环境…

2026/10/13 1:59:18 阅读更多 →
JavaScript公式编辑器实战:从LaTeX渲染到存储回显全解析

JavaScript公式编辑器实战:从LaTeX渲染到存储回显全解析

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

2026/10/13 1:58:18 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →