首页 › programming › 20步即极限:魔方求解器为何不硬算

20步即极限:魔方求解器为何不硬算

导语

如果说有什么视频能让你重新理解"算法"这两个字的分量,Sebastian Lague 的《Coding Adventure: Solving the Rubik's Cube》绝对排得上号。这不是又一个教你"背 CFOP 公式"的速拧教学,而是一次彻头彻尾的程序员视角的灵魂拷问:面对一个有 4.33×10¹⁹(约 433 亿亿) 种合法状态的魔方,计算机凭什么能在零点几秒内,给你一条不到 20 步的解法?

很多人以为答案就是"算力"。错了。如果真去硬算,把全宇宙的算力堆上去也算不完。Sebastian 用整整一期视频(加上 2026 年 6 月那期《I Tried Optimizing my Rubik's Cube Solver》的迭代)告诉你:真正打开这把锁的,不是蛮力,而是一套"分阶段缩空间 + 预计算查表"的工程哲学——它的底层思想和数据库索引、编译器优化、棋类 AI 是同源的。这期视频值得每一个写代码的人反复看,因为它把抽象的 Kociemba 两阶段算法、IDA* 搜索、Pattern Database 讲成了你能"看见"的东西。

视频背景卡片

项目 内容
视频标题 Coding Adventure: Solving the Rubik's Cube
频道 Sebastian Lague(订阅 200 万+)
时长 约 25 分钟
发布日期 2026-05-12
核心主题 从零构建一个能在 20 步内还原魔方的求解器
技术内核 Kociemba 两阶段算法、IDA*、Pattern Database(剪枝表)

核心内容拆解

一、先认清敌人:暴力搜索为什么是死路一条

视频开场,Sebastian 没有上来就甩算法,而是先做了一个"反面教材"——让计算机老老实实地暴力搜索。结果一目了然地崩溃了。背后的算术值得每个程序员刻进脑子里:

这就是问题最残酷的地方:状态空间本身就是 4.33×10¹⁹,而你要搜索的路径空间比它还大得多。盲目地"算尽所有可能",是一条物理上走不通的路。

Sebastian 用这一步巧妙地完成了最重要的叙事铺垫——他让屏幕前的你先绝望,再绝望,然后才引出真正的主角。这种"先证明为什么笨办法不行"的结构,比直接讲算法高级得多。(这是视频的原话叙事;以下分析则是我补充的延伸。)

二、Thistlethwaite 的洞察:把求解变成"子群跳跃"

要理解后面的 Kociemba 算法,必须先认识它的精神祖先——Thistlethwaite 算法。这位数学家在 1981 年提出了一个天才的想法:不要妄想一步到位,而是把魔方要到达的目标,拆成一串"越来越小的状态集合",每一次转动都在把你推向下一个更小的集合。

在群论语言里,魔方的所有操作构成一个"群",而 Thistlethwaite 设计了一串层层嵌套的子群:

$$H_0 \supset H_1 \supset H_2$$

求解过程就是:先从任意状态进入 $H_1$,再从 $H_1$ 进入 $H_2$,最后在 $H_2$ 里还原。关键在于,每进入一个更小的子群,允许使用的"转动"种类就被限制得更死,搜索空间也随之骤降。这套方法的解法上限是 52 步。

它的核心贡献不是步数,而是思想:求解 = 在状态空间里规划一条穿越若干"收缩区域"的路径。这是所有现代魔方算法的母题。Sebastian 在视频中会用动画让你直观看到,魔方状态如何像水流入漏斗一样,被一层层"吸"进更小的子集。

三、Kociemba 两阶段算法:工程上的最优解

Thistlethwaite 分了四段,解法偏长。Herbert Kociemba 在 1991–1992 年把它精简成两段,这就是今天几乎所有快速求解器的基石——两阶段算法(Two-Phase Algorithm):

为什么这样设计这么妙?因为 $G_1$ 这个子群小得多、结构规整得多,在里面搜索几乎瞬间就能收敛。实践上,两阶段算法给出的解法通常在 20 步左右,而最优解的上限(也就是著名的 God's Number)恰好是 20 步——也就是说,Kociemba 算法在绝大多数情况下,已经逼近了理论极限。

这里要划重点:两阶段算法不是"求最优解",而是"求一个足够短的解"。它用放弃 1~2 步的最优性,换取了百万倍的速度。这是算法设计里最经典的 trade-off:够用就好,远比完美重要。

四、Pattern Database:用空间换时间的神来之笔

光有两阶段还不够。真正让求解器"飞起来"的,是一张张预计算好的查表——Kociemba 称之为 Pruning Table(剪枝表),学界更通用的名字是 Pattern Database(PDB,模式数据库)。这是整个视频里我最希望你带走的概念。

它的思路极其朴素:

  1. 不要每次搜索都去"估算"某个状态离目标多远;
  2. 而是提前把每一种"关键子状态"到目标的最短步数全部算好,存进一张哈希表;
  3. 搜索时,不再计算,只查表。

为什么这能行?因为魔方的状态虽然多到爆炸,但如果你只盯着某几个特征(比如只看 8 个角块的相对位置,或只看朝向),这个"子状态"的数量就会骤降到几十万、几百万级别——完全装得进内存。一张 PDB 本质上是在说:"至少在朝向这个维度上,你还差几步。"

于是搜索时的启发式函数 h(n) 变成了一个绝对可靠的下界:取所有维度 PDB 估计值里的最大值。这个下界越紧,剪枝越狠,搜索越快。 这就是为什么 Phase 1、Phase 2 都能瞬间收敛——因为 PDB 提前帮你把 99.99% 的死路挡在了门外。

这一段是整期视频的灵魂,也是我必须强调的延伸观点:Pattern Database 是计算机科学里"空间换时间"范式的教科书级案例,它和数据库索引、CPU 缓存、棋类 AI(如中国象棋、奥赛罗的残局库)是同一套思想。凡是"在线计算太慢"的地方,先想想能不能"离线预算好一张表"。

五、IDA*:内存友好的搜索框架

有了 PDB 这个超强的"导航",还需要一个搜索算法把它用起来。Sebastian 在视频里用的是 IDA(Iterative Deepening A,迭代加深 A*)。为什么不是 BFS、不是 A*?

它的精妙之处在于:DFS 几乎不吃内存(只要存当前路径,$O(\text{深度})$),而每一轮的代价上限,正好由 PDB 提供的启发式下界来剪枝——"如果当前已经走了 g 步,PDB 估计至少还要 h 步,而 g+h 已经超过本轮上限,那就立刻回溯,不用往下走了"。

于是我们得到了一个完美组合:IDA* 负责极低内存地遍历,PDB 负责把绝大多数分支当场砍掉。两者一拍即合,让"在 4.33×10¹⁹ 里找 20 步路径"从不可能变成毫秒级。Sebastian 用可视化的搜索过程,把"剪枝发生的那一瞬间"清清楚楚地画了出来——你会亲眼看到整棵搜索树被砍得只剩骨架。

六、Sebastian Lague 的真正魔法:可视化"为什么"

市面上讲 Kociemba 的文章一抓一大把,为什么偏偏这期视频能火?我的判断是:Sebastian 的核心能力不是"讲算法",而是"可视化思维过程"。

绝大多数教程视频的逻辑是"怎么做"——先列步骤,再上代码。Sebastian 的逻辑是"为什么会想到这么做":他先让你尝试暴力搜索、看着它崩溃;再让你体会"状态空间太大"这个痛点;然后自然而然地引出"那能不能把空间切小";PDB 的引入也不是硬塞,而是"既然在线算太慢,能不能提前算好"。

每一步都有动机,每一个技术都有"痛点 → 方案"的因果链。 这种叙事让 25 分钟的视频没有任何知识是"凭空出现"的。这恰恰是优秀技术传播的最高境界:不是把结论塞给你,而是把你拉进作者的思考路径里,让你"自己"重新发明一遍算法。 这对任何要写技术文档、做技术分享的人,都是一堂免费的课。

七、God's Number = 20:把哲学问题变成工程问题

视频里反复出现的那个数字"20",并不是随便定的,它有一个庄严的名字——上帝之数(God's Number):任意一个魔方状态,最多 20 步就能还原。

这件事直到 2010 年才被严格证明。证明者 Tom Rokicki、Herbert Kociemba、Morley Davidson 和 John Dethridge 用了大规模并行计算(借助 Google 的算力),把 4.33×10¹⁹ 个状态分成约 20 亿个等价类,逐类扫描,最终确认没有哪个状态需要超过 20 步。论文发表在 SIAM Review(《The Diameter of the Rubik's Cube Group Is Twenty》)。

我特别想强调这段历史的隐喻意义:"最优解是否有限"这样一个看似哲学的问题,被一群工程师用"分治 + 预计算表 + 并行"硬生生算成了定论。 而他们用到的核心武器之一,正是前面讲的两阶段思想和剪枝表。科学进步很多时候不是新理论的胜利,而是把旧思想工程化到极致的胜利。

八、第二期的算法设计课:优化的本质是权衡

2026 年 6 月,Sebastian 接着发布了《I Tried Optimizing my Rubik's Cube Solver》,在第一期的基础上做进一步优化。GameDev.net 对它的评价一针见血:"这期与其说是关于魔方,不如说是关于约束条件下的算法设计。"

第二期里出现了速拧圈子的概念——CFOP(Cross, F2L, OLL, PLL,速拧选手的标准流程)、Domino Reduction(多米诺约简,本质上就是强制进入那个 $G_1$ 子群)、更精细的启发式表。观众社区(包括 Reddit r/programming 的讨论)也贡献了大量改进思路。Sebastian 一边实验一边比较:哪个更省时间?哪个更省内存?哪个代码更可读?整期视频本质上是一堂关于"权衡取舍"的算法课——而权衡,正是高级工程师和初级工程师的分水岭。

知识结构图

flowchart TD
    A["目标: 在 4.33×10¹⁹ 状态中<br/>找出 ≤20 步还原路径"] --> B["第一步: 认清敌人<br/>暴力搜索 13.3²⁰≈10²² 条路径<br/>→ 算力死路"]
    B --> C["核心思想: 分阶段缩小搜索空间<br/>源于 Thistlethwaite 群论<br/>子群序列 H0→H1→H2"]
    C --> D["工程化: Kociemba 两阶段算法<br/>Phase1: 进入子群 G1 朝向+中层<br/>Phase2: 在 G1 内受限转动还原"]
    D --> E["加速器一: Pattern Database 剪枝表<br/>预计算子状态到目标的距离<br/>在线只查表不计算 = 空间换时间"]
    D --> F["加速器二: IDA* 迭代加深搜索<br/>DFS 框架 O(深度) 内存<br/>PDB 下界剪枝"]
    E --> G["组合效果: 毫秒级求出 ~20 步解"]
    F --> G
    G --> H["理论极限: God's Number = 20<br/>2010 年 Rokicki 等用并行计算证明<br/>发表 SIAM Review"]
    H --> I["延伸范式: 数据库索引 / CPU 缓存<br/>棋类 AI 残局库<br/>= 同一套'预算好一张表'"]
    E -.-> I

实战启示

对每个写代码的人,这期视频至少能带来三层认知升级。

第一层:把"在线计算"重新理解为"预算 + 查表"。 你日常遇到的所有性能问题里,相当一部分都可以套用 Pattern Database 的思路。热点数据做缓存、把重复的子查询物化成表、给高频路径预编译好结果——本质都是"离线把答案算好,在线只查"。下次你写出一段"实时算得很慢"的代码,先问自己一句:这个计算能不能提前做好,存成一张表? 多问这一句,你的系统设计水平会上一个台阶。

第二层:永远先证明"笨办法不行",再上聪明办法。 Sebastian 的叙事顺序是黄金模板:先暴力、先崩溃、先暴露痛点,再引出优化。在真实工程里,这意味着不要过早优化——先用最直白的方式把问题跑通,让瓶颈自己浮出来,再针对瓶颈动用 PDB、两阶段这类重型武器。盲目的"聪明",往往比诚实的"笨"更危险。

第三层:学会做权衡,而不是追求完美。 两阶段算法放弃 1~2 步的最优性,换来百万倍速度——这正是优秀工程的标志。现实里 99% 的场景,"一个足够好、且可维护、且跑得飞快"的方案,远胜于"理论上最优但复杂到没人敢碰"的方案。够用就好,是一种被低估的能力。

如果你想动手实践,可以从 Sebastian 开源的 SebLague/Rubiks-Cube 仓库(2026 年 6 月仍在活跃更新)开始,或者直接啃 Herbert Kociemba 的官方实现,把 PDB 的生成过程自己跑一遍——那一刻你会真正理解"空间换时间"的分量。

延伸学习路径

  1. Sebastian Lague 的开源代码库 github.com/SebLague/Rubiks-Cube —— 视频配套的完整实现,对照视频逐行读,理解 PDB 如何在代码里落地。
  2. Herbert Kociemba 官方网站 kociemba.org —— 两阶段算法、剪枝表、God's Number 的第一手资料,权威且免费,建议精读 math/imptwophase.htm 和 math/pruning.htm。
  3. 《The Diameter of the Rubik's Cube Group Is Twenty》(Rokicki et al., SIAM Review)—— 上帝之数的证明论文,体会"如何把一个数学猜想工程化地证完"。
  4. Sebastian Lague《I Tried Optimizing my Rubik's Cube Solver》(2026 年 6 月) —— 第二期,CFOP 与 Domino Reduction 的权衡课,看完第一期的进阶必看。
  5. AI 经典教材中关于 Pattern Database 的章节(如 AIMA,Artificial Intelligence: A Modern Approach 的启发式搜索部分)—— 把魔方里学到的 PDB 思想,放回通用的搜索问题里去理解,触类旁通。

一句话总结

在 4.33×10¹⁹ 个状态里瞬间找出 20 步出路,靠的不是算力,而是"把天文数字的搜索空间分层切碎 + 把答案提前算好存成表" 这一套贯穿整个计算机科学的工程智慧。

参考来源

  1. Coding Adventure: Solving the Rubik's Cube — Sebastian Lague (YouTube) — 本文分析的核心视频
  2. Two-Phase Algorithm Details — Herbert Kociemba (kociemba.org) — 两阶段算法官方原理
  3. Pruning Tables — Herbert Kociemba (kociemba.org) — 剪枝表 / Pattern Database 原理
  4. The Diameter of the Rubik's Cube Group Is Twenty — Rokicki, Kociemba, Davidson, Dethridge (SIAM Review / tomas.rokicki.com) — God's Number = 20 的证明论文
  5. I Tried Optimizing my Rubik's Cube Solver — GameDev.net 报道与 Reddit r/programming 讨论 — 第二期优化与社区讨论

    本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵爱卫生(微信ID: gprshome201101)维护,聚焦5G/6G核心网、3GPP标准解读、通信前沿技术深度分析。 出版作品有《5G核心网原理与实践》《IMS原理与实践》等4本通信专业书籍。知识星球「51学通信」提供深度技术答疑和行业洞察。

任务汇报

1. 完成摘要

2. 下一步计划

3. 注意事项

[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。

51学通信知识星球海报-扫码加入