双十一凌晨,某快递分拣中心一天要处理 100 万件包裹。站长把全体 200 名工人叫到传送带前,宣布第一个方案:
「所有包裹排成一队,从第 1 号工人开始,一件一件按省份分类。」——结果第 1 号工人面前堆起一座山,其他 199 人闲着看戏。全部分完需要 十几个小时,第二天的车早就开走了。
第二个方案登场了:先在传送带上按「华东 / 华北 / 华南 / 西部」分成 4 大堆,每堆 25 万件交给 4 个小组;每个小组内部再按省分成若干小堆;小组里的每个工人只负责一个城市。最后把各城市的包裹按车次汇总装车。
结果呢?同样是 100 万件包裹,不到 2 小时就装完了。更神奇的是:每个工人做的工作是完全一样的——「拿到一堆包裹,按一个维度再分堆,分不动了就自己处理」。
把「一个 100 万的大任务」变成「无数个相同的小任务」,再自下而上汇总 —— 这就是分治。
计算机里几乎所有的「高性能」都来自这一招:归并排序、快速排序、快速幂、线段树、CDQ 分治、快速傅里叶变换……它们的骨架,都是今天这 3 步。
💡 为什么分治能变快
方案一里,时间花在「同一层反复做同样的扫描」;方案二里,工作量被摊到了 log 层。规模从 n 变成 n/2 只需要 log₂n 次,而每一层的工作量加起来仍然是 O(n),于是总代价就是 O(n log n)。
分治不是「少做事」,而是「把事分成层次做」。关键在于:分解要均匀(否则层数不降)、合并要便宜(否则层数降了也没用)。