算法复杂度详解:从大O表示法到工程应用
前段时间我帮朋友调一个数据清洗脚本功能很简单就是把一份几百万行的文件按某个字段去重。他写的时候没多想直接用列表嵌套循环去查重结果脚本跑了快二十分钟还没跑完。我帮他改成用哈希表之后同样的逻辑几秒钟就出结果了。差距这么大真不是他写错了代码而是算法的时间复杂度完全不在一个量级上。时间复杂度和空间复杂度说白了就是描述代码跑得快不快和代码占多少内存的两把尺子。几乎所有数据结构教材——不管你是用C语言版还是Python版——第一课都会讲这两个概念因为它们是衡量算法优劣最核心的指标。但很多人学的时候只是把它当成两个公式几个符号考试会算实际写代码时完全用不上。这篇内容想把这两个概念讲透它们到底在衡量什么、怎么算、怎么用以及我在实际写代码和准备面试过程中踩过的一些坑。不管你是数据结构新手还是在为期末、考研复习或者就是写业务代码写到性能瓶颈了都可以从里面找到能直接上手的判断方法。1. 算法效率的量化困境为什么不能用秒表来衡量代码快慢1.1 一个让我印象深刻的对比同样的功能20分钟和4秒钟先回到开头那个例子。朋友那段查重代码的逻辑很简单外层循环遍历每一行内层循环在已经见过的行里逐个比对看看有没有重复。逻辑完全正确但性能就是不行。问题出在哪里每一行都要和之前所有行比较一遍如果文件有n行比较次数大约是123...n也就是n(n1)/2这个量级。n是五百万的时候这个数算出来是万亿级别的操作。哪怕每两次比较只要一纳秒也要几十分钟。这还不是最关键的。最关键的是这段代码在不同的机器上跑时间完全不一样。放在一台高配服务器上可能从二十分钟变成几分钟放在一台老笔记本上可能直接跑一个小时。那你能说这个算法在好机器上是快的吗显然不能。因为机器好坏、编译器优化、系统负载这些因素都和算法本身的优劣没有直接关系。所以计算机科学需要一种和机器无关的衡量方式。它不测量真实时间而是统计算法需要执行的关键操作次数再看这个次数和输入规模之间的关系。这种抽象出来的度量就是复杂度分析。我经常用人搬砖来类比你说一个人一天搬多少块砖得看他的体力、天气、工具但如果说搬砖次数和砖块数量成正比或者搬砖次数是砖块数量的平方这就和环境无关了描述的是工作方式本身的性质。复杂度分析做的就是这件事。1.2 从运行时间到操作次数复杂度在衡量什么假设你写了一个循环遍历长度为n的数组做求和。每遍历一个元素做一次加法那操作次数大约就是n。如果遍历一个n×n的二维矩阵操作次数大约就是n²。这里的操作不一定是加法可以是任何一个基本步骤比较、赋值、访问内存、调用一次函数。我们不关心每一步具体花多少纳秒只关心当n增大的时候操作次数会按照什么规模增长。这里有个我见过很多人困惑的点为什么不直接数循环体执行了多少次因为循环体内部可能包含其他操作它们也消耗时间。正确的数法是看关键操作的总次数。比如冒泡排序内层循环每次都要做一次比较可能还要做一次交换那么总的比较次数就是决定性因素交换次数最多也是同一个量级。数出来是n(n-1)/2我们说它是O(n²)。数操作次数听起来很简单但真正的难点在于你得先确定哪个操作是支配性的。一个算法里可能有加法、比较、取内存、赋值它们花的真实时间各不相同但复杂度分析不需要精确到每一类。你只需要找出那个随n增长最快的部分其他部分在n足够大时都可以忽略。这个找出支配项的过程就是复杂度分析的基本功。1.3 大O表示法为什么常数和低阶项可以被忽略大O符号Big O notation看起来很高深但理解它不需要多深的数学功底。它的含义粗略地说就是当输入规模n变得足够大时算法的操作次数大致不超过某个增长速度的若干倍。举几个例子操作次数是3n5我们说它是O(n)。因为3倍、5倍这种常数不重要重要的是它随n线性增长。操作次数是2n²5n7我们说它是O(n²)。因为n²项会主导趋势n越大5n的影响越微不足道。操作次数恒为1000000不随n变化那就是O(1)。为什么可以忽略常数和低阶项因为复杂度分析关注的是规模化之后的趋势。一个O(n)的算法哪怕常数很大在n到了百万、千万级别时也一定比O(n²)的算法快得多。反过来如果一个算法是O(1)就算它单次操作特别重它在面对海量数据时依然稳如泰山。这里给你一张我常用的直觉对照表帮助你快速建立对不同复杂度的体感大O表示通俗叫法n100时的操作量级直觉感觉O(1)常数时间1数据再多也是瞬间O(log n)对数时间约7几乎感受不到增长O(n)线性时间100很轻松O(n log n)线性对数时间约700稍微有点量O(n²)平方时间10000开始吃力O(2^n)指数时间天文数字基本不可运行O(n!)阶乘时间更大噩梦级别这一套表示法里严格来说还有Thetaθ和OmegaΩ分别表示确切增长阶和下界但在工程和绝大多数考试场景里大O已经足够用它描述的是最坏情况下算法趋势的上限。你只需要记住大O是不超过某个增速的意思。2. 时间复杂度逐个拆解从O(1)到O(n!)的实战手感2.1 O(1)与O(log n)数据量翻倍也几乎无感的算法O(1)是最理想的情况。访问数组某个下标元素是O(1)哈希表单次查找平均是O(1)在链表头部插入一个节点是O(1)。这些操作的共同点是不管数据量是一万还是一个亿执行步骤都差不多不随数据量增长。O(log n)是很多人觉得奇怪的复杂度它最经典的来源是二分查找。在有序数组里找一个数每次把搜索范围砍半那么最多砍多少次才能把范围缩小到一个元素答案是log₂n次。n100万的时候log₂n大约是20n10亿的时候大约是30。也就是说数据量从一百万涨到十亿二分查找只多了10次操作。这就是对数算法的魅力——数据量怎么涨它都几乎无感。我对O(log n)的直觉是就像在一个很长的电话簿里找人你不会从头翻到尾而是先翻到中间根据姓氏判断目标在左边还是右边然后不断折半。每次操作都排除一大半可能性。工程里很多看似神乎其神的算法底层都是O(log n)平衡二叉搜索树的查找、堆的插入和删除、通过幂运算快速求大数幂结果。在排序和查找这一大类问题里O(log n)通常意味着你利用了某种有序性。2.2 O(n)与O(n log n)工程中的主力区间O(n)是最老实的复杂度——遍历一次数组、统计字符串里每个字符出现次数、找出链表中间节点都是O(n)。数据翻倍时间也翻倍非常直观。O(n log n)则出现在大多数优秀排序算法里快速排序平均情况、归并排序、堆排序。为什么排序绕不开这个log因为很多排序算法实际上是分而治之把问题切成两半递归处理每层要划过的数据总量是n一共切了log n层所以是n log n。你可以理解成我需要对全体数据做log n遍扫描。这里有个很实用的判断技巧如果一个功能要求对一堆数据做排序那复杂度至少是O(n log n)。如果哪个代码号称排序却写成了O(n²)那多半是在用冒泡或插入这类基础排序。数据量小没事数据量大了就会明显变慢。我在Review代码时一旦看到双层循环处理同一份数据就会下意识想两件事能不能用哈希表把内层循环拆掉能不能先排序再利用有序性很多性能优化都是靠这两个问题驱动出来的。2.3 O(n²)、O(2^n)与O(n!)看到这些复杂度要警惕什么O(n²)的典型来源是双层嵌套循环。n1000时是100万次操作n10000时是1亿次n100000时是100亿次——通常到这一步程序已经肉眼可见地卡顿了。所以看到双层循环遍历同一个数据规模我会停下来想能不能用哈希表、排序、双指针这些技巧把一层拆掉冒泡排序是O(n²)暴力求两数之和是O(n²)双层循环处理矩阵也是O(n²)。它们不是不能用而是要知道自己的数据规模上限在哪里。O(2^n)和O(n!)更是典型的算法灾难。暴力枚举一个集合的所有子集是O(2^n)穷举n个元素的排列是O(n!)。n稍微到20以上这两种算法基本就不可运行了。遇到这种场景通常意味着你需要换思路——用动态规划剪枝、用状态压缩、或者放弃精确解改用近似算法。这里我想强调一个反直觉的点O(n²)并不是绝对不能碰O(1)也不是永远无敌。如果你处理的数据规模固定在上百以内O(n²)的简单实现往往比一个复杂的O(n log n)实现更快——因为常数小、代码简单、缓存友好。复杂度分析是给你一个规模化趋势的判断不是一刀切的教条。这句话我在后面第五章还会展开。3. 几个会算错复杂度的经典场景递归与循环里的隐藏陷阱3.1 递归复杂度不是看递归深度而是看递归树我见过太多人在递归上翻车。最常见的错误是看到递归函数觉得它调用了n次所以是O(n)然后就想当然地写答案。正确的看法是画出递归树看树上有多少个节点。拿经典的斐波那契数列递归实现来说def fib(n): if n 1: return n return fib(n - 1) fib(n - 2)这个函数看起来只写了几行但它的递归树近似是一棵满二叉树每个节点分裂成两个子问题深度是n每一层节点数翻倍。算总节点数结果是2的n次方这个量级。所以它的时间复杂度是O(2^n)而不是O(n)。原因很简单每个节点都会分裂出两个规模只减1的子问题层数多节点爆炸。对比一下计算1到n的和这种递归每个节点只分裂出一个分支递归树退化成一个单链那复杂度就是O(n)。所以核心问题不是有没有递归而是递归树的形状。判断方法很简单写递归时先问自己——每个节点分裂出几个子问题子问题的规模是减1还是减半如果每层分裂两个且规模只减1那基本就是指数级如果规模减半那多半是对数级乘上单层工作量。网上会教你用主定理Master Theorem去套递归式比如T(n)2T(n/2)O(n)这类。主定理当然好用但我建议你先建立递归树长什么样的直觉再去记公式。不然套了半天遇到递归树形状特殊的算法照样翻车。3.2 看似O(1)的操作拖垮整个循环字符串拼接与头部插入还有一种更隐蔽的误判来自隐藏的线性操作。举个例子很多语言里字符串是不可变对象你在循环里反复做str str c这种拼接。看起来是一个for循环应该是O(n)对吧实际上每次拼接都要把已有的字符串整体复制一份到新内存复制成本是当前字符串长度。循环n次每次复制长度递增总成本大概是123...n也就是O(n²)。这就是为什么工程里一直强调循环里不要拼字符串要用StringBuilder或join。原理就在这里。类似的还有Python里往列表头部反复insert(0, x)、C语言里在数组头部反复插入元素。看起来是一个操作底层都是O(n)的搬移。如果你在一个O(n)的循环里做了这种操作总复杂度就是O(n²)。我的建议是养成一个习惯看到循环语句先追问一句——循环体里那句看起来是O(1)的代码真的是O(1)吗很多性能问题都是从这个追问里揪出来的。3.3 均摊复杂度动态数组的push为什么是O(1)这里还有一个反直觉但特别重要的概念均摊复杂度。动态数组比如C的vector、Python的list在尾部追加元素平时是O(1)但当容量满了需要扩容时要申请一块更大的内存并把所有旧元素拷贝过去这一次操作是O(n)。那它的复杂度到底是O(1)还是O(n)答案是均摊O(1)。因为扩容不是每次发生而是大约在容量翻倍时才发生一次。如果用数学算一下总成本从空数组开始连续push n个元素扩容发生的次数大约是log n次每次拷贝的成本是当时的容量。把所有这些拷贝成本加起来总量是O(n)。也就是说n次push的总成本是O(n)平均下来每次是O(1)。这个概念在分析很多偶尔很贵但大部分时候很便宜的操作时特别有用比如Python字典的resize、哈希表的rehash。它告诉我们不要因为某一次偶然的慢就否定一个数据结构的平均价值也不要因为大部分时候快就忽视偶发高成本可能带来的卡顿。在实时系统里O(n)的偶发扩容是不可接受的所以才有预分配容量的方案。这属于复杂度理论在工程里的一个细腻延伸。4. 空间复杂度被忽视的另一半代价4.1 原地算法与额外空间的边界判断空间复杂度衡量的是算法运行过程中额外占用的内存量同样用大O表示。它和整个程序占了多少内存是两回事——这里只关心随输入规模n增长的那部分额外空间。举个例子如果我用一个新数组复制另一个数组那么额外空间是O(n)。如果在同一个数组里面做交换、排序只用了几个临时变量那么额外空间是O(1)这种就叫原地算法。我个人判断空间复杂度时会问自己三个问题我开了多大的新容器来存数据如果这个容器大小和输入规模n成正比就是O(n)或更高。递归调用会消耗栈空间吗会的话递归深度是多少我有没有把输入数据本身拷贝一份拷贝了就要算进额外空间。很多人只算显式的新数组把隐式的调用栈漏掉这是最常犯的错。来一个经典对比归并排序时间O(n log n)空间O(n)快速排序平均时间O(n log n)如果优化得当递归栈深度可以做到O(log n)。同一个复杂度级别落实到内存消耗上完全不同。如果你在内存受限的环境里排序这个区别就非常关键。4.2 递归栈空间空间复杂度里最容易被漏掉的部分递归调用的空间开销来自系统调用栈。每进入一层递归就需要把当前函数的局部变量、返回地址压入栈中。最深的那一层决定了栈空间的上限。回到斐波那契那个例子。递归版本的时间复杂度是O(2^n)但它的空间复杂度其实只有O(n)——因为递归树虽然指数级大但同一时刻栈上最多只有n层调用。这是一个很多人的盲区一个算法的时间复杂度和空间复杂度并不是同步的指数时间算法也可能只需要线性栈空间。这也解释了尾递归优化的意义。如果一个递归调用是函数里的最后一步操作某些编译器可以把它优化成循环栈空间不会累积空间复杂度就从O(n)降到了O(1)。不过要注意Python官方并不做尾递归优化这也是为什么在Python里写很深递归容易报栈溢出。你要是拿Python写树的中序遍历之类递归逻辑得小心控制递归深度或者手动改成显式栈的迭代版本。4.3 空间换时间到底值不值从哈希表到布隆过滤器空间复杂度和时间复杂度经常是矛盾的。最典型的例子是哈希表。数组按下标访问是O(1)但你要判断一个元素是否存在在无序数组里得遍历是O(n)。哈希表为了做到平均O(1)的查找付出的代价是额外的存储——它需要比实际数据更大的桶数组还要处理冲突空间通常是数据的数倍。这就是典型的用空间换时间。再比如布隆过滤器它用远小于原数据的位数组允许一定的误判率换来极快的成员判断。这是用精度换空间。你在缓存系统、爬虫去重、数据库索引预检里经常能看到它的身影本质上都是接受一点点错误率来换取巨大的内存节省。工程里没有绝对最优的数据结构只有在你当前约束下最合适的那个。我做系统设计时候的决策顺序一般是先定时间要求——这个操作能不能容忍毫秒级再量内存预算——数据量级N有多大服务器给多少内存最后在时间—空间—代码复杂度这个三角里找一个平衡点。顺序很重要因为很多新手一上来就在纠结时间快不快忘了空间可能才是真正的瓶颈。5. 复杂度的工程取舍从快排到哈希表的真实选型逻辑5.1 链表排序为什么O(n log n)的快排反而翻车先讲一个我踩过的坑。曾经有个需求是给链表里的元素排序我没多想直接调用了一个快速排序实现结果性能奇差无比。后来才反应过来快排的核心操作是按pivot分区并且要随机访问数组元素而链表访问第k个节点要O(k)时间每次partition都在链表里找位置整体复杂度会退化到O(n²)。正确的做法是归并排序——它天然适合链表因为只需要顺序遍历和指针修改不需要随机访问。而且归并的空间复杂度也可以控制得很好自底向上的归并可以做到O(1)的额外空间用指针原地重排。这件事给我的教训是别看纸面上都是O(n log n)数据结构的物理特性会极大地影响算法能否达到理论上限。分析复杂度不能只背结论还得追问一句这个数据结构上的这个操作真的是O(1)吗。5.2 千万级数据去重从O(n²)到O(n)的真实选型回到开头那个数据清洗脚本。朋友用两层循环做去重复杂度是O(n²)我改成先用哈希表记录见过的key再扫描一次复杂度就是O(n)。但光说O(n)比O(n²)快还不够——哈希表的常数并不小而且会占用额外内存去重几百万个字符串要吃掉不少内存。当时我们评估了一下数据量大约500万行字符串平均长度几十个字节哈希表整体内存开销在可接受范围所以果断选择哈希方案。如果数据量再上几个数量级变成几十亿行单机哈希表就扛不住了。这时候合理的选择可能是外部排序后做归并去重空间可控、顺序访问磁盘友好或者用支持分布式的方案。复杂度分析在这里的作用不是直接告诉你用哪个方案而是帮你估算这个方案在N等于某个数量级时的操作次数和存储量让你在写代码之前就判断可行性。这也是我一直觉得复杂度的价值不止在考试里的原因它是一个让你在动手写代码之前就能粗略估算程序会不会卡、内存够不够的思维工具。你不需要真正跑一遍才能知道这个方案行不行直接靠复杂度算一算就省下大把时间。5.3 复杂度分析的局限常数因子、缓存命中与实际数据特征最后补一句冷静的话大O分析是一个非常好的粗略工具但它不是全部。两个算法一个是1000n一个是n²在n小于某个阈值时前者可能更慢。虽然渐近意义上前者更优实际工程却要测量临界点在哪里。同样数组遍历O(n)和链表遍历O(n)在纸面上一样但数组连续内存、缓存命中率高在同样n下往往远快于链表。哈希表的平均O(1)在极端冲突情况下会退化到O(n)所以生产环境会用好的哈希函数甚至随机化来保证预期。我的建议是用复杂度做定性判断用基准测试做定量决策。先靠复杂度排除明显不可行的方案然后在候选方案之间用真实数据跑一轮性能对比。这两种工具配合起来才是成熟的性能分析习惯。特别是当你处理的是业务系统里真实的数据分布时纸面上的复杂度级别只能给你一个方向最终到底选哪个还得看实测数据。时间复杂度和空间复杂度不是一门背公式的学科它更像是一种考察代码的思维方式每个循环都在哪里花时间每个容器都在哪里占内存数据规模变大之后这个趋势是线性、平方还是指数。我个人在实际Review代码的时候几乎每段代码都会下意识做一遍这个思维检查并且发现绝大多数性能问题靠的都是这种检查而不是复杂的profiling工具。最后分享一个实用小习惯如果你刚开始练习可以每天拿几个经典算法的实现比如冒泡、二分、快排、递归斐波那契先手写一遍复杂度分析再跑一组不同规模的数据验证趋势。坚持一两周你再看代码时的复杂度直觉会比原来敏锐非常多。学数据结构最怕的就是只看不练复杂度这种偏思维的东西尤其如此动手算和动手测才是真正把它变成自己能力的方式。

相关新闻

用SDL2和C++复刻金庸群侠传:2D游戏引擎架构与实战解析

用SDL2和C++复刻金庸群侠传:2D游戏引擎架构与实战解析

简介:这是一份以SDL2为基础实现的2D游戏引擎框架,同时提供了复刻经典DOS游戏《金庸群侠传》的移植范例,适合具备一定C基础、希望了解游戏循环、场景管理、战斗与事件系统的学习者。压缩包共186个文件,体积约3.04MB,包含…

2026/10/1 3:26:31 阅读更多 →
AI检测原理与数学建模论文降AI率实战指南

AI检测原理与数学建模论文降AI率实战指南

“又是被AI检测支配的一天。”这句话我最近几乎在每届本科生群里都能看到。2026届的学弟学妹们,估计已经被“降AI率”三个字整得睡不着觉了:论文交之前要降AI率,课程报告要降AI率,参加数学建模竞赛,居然连建模论文也要…

2026/10/1 3:26:31 阅读更多 →
OpenSSH升级全攻略:源码编译、RPM打包与离线部署避坑指南

OpenSSH升级全攻略:源码编译、RPM打包与离线部署避坑指南

1. 升级前先盘清楚这三件事:版本、依赖和底牌先说个最现实的场景:服务器跑得好好的,结果安全扫描报告出来说OpenSSH版本太老,存在CVE-xxx漏洞,要求限期修复。于是你准备升级,结果远程一敲命令就断连&#x…

2026/10/1 3:26:31 阅读更多 →

最新新闻

Docker部署实战:从环境、网络到数据卷的踩坑复盘

Docker部署实战:从环境、网络到数据卷的踩坑复盘

印象里有一次部署,我折腾了大半天:容器日志干干净净,端口也映射了,可宿主机就是访问不了服务。后来才发现根因不是配置写错,而是我对 Docker 网络的理解还停留在“映射端口等于把口子捅开”。其实这类问题特别普遍&…

2026/10/1 3:54:43 阅读更多 →
Scikit-Learn机器学习入门:环境、Pipeline与调优实战

Scikit-Learn机器学习入门:环境、Pipeline与调优实战

机器学习入门这件事,绕来绕去最后都会落到同一个工具上。很多人一开始被泛化误差界、梯度下降、正则化这些理论绕得晕头转向,好不容易鼓起勇气打开编辑器,结果发现连数据怎么读进来、模型怎么训练都无从下手。我自己当年也是这么走过来的&…

2026/10/1 3:54:43 阅读更多 →
Oracle与MySQL核心差异全解析:从架构、SQL到性能优化的面试指南

Oracle与MySQL核心差异全解析:从架构、SQL到性能优化的面试指南

不用纠结MySQL还是Oracle哪个更好用,对大数据开发来说,这两个库迟早都会遇到。面试问差异,本质是在考察你对数据库底层机制的理解深度,而不只是背几条语法区别。这篇把我这些年踩过的坑、面试官真正爱问的点、以及实际开发中最容易…

2026/10/1 3:54:43 阅读更多 →
UE4 DataAsset核心原理与高性能配置管理实践

UE4 DataAsset核心原理与高性能配置管理实践

1. 为什么DataAsset不是“另一个UObject”,而是UE4资源加载体系里的关键枢纽刚接触UE4资源管理时,我跟大多数人一样,把UDataAsset当成一个“带点数据的普通UObject”——建个类,继承UDataAsset,加几个变量,…

2026/10/1 3:54:43 阅读更多 →
GitHub README工程实践:从门面文档到协作协议层

GitHub README工程实践:从门面文档到协作协议层

1. 为什么一份 README 不是“可有可无的说明文件”,而是你 GitHub 项目的门面、说明书和信任状你刚在 GitHub 上新建了一个仓库,点开编辑框,光标在README.md文件里闪烁——这时候很多人会随手敲下“Hello World”,或者复制粘贴一段…

2026/10/1 3:54:43 阅读更多 →
Selenium自动化测试实战:核心逻辑、环境搭建与工程化方案

Selenium自动化测试实战:核心逻辑、环境搭建与工程化方案

如果你准备进入自动化测试领域,Selenium几乎是绕不开的第一个工具。无论是刚转行的测试新人,还是已经在功能测试岗位上做了几年的老手,简历上只要写上"Selenium",面试官通常都会默认你具备 UI 自动化能力。它的知名度高…

2026/10/1 3:53:42 阅读更多 →

日新闻

我发现了一个新思路:用 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/1 0:00:30 阅读更多 →
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/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练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/1 1:01:17 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/30 13:14:22 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 18:13:06 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/30 13:14:49 阅读更多 →

月新闻

我发现了一个新思路:用 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/1 0:00:30 阅读更多 →
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/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练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/1 1:01:17 阅读更多 →