Floyd算法详解:从动态规划推导到C++高性能实现与避坑指南
直接写不用那些总结开头。Floyd算法懂的都懂多源最短路那个O(n³)的经典思想。但讲真网上关于它的文章九成是贴个伪代码就跑要么就是拿个教科书模板让你背。真正到了生产环境或者比赛场上没人关心你原理背得多熟关心的是你怎么在最短时间内写出不出错、跑得快的代码。这篇文章我不打算做那种教科书式复读。我会把Floyd算法的核心思想重新拆一遍从头推导那个递推式到底在干什么然后给出我实测下来最顺手、最不容易写错、性能也拉满的C实现版本。最后还有我踩过的坑和针对具体场景的优化思路。1. 从动态规划角度重新理解Floyd算法Floyd算法在数据结构教材里通常被归类到“图的最短路径”章节跟Dijkstra和Bellman-Ford放在一起。但很多人学完就忘根本原因在于没有真正从动态规划的角度吃透它而是把它当成一个“三重循环的模板”来背。这个思路是错的Floyd算法的本质是区间动态规划。1.1 递推公式的推导与k的含义定义状态dp[k][i][j]从顶点i到顶点j只允许经过编号不超过k的中间节点时所能达到的最短路径长度。这里的关键是“允许经过的中间节点编号不超过k”而不是“一定要经过k”。初次看到这个定义的人十个有九个会绕进去。举个例子假设有5个顶点编号从1到5dp[3][1][5]表示从1到5路上可以经过1号、2号、3号这三个中间顶点实际上向你爱走不走但是其他编号更大的顶点比如4号和5号不允许作为中间跳板的最短路。那么状态转移怎么想把视角放在第k个中间节点上也就是新加入的顶点k情况一从i到j的最短路压根不需要经过顶点k。那dp[k][i][j]就等于dp[k-1][i][j]跟之前没有顶点k可选时一模一样。情况二从i到j的最短路确实经过了顶点k。那路径就可以拆成两段i到k这一段和k到j这一段。而这两段路径因为k是端点所以它们的中间节点编号都不可能超过k-1。两段加起来就是dp[k-1][i][k] dp[k-1][k][j]。于是状态转移方程就是dp[k][i][j] min(dp[k-1][i][j], dp[k-1][i][k] dp[k-1][k][j])这就是Floyd算法“三层循环”背后的完整逻辑。为什么要从k1一直枚举到kn因为每一轮都在试图引入一个新的“中转枢纽”看看能不能把某些路径缩短。把维度k从小到大枚举完dp[n][i][j]就是真正的全源最短路径。1.2 为什么k必须放在最外层循环很多初学者会问三重循环i、j、k顺序随便换不都一样吗我特别强调这不是“顺序”问题这就是Floyd算法的正确性所在。因为dp[k][i][j]依赖的是dp[k-1][...][...]所以计算第k层的结果时第k-1层的所有状态必须是已经全部计算出来的。如果k不是最外层比如把i放最外层那么内层在算某个(i0, j0)对时可能会用到尚未计算出来的(i0, k)或(k, j0)在第k-1层的值结果就错了。有一种“看起来没错”的写法就是把三维数组降成二维直接在原数组上迭代。很多人问你原地更新会不会让dp[k][i][j]的更新里用到已经被第k层“污染”的数据答案是不会。因为dp[k][i][j]依赖的两个值dp[k-1][i][k]和dp[k-1][k][j]它们在原地的二维数组里对应的是dist[i][k]和dist[k][j]。在一轮更新中第k行和第k列的数据在这一轮里确实会被更新但问题是当我们更新dist[i][j]i和j都既不是k时需要读的dist[i][k]和dist[k][j]它们的下标都包含k。而dist[i][k]这一格在从dp[k-1]到dp[k]的递推过程中依赖的是dist[i][k]自身不变和dist[i][k] dist[k][k]也是自身所以它不会因为引入顶点k而变得更短。第k行、第k列天然是第k轮的“不变量”。这就是Floyd可以在原地更新、不需要额外开三维数组的根本原因。2. 最优C实现从零到能跑的完整代码理论说完直接上代码。这是我最常用的一套模板在比赛中、工程里都测试过兼顾可读性、健壮性和性能。2.1 基础版本邻接矩阵 三重循环首先明确一点Floyd算法的最佳载体是邻接矩阵因为它需要随机访问任意两点之间的当前最短路。用邻接表存图的话每次找k的邻居再去更新i到j反而把复杂度搞成了O(n³)但常数巨大。#include bits/stdc.h using namespace std; const long long INF 4e18; void floyd(int n, vectorvectorlong long dist) { for (int k 0; k n; k) { for (int i 0; i n; i) { // 小优化dist[i][k] 为 INF 就不用继续内层循环了 if (dist[i][k] INF) continue; for (int j 0; j n; j) { if (dist[k][j] INF) continue; long long nd dist[i][k] dist[k][j]; if (nd dist[i][j]) { dist[i][j] nd; } } } } }几点说明为什么用long long而不用int因为最短路长度的累加有可能超过int的2^31-1范围。尤其是当INF设置为某个很大的值比如0x3f3f3f3f时两个INF一加就直接溢出成负数整个算法就废了。很多人的Floyd代码在无向图大规模数据下输出负数十有八九是这里出了问题。dist矩阵初始化对角线dist[i][i]0有边的地方填边权无边的地方填INF。2.2 性能优化Cache优化与分支友好上面那个版本是“正确”的但在大数据量下还可以再压一压。先看本质Floyd的复杂度是O(n³)n到1000时就要执行10亿次循环。优化空间全是常数级别的但常数有时就是天壤之别。关键优化点有两个第一把“判断dist[i][k] INF”和“判断dist[k][j] INF”这两个if去掉。在CPU层面连续的数组访问对缓存是友好的但硬件的分支预测器会对if产生预测开销。如果图比较稠密绝大多数dist都不是INF那么两个if的判断大部分时间都是false预测器很快就会学会“不跳过”此时if的开销很小。可如果图稀疏if又可能频繁“跳过”导致分支预测失败性能反而更差。一个折中的方案是用一个大一点的INF比如4e18然后让两个INF相加后溢出成负数最后判断nd dist[i][j]时会自然把它过滤掉。但前提是“INF必须足够大且所有有效的nd都远小于INF”。实际使用中如果边权总和不可能超过1e18那这个“让INF自然溢出”的技巧是可行的。只是这样写有点吓人所以我通常只在比赛时这么干工程上还是保留if。第二循环顺序优化i和j循环内层交换没有本质区别但为了更友好的缓存读取可以让i、j都从小到大遍历k作为最外层。现代CPU预取器对顺序访问的识别能力很强这种简单顺序遍历已经足够。下面是我实测下来比较平衡的版本void floyd_fast(int n, vectorvectorlong long dist) { for (int k 0; k n; k) { auto dist_k dist[k]; for (int i 0; i n; i) { long long dik dist[i][k]; if (dik INF) continue; auto dist_i dist[i]; for (int j 0; j n; j) { long long nd dik dist_k[j]; if (nd dist_i[j]) { dist_i[j] nd; } } } } }这里有个很实用的细节把dist[k]和dist[i]缓存成局部引用dist_k、dist_i。这样可以显著减少二维数组寻址时“每次都要计算基地址 行偏移”的开销也更容易让编译器做向量化优化。实测对n500以上的图形能快20%~40%左右。代码量只多了三行但收益明显。2.3 路径重建不只是求最短距离只求最短距离在很多场景下并不够。如果题目要求输出具体路径那就需要额外的路径记录数组。常见做法是维护nxt[i][j]表示从i到j的路径上i的下一个顶点是谁。void floyd_with_path(int n, vectorvectorlong long dist, vectorvectorint nxt) { // 初始化 nxt如果 i-j 有边nxt[i][j] j否则为 -1 for (int i 0; i n; i) { for (int j 0; j n; j) { nxt[i][j] (i j || dist[i][j] INF) ? -1 : j; } } for (int k 0; k n; k) { for (int i 0; i n; i) { if (dist[i][k] INF) continue; for (int j 0; j n; j) { long long nd dist[i][k] dist[k][j]; if (nd dist[i][j]) { dist[i][j] nd; nxt[i][j] nxt[i][k]; // 路径经过 k所以 i 的下一个顶点不变 } } } } } void print_path(const vectorvectorint nxt, int u, int v) { if (nxt[u][v] -1) { cout No path endl; return; } cout u; while (u ! v) { u nxt[u][v]; cout - u; } cout endl; }这个nxt数组很有意思当更新dist[i][j]时新路径是i - ... - k - k - ... - j而i到k的下一跳就是nxt[i][k]所以nxt[i][j]直接赋值为nxt[i][k]。不需要额外记录前驱因为前驱数组没法在Floyd的原地迭代中维护得这么干净而后继数组天然配合“从起点开始追踪”的方式。2.4 负权环检测Floyd算法的隐藏能力Bellman-Ford可以检测负权环Dijkstra不可以。Floyd算法其实也能只是很多教材没提。思路很简单跑完Floyd之后如果存在某个i使得dist[i][i] 0那么图中一定存在负环。为什么因为dist[i][i]表示从i出发经过若干顶点最后回到i的最短回路。如果这个回路长度小于0那这个回路本身就是一个负权环。反之如果不存在任何dist[i][i] 0那就不存在负环。注意如果图中存在负权环Floyd算法算出的所有dist都不可信因为路径可以被无限缩短。所以工程上需要在跑完Floyd后立刻检查对角线。bool has_negative_cycle(int n, const vectorvectorlong long dist) { for (int i 0; i n; i) { if (dist[i][i] 0) return true; } return false; }这个做法的正确性依赖一个前提初始化时dist[i][i]0。如果你不小心把循环图的对角线初始化成了INF这个检测就会漏报。3. 关键决策数据类型、INF设置与矩阵初始化这一节解决的是“怎么不写错”的问题。我见过太多人在这几个细节上翻车而且翻车的姿势千奇百怪。3.1 INF到底该设多大这是一个极其经典的问题。设小了真实的最短路可能比INF还大导致被当成“不存在”设大了两个INF相加一溢出不就变成负数了在C里你用的是int还是long long直接影响INF的选取。int情况最大值为2^31-1 2147483647INF可取0x3f3f3f3f约10.6亿。两个INF相加大约是21.2亿超过int最大值会回绕成负数。这就是为什么很多int版Floyd代码里即使边权很小也会莫名其妙出现负距离。long long情况最大值为9.22e18但通常不取到极限。取4e18的话两个4e18相加会溢出成负数如果这时候你不做任何if判断直接比较就会出错。稳妥的做法是用4e18当INF但在加法前后做好判断或者选一个“两倍INF也不溢出”的值比如2e18。我建议如果图的最短路径下界不会超过1e18INF取4e18绰绰有余如果确实有达到1e18量级的数据就把INF改成2e18并做好加法判断。最省心的做法是先估出图中可能出现的最大边权之和上界MAX_DIST然后设INF MAX_DIST * 2 1并保证所有有效dist远小于INF。这样两个INF相加会大于任何有效路径但不会溢出因为MAX_DIST * 4量级远小于long long最大值。哎但实际工程里哪有这么完美的估计多数时候我直接用LLONG_MAX / 4比如4e18然后加上“跳过INF”的if判断又稳又不会溢出。3.2 无向图与有向图的初始化区别无向图dist[i][j] dist[j][i] w。注意无向图的邻接矩阵是对称的Floyd跑完后依然对称。有向图只赋值dist[i][j] w。自环dist[i][i]统一初始化为0。如果输入里有负权自环那么这张图已经有负环了Floyd跑完对角线会小于0检测能抓到。重边初始化时要取最小值。如果一条边重复给多次取最小权值即可否则可能被大权值的边污染。这里分享一个调试小技巧在写Floyd前先单独写一个检查函数打印出对角线和几个关键点对确认初始化阶段没有把边读错。很多“算法写对了但答案不对”的情况其实是建图阶段读边时出了错。3.3 并发与向量化Floyd在工程里还能怎么加速如果你处理的数据量真的很大比如n超过800单线程O(n³)在普通机器上可能会卡到1秒以上。这时候有几个方向可以考虑利用缓存阻塞Cache BlockingFloyd本质上是矩阵运算可以切成tile分块做。思路是把k循环拆成若干段对每一段先加载进L2缓存再更新所有i、j。这能让内存访问局部性更好。常用分块大小在32~64之间。不过在大多数算法竞赛里没人写因为太麻烦效益也不稳定。利用SIMD向量化内层循环j是连续内存访问编译器在-O2 / -O3下有可能自动向量化一部分。上面那个“把dist[i]和dist[k]缓存为引用”的版本就是在帮编译器更好地做向量化分析。利用并行k循环存在依赖关系每一轮k依赖上一轮k-1的结果所以不能在k维度之间并行。但i维度的各个行之间互不依赖可以并行处理。用OpenMP或者std::async都可以。对于n1000级别4线程大概能快2.5~3倍。这是性价比最高的并行方式。void floyd_omp(int n, vectorvectorlong long dist) { for (int k 0; k n; k) { #pragma omp parallel for schedule(static) for (int i 0; i n; i) { long long dik dist[i][k]; if (dik INF) continue; auto dist_i dist[i]; auto dist_k dist[k]; for (int j 0; j n; j) { long long nd dik dist_k[j]; if (nd dist_i[j]) { dist_i[j] nd; } } } } }注意每个i行的更新是独立的所以这个并行在逻辑上是安全的。唯一的小心点是需要确定编译器支持OpenMP并且在编译时加-fopenmp。4. 常见问题与避坑实战清单这部分是我长期使用Floyd后总结出的高频事故现场每一项都对应真实踩过的坑。4.1 为什么我Floyd跑出来的距离比真实值大这个多半是最“教科书式”的错误没有按“先k再i再j”的顺序循环。如果i在外层当i固定时内层更新用到的dist[i][k]可能还没被这一轮的k循环完整更新过导致漏掉了一些中转路径。排查方法把k循环提取到最外层再跑一遍对比结果。另一个原因则是初始化时把不存在的边设成了0。无数人在读图时习惯“dist[i][j] 0”代表无边但0在Floyd的语境里意味着“这条边权值为0”。如果存在真正的0权边就会和“无边”冲突。一定要用INF表示“不可达”。4.2 为什么答案出现负数这是最惊悚的错误之一。原因几乎只有一个INF溢出。用int存距离INF设成0x3f3f3f3f然后两个INF一加溢出成了负数结果最小路径变成了负的。解法是换long long或者像上面说的在加之前判断是否是INF。我偏好在加法前跳过INF这样等于从源头上防止溢出然后用一个大INF4e18也能保证正常情况不发生溢出。还有第二种奇怪的负值原因图中存在负权边但无负环。此时Floyd的结果本身是对的diagonal距离不会为负。如果某些dist变成了非常负的值同时又确认没有负边那大概率还是溢出而不是负环问题。4.3 为什么n500时跑得很慢如果确认复杂度是O(n³)且n500理论上大约1.25亿次操作C在普通机器上应该在0.1秒级别。如果跑得很慢看看是不是用了vectorvector 但又没有加优化编译选项或者是在debug模式下运行。debug模式下vector的访问会带边界检查速度慢十倍都不奇怪。另一个隐藏性能瓶颈是vectorvector...本身不是一块连续内存。每一行是一个独立的动态数组行与行之间的地址不一定相邻。内层j访问dist[i][j]时跨行访问会造成缓存不友好。如果想追求极致的性能可以申请一个一维数组把二维矩阵在逻辑上映射到一维long long* dist new long long[n * n]; auto get [](int i, int j) - long long { return dist[i * n j]; };这个版本对缓存的友好度更高但没有vector 那么好写。看你的用途如果只是算法教学或者一般规模vector 完全够用如果数据规模大、要求时间卡得严就用一维映射方案。4.4 为什么我的路径重建输出不对主要两类问题。第一nxt数组初始化错了。很多人把nxt初始化为i表示“默认下一跳是自己”这会在无路径时输出一个自环。正确做法是初始化为-1表示不存在只有有边时才是j。第二路径更新时用错了nxt。我之前写的是nxt[i][j] nxt[i][k]。有人会写成nxt[i][j] nxt[k][j]或者别的输出路径时就会莫名其妙地跳到奇怪的点上。建议输出路径时打印每一步看是不是在某个中转点卡住了。如果nxt[i][j]指向了一个中间点x再打印nxt[x][j]一路推到j为止。4.5 稀疏图别用Floyd什么时候该换算法Floyd是O(n³)Dijkstra堆优化是O(mlogn)。如果n很大但m很小稀疏图或者只需要求单源最短路Floyd就不划算了。一般经验是n 400Floyd 稳。400 n 800Floyd 可接受但需要优化常数。n 1000 且图比较稀疏建议用 n 次 Dijkstra 而不是 Floyd。换个角度思考Floyd的优势是代码短、实现简单、全源信息一次算完而且天然支持负权边。如果业务场景是多源查询多次、图不算特别大、可能有负权但无负环Floyd就是最佳的。4.6 传递闭包Floyd思想的另一个形态Floyd不仅能算最短路还能算可达性。只要把“加法”改成“逻辑或”把“取最小”改成“逻辑与”三重循环的骨架不变就能求出任意两点之间是否存在路径。这在关系图谱、状态可达性分析里非常常用。void transitive_closure(int n, vectorvectorbool reach) { for (int k 0; k n; k) for (int i 0; i n; i) if (reach[i][k]) for (int j 0; j n; j) reach[i][j] reach[i][j] || reach[k][j]; }这个版本的位运算还可以用bitset优化把内层循环通过bitset的按位或一次性做完。对n2000来说bitset版本会比布尔矩阵快非常多这也是很多图论库内置的实现方式。跑一轮下来你会发现Floyd的“三重循环”真的像个万能框架业务形态变化运算符变化但思想不变。5. 实战案例从输入到输出的完整推演为了把这套东西串起来我用一个具体、无歧义的示例来走一遍完整流程。假设有4个城市编号0到3道路如下有向0 - 1边权 30 - 3边权 71 - 0边权 21 - 2边权 62 - 0边权 52 - 3边权 13 - 2边权 9初始邻接矩阵从\到0123003INF71206INF25INF013INFINF90k0时以0号点为中转。逐个检查(i, j)看看走0能不能更短。比如i3, j3dist[3][0]INF跳过i1, j1dist[1][0]dist[0][1]235但dist[1][1]0不更新。i1, j3dist[1][0]dist[0][3]279dist[1][3]INF所以更新为9。这一轮结束后部分d变大。k1时以1号点为中转。i0, j2dist[0][1]dist[1][2]369dist[0][2]INF更新为9。i0, j3dist[0][1]dist[1][3]3912比现有dist[0][3]7大不更新。i2, j2不动i2, j1dist[2][1]暂时还是INF无法中转。k2时以2号点为中转。i0, j3dist[0][2]dist[2][3]9110比现有7大不更新。i3, j0dist[3][2]dist[2][0]9514dist[3][0]INF更新为14。k3时以3号点为中转。i2, j1dist[2][3]dist[3][1]1INFINF无法中转。i1, j3由于dist[1][3]9dist[3][...] 无法提供更短。最终得到从\到0123003971206925INF01314INF90注意2 - 1仍不可达。这是因为从2出发经过3再经过1实际是2-3(1)3-2(9)加上2-... 绕回1在图上死循环路径却绕不出来。这是有向图的正常结果。跑Floyd前一定确认图是有向还是无向不要想当然。6. 三个容易被忽略的优化细节把上面那些内容浓缩成三个最常被忽略、但收益极高的细节一是“跳过INF”的判断不要省。虽然会增加分支预测开销但能防止溢出、能减少大量无意义加法运算对稀疏图收益尤其明显。如果是稠密图建议在编译期把代码拆成两个版本一个带判断一个不带用宏或if constexpr控制。二是“数组内存连续性”。如果有性能瓶颈用一维数组映射替代vector 可能会获得远超预期的提升。这是因为二维vector的每一行独立分配内存行与行可能不连续cache miss会非常严重。当你需要频繁按行访问时一维映射的优势会被放大。三是“循环内把dist_k引用缓存”。哪怕只是加一行auto dist_k dist[k]也能让编译器更好地将内层循环向量化。不要小看这种“本地引用”在热点循环里它减少的数组寻址开销会被放大到几十倍。7. 实战体会与经验补充我最早学Floyd时只顾着背模板以为三重循环就是全部。直到有次在项目里要计算几百个节点之间的最短路径顺手用了Floyd发现运行时间完全不可接受才开始排查各种优化。后来我换用堆优化Dijkstra跑n次时间降下来了但代码复杂度一下子上去了。再后来我意识到问题的本质是图结构是稠密还是稀疏有多少个源点允许负权吗把这两个问题想清楚算法选择就不纠结了。我个人现在的习惯是数据量小n 500时无脑Floydn在500到1000之间先看邻接矩阵是否已经存在如果存在就继续Floyd配合上面的优化n超过1000且图是稀疏的老老实实跑n次堆优化Dijkstra。至于有负权边又无负环的情况Floyd依然是最安心的选择因为Dijkstra不能处理负权Bellman-Ford的代码写起来又啰嗦。最后分享一个压箱底的小技巧在跑Floyd前先用质数法或随机权值生成小规模的图写一个暴力BFS/DFS版本验证Floyd结果。任何一个边权为1到100、点数不超过8的随机图暴力验证和Floyd的结果必须完全一致。这不是浪费时间这是培养“算法直觉”最有效的方式。等你亲手写上百次Floyd之后你可能会像我一样逐渐能“看见”那个三维状态在矩阵里流动的过程——那时候这算法才是真正长在你脑子里的。

相关新闻

OpenLayers添加Marker完整指南:原理、样式与性能优化

OpenLayers添加Marker完整指南:原理、样式与性能优化

开篇先说个容易踩的坑:很多人把 marker 打成 maker,然后在社区里搜半天搜不到东西。OpenLayers 里的标记点标准写法是 marker,底层其实是一个 Feature,本质就是“在地图某个经纬度坐标上画一个点”。这个点可以是默认的蓝色圆点&a…

2026/10/14 18:49:04 阅读更多 →
Semantic Router 与 vLLM AIBrix 集成部署实战:在 Kubernetes 上搭建可扩展的语义路由推理网关

Semantic Router 与 vLLM AIBrix 集成部署实战:在 Kubernetes 上搭建可扩展的语义路由推理网关

后端API网关模型推理服务AI Agent 【免费下载链接】semantic-router An open, programmable decision layer for models and compute. 项目地址: https://gitcode.com/gh_mirrors/sem/semantic-router 点击查看 免费下载 本指南以 Semantic Router 官方文档中「使用…

2026/10/14 18:48:03 阅读更多 →
Activiti HistoryService实战:历史数据查询、清理与归档指南

Activiti HistoryService实战:历史数据查询、清理与归档指南

1. 为什么流程明明跑完了,还得单独维护一套历史数据学习Activiti的时候,大多数人会把精力放在流程定义部署、RuntimeService启动流程、TaskService处理任务这些"正在发生"的事情上。我一开始也是这样,直到某个项目上线大半年后&…

2026/10/14 18:48:03 阅读更多 →

最新新闻

索引创建的原则

索引创建的原则

针对数据量较大、且查询比较频繁的表建立索引。一般单表数据量达到百万级以上时,索引收益明显。针对常作为查询条件(where)、排序(order by)、分组(group by)的字段建立索引。尽量使用联合索引&…

2026/10/14 19:36:48 阅读更多 →
UnicornViewer 0.12j:老阅读器如何让低配机流畅翻压缩包漫画

UnicornViewer 0.12j:老阅读器如何让低配机流畅翻压缩包漫画

简介:UnicornViewer 0.12j 是老马原创的电子书阅读软件,其中“Unicorn”寓意独特珍贵,面向经常阅读电子书、需要统一管理书库的用户,解决了EPUB、PDF、MOBI等多格式阅读与文件整理的痛点。压缩包仅约1017KB,包含2个文件…

2026/10/14 19:36:48 阅读更多 →
Message 和对话

Message 和对话

专栏:AI 全栈开发|18上一篇 17《LLM 请求完整参数》仍然站在“一次请求”的视角:model、messages、temperature、输出预算都只描述这一轮。真正的聊天产品还缺一层——会话状态。Message 是一条事实,Conversation 是一个产品资源&…

2026/10/14 19:36:48 阅读更多 →
总结 10.13

总结 10.13

今天学了数学的线性代数。了解了伴随矩阵直接用矩阵相等,因为可以得到aij的关系。然后是特征值和特征向量,了解了相似对角化,对称矩阵的相似对角化,不同特征值特征向量正交。不同特征值特征向量线性无关。然后是可对角化的条件&am…

2026/10/14 19:36:48 阅读更多 →
Redis容器化部署避坑指南:内存、网络与持久化三大核心问题解析

Redis容器化部署避坑指南:内存、网络与持久化三大核心问题解析

1. 为什么 Redis Docker 是现在最值得投入时间掌握的组合Redis 不是“又一个数据库”,它是现代应用架构里那根看不见却绷得最紧的弦。缓存击穿时用户刷不出首页,会话丢失导致用户反复登录,消息队列积压让订单状态卡在“处理中”——这些线上…

2026/10/14 19:36:48 阅读更多 →
实时交互模型火了:全双工如何让AI边听边说

实时交互模型火了:全双工如何让AI边听边说

实时交互模型火了:全双工如何让AI边听边说 一、概念澄清:实时交互模型不是又一个语音助手二、三代演进:从级联流水线到全双工三、全双工怎么工作:以 Thinking Machines 为例四、OpenAI 的两条腿:Realtime API 与原生语…

2026/10/14 19:35:48 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战: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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →