想象你是旅行社的一位团建策划师,公司有 n 位员工,老板让你安排下午的篝火晚会。方案有很多种:把员工排成一列拍照、挑出几个人玩狼人杀、把所有人分成几个旅行团、或者让每个团围着篝火坐成一圈。这些方案看似都是“把一群人安排一下”,但数学家把它们分成了截然不同的计数问题——排列、组合、划分、轮换。Stirling 数(斯特林数)就是专门回答“分成几个旅行团”和“每个旅行团围成几个圈”各有多少种方式的数学工具。它就像团建手册里的两张王牌:第一类 Stirling 数管“围圈”,第二类 Stirling 数管“分组”。这两张表不仅优雅,而且是算法设计、概率统计乃至密码学的幕后英雄。

岗位关联

掌握 Stirling 数,等于拿到了组合计数的“乘法口诀表”:无论是分析聚类算法的搜索空间、评估随机置换的轮换结构,还是推导组合恒等式,它都能让你在面试和工程中多一张底牌。

目录
  1. 可视化演示
  2. 引子:从排队到分组
  3. 第一类Stirling数:篝火旁的圆桌
  4. 第二类Stirling数:旅行社的分组方案
  5. 递推关系的构造:新同事的两种选择
  6. 贝尔数:所有团建方案的总和
  7. 显式公式:容斥原理揭开底牌
  8. 组合恒等式与应用:从计数到工具
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

Stirling数分为第一类与第二类,分别描述排列与划分的计数。本文详解第一类Stirling数与排列的轮换计... 切换模式查看不同维度。

本节配有交互动效(进入视口后自动加载,约 3KB)。

Stirli:核心原理 动态展示关键流程与数据流动 交互控件调节参数实时渲染 f(x) = transform(x) 核心概念的可视化呈现

引子:从排队到分组

团建策划师小张手里有 n 位员工。老板说“拍张合影”,这就是排列:谁站第一个、谁站第二个,位置有序,所以 n 位员工里选 k 个排成一列有 P(n,k) 种。老板又说“挑几个人玩桌游”,这就是组合:只关心是哪几个人,不关心顺序,所以有 C(n,k) 种。可当老板说“把所有人分成几个旅行团,每个团内部还要围篝火坐成一圈”时,小张犯难了——这不是简单的排队或挑人,而是“先分组、再围圈”的复合问题。Stirling 数正是为这种问题而生。

排列与组合是计数世界的基础砖块,而 Stirling 数把它们向前推进了一大步。第二类 Stirling 数 S(n,k) 回答“把 n 个不同元素分成 k 个非空、无标签的组有多少种方式”,第一类 Stirling 数 c(n,k) 则回答“把 n 个不同元素分成 k 个围成圆圈的轮换有多少种方式”。两者的共同点是都要“分组”,区别在于分组之后组内是否需要围成圆圈、考虑圆桌上的相对顺序。

P(n,k)=n!(n−k)!,C(n,k)=(nk)\displaystyle P(n,k)=\frac{n!}{(n-k)!},\qquad C(n,k)=\binom{n}{k}

1. 排列的分母:n!n! 是所有员工的全排列数,除以 (n−k)!(n-k)! 表示只安排前 k 个位置、其余 n-k 人不参与排队。

2. 排列的含义:n!(n−k)!\dfrac{n!}{(n-k)!} 计算的是从 n 个不同元素中选 k 个并排成一列的方式数,等价于“第一个位置有 n 种选择,第二个有 n-1 种……逐位填空”。

3. 组合的除法:(nk)\binom{n}{k} 等于排列数再除以 k!k!,因为选出的 k 个人不在乎内部顺序,所以要“抹掉” k! 种排队方式。

4. 对比的意义:P 强调“顺序”,C 强调“集合”,而 Stirling 数要在 C 的基础上再追问一句——分完组之后,组内要不要围圈、组与组之间认不认标签?

如果说排列是“拍合影”,组合是“圈名单”,那么 Stirling 数就是团建手册里最厚的那一章:它把“选人”升级为“组队”,把“组队”升级为“围圈”。接下来的两节,我们把这一章翻开来仔细读。

第一类Stirling数:篝火旁的圆桌

傍晚的篝火晚会开始了。小张要把 n 位员工分成 k 堆篝火,每堆围成一个圆圈坐下。这里有个关键规则:圆形座位没有“第一个位置”,整体旋转后大家相邻关系不变,算同一种坐法;但左右手互换的镜像算不同。这种“围成圆圈”的排列在数学上叫轮换,记作 (1 2 3) = (2 3 1),但 (1 3 2) 是另一个轮换。第一类 Stirling 数 c(n,k) 统计的正是“n 个人分成 k 个轮换”的方案数。

当 k=1 时,n 个人围成一圈有 (n-1)! 种:先固定一个人当“圆心参照”,其余 n-1 人排成一列,圆圈的旋转等价性正好被抹去。当 k=n 时,每人自己一堆篝火,只有 1 种。这些边界条件让递推关系有了出发点。现在新员工入职,他要加入这场晚会:要么自己抱一捆柴,新开一堆篝火;要么插到某位老员工右手边的空位——而已经有 n-1 位老员工,所以有 n-1 个空位可选。

c(n,k)=c(n−1,k−1)+(n−1) c(n−1,k),c(n,1)=(n−1)!, c(n,n)=1\displaystyle c(n,k)=c(n-1,k-1)+(n-1)\,c(n-1,k),\qquad c(n,1)=(n-1)!,\ c(n,n)=1

1. 两种去向相加:c(n,k)=c(n−1,k−1)+(n−1)c(n−1,k)c(n,k)=c(n-1,k-1)+(n-1)c(n-1,k),把新元素的所有可能分成“自立门户”与“加入旧圈”两类,互不重叠。

2. 自立门户:c(n−1,k−1)c(n-1,k-1) 表示先让其余 n-1 人围成 k-1 堆,新员工单独一堆,自然凑成 k 堆。

3. 插入旧圈:c(n−1,k)c(n-1,k) 表示其余 n-1 人已经围成 k 堆,此时新员工要插入其中一圈。

4. 系数来源:(n−1)(n-1) 是因为每个老员工右手边都有一个空位,n-1 个老员工就有 n-1 个插入位置,每个位置给出一种新坐法。

5. 边界条件:c(n,1)=(n−1)!c(n,1)=(n-1)! 是全员围一圈,c(n,n)=1c(n,n)=1 是每人单独一圈。

从篝火晚会的角度看,第一类 Stirling 数就是在回答:“n 位员工按'围圈不按站位'的规则分成 k 堆,究竟有几种坐法?” 它比排列多了一层“圆桌去旋转”的智慧,又比组合多了一层“圈内相对顺序”的讲究。这份“圆桌账本”,在密码学分析随机置换时还会再次登场。

第二类Stirling数:旅行社的分组方案

第二天,团建改成了自由行。老板只提一个要求:n 位员工分成 k 个旅行团,每个团至少一人,团与团之间不编号——“一团”和“二团”只是叫法,交换名字不算新方案;同一个团里的人也不排先后。这种把集合拆成若干非空、无标签子集的操作,数学上叫集合划分。第二类 Stirling 数 S(n,k) 统计的正是“n 个不同元素分成 k 个非空块”的划分总数。

沿用新员工的思路来推导递推:新同事入职后,要么干脆自己成立一个独立小团,要么加入已有的 k 个团之一。注意,此时已有 k 个团,所以“加入”有 k 种选择——这正是与第一类 Stirling 数的关键差异:第一类系数是“人数 n-1”,第二类系数是“团数 k”。边界同样友好:全员一个团或每人一团,都只有 1 种方案。

S(n,k)=S(n−1,k−1)+k S(n−1,k),S(n,1)=S(n,n)=1\displaystyle S(n,k)=S(n-1,k-1)+k\,S(n-1,k),\qquad S(n,1)=S(n,n)=1

1. 递推拆解:S(n,k)=S(n−1,k−1)+k S(n−1,k)S(n,k)=S(n-1,k-1)+k\,S(n-1,k),把“n 人分 k 团”归结为“新员工到来之前”的两种状态。

2. 自立一团:S(n−1,k−1)S(n-1,k-1) 对应其余 n-1 人已分成 k-1 团,新员工单独成团。

3. 加入老团:S(n−1,k)S(n-1,k) 对应其余 n-1 人已分成 k 团,新员工必须进入其中一个。

4. 乘上 k:k S(n−1,k)k\,S(n-1,k) 中的系数 k 表示他有 k 个团可选择,三种不同选择产生三倍方案。

5. 边界条件:S(n,1)=S(n,n)=1S(n,1)=S(n,n)=1 给递推提供地基,类似杨辉三角最外层的两个 1。

第二类 Stirling 数就是“自由行分组账本”。它不考虑团内顺序,也不给团贴标签,只关心“哪些人在一起”。这份账本在机器学习中很有用——聚类的本质就是寻找一种“好的划分”,而 Stirling 数告诉我们所有可能划分的数量级,让你明白为什么穷举聚类方案是不可能的。

递推关系的构造:新同事的两种选择

把第一节和第二节的递推放在一起看,你会发现惊人的对称美。第一类:$c(n,k)=c(n-1,k-1)+(n-1)c(n-1,k)$,系数是“老员工人数”;第二类:$S(n,k)=S(n-1,k-1)+kS(n-1,k)$,系数是“已有团数”。差别的根源在于“加入”的语义:围篝火时新员工要在某个具体的人旁边坐下,所以有 n-1 个位置;进旅行团时只要挑一个团即可,所以有 k 个选择。这个构造性思想——“新元素要么自立,要么加入”——是整个递推表的发动机。

这种递推结构与帕斯卡三角(杨辉三角)异曲同工:每一行都由上一行“错位相加”生成,只是系数不再是 1 而是随行列变化的数。正因如此,我们可以像填乘法表一样把两个三角形表完整算出来。比如第二类三角形前几行是:n=3 时为 1,3,1;n=4 时为 1,7,6,1;n=5 时为 1,15,25,10,1。每一行两端是 1,中间的每个数都能从上一行两个数按规则算出。

S(5,3)=S(4,2)+3 S(4,3)=7+3×6=25\displaystyle S(5,3)=S(4,2)+3\,S(4,3)=7+3\times 6=25

1. 代入递推:S(5,3)=S(4,2)+3 S(4,3)S(5,3)=S(4,2)+3\,S(4,3) 把规模从 5 降为 4,拆成“新员工自立”与“加入 3 个老团”两类。

2. 查上一行:S(4,2)=7S(4,2)=7 表示 4 人分 2 团的方案数是 7;S(4,3)=6S(4,3)=6 表示 4 人分 3 团的方案数是 6。

3. 加权合并:7+3×67+3\times 6 中,3 是新人可选择的团数,6 种旧划分各放大 3 倍。

4. 计算结果:7+18=257+18=25 表明 5 人分 3 团共有 25 种互不相同的划分方式。

递推表就像团建策划师的速查手册:有了它,任何规模的“分组围圈”问题都能像查字典一样快速得到答案,而不用真的把所有方案摆出来数一遍。这种“用上一行算下一行”的智慧,是动态规划算法最早的思想雏形之一。

贝尔数:所有团建方案的总和

老板突然问小张:“不管分几团,你总共有多少种分组方案?”这就是贝尔数(Bell number)要回答的问题:把 n 个不同元素的所有划分方案数加起来。记作 B_n,它等于 S(n,0)+S(n,1)+…+S(n,n)。拿 3 位员工举例:全员一团有 1 种({123}),两人一团加一人单飞有 3 种({12}{3}、{13}{2}、{23}{1}),每人一团有 1 种({1}{2}{3}),所以 B_3=5。贝尔数像是一棵树的“总叶数”,把第二类 Stirling 数每行全部相加。

贝尔数还有一个优雅的递推公式,用“领队”来理解非常直观:请 n+1 位员工里的某位当领队,假设与他同团的还有 j 人,那么先从其余 n 人中选出这 j 人($\binom{n}{j}$ 种),剩下 n-j 人随便分组(B_{n-j} 种)。对 j 求和,就得到递推式。这个公式把“划分”问题递归地拆成了“先选同团伙伴,再安排剩余的人”。

Bn=∑k=0nS(n,k),Bn+1=∑j=0n(nj)Bj\displaystyle B_n=\sum_{k=0}^{n}S(n,k),\qquad B_{n+1}=\sum_{j=0}^{n}\binom{n}{j}B_{j}

1. 总账定义:Bn=∑k=0nS(n,k)B_n=\sum_{k=0}^{n}S(n,k),其中 k 从 0 到 n 遍历所有可能的团数。

2. S(n,0) 的约定:当 n>0 时 S(n,0)=0S(n,0)=0,因为没有人却要分 0 团没有意义;而 B0=1B_0=1 表示 0 个人只有“空划分”一种方案,它是递推的基石。

3. 领队选同伴:(nj)\binom{n}{j} 表示先从其余 n 人中选出 j 人与领队同团。

4. 递归剩余:BjB_{j} 实际是 Bn−jB_{n-j} 的另一种写法——剩下的 n-j 人随便分组,它的方案数正是贝尔数。

5. 对 j 求和:∑j=0n\sum_{j=0}^{n} 遍历“领队所在团”的所有可能大小,把各类情况加起来。

贝尔数是“有多少种分组方式”的终极答案。在无监督学习中,聚类算法本质上就是在贝尔数规模的候选方案空间里寻找一个“好的划分”——贝尔数增长极快,B_10 就有 115975,这解释了为什么聚类必须靠启发式而非穷举。

显式公式:容斥原理揭开底牌

递推表虽好用,但若要一口算出 S(n,k),我们需要显式公式。思路回到“球盒模型”:把 n 位员工看成 n 个球,把 k 个团看成 k 个编了号的盒子。允许空盒时,每位员工独立选择盒子,共有 $k^n$ 种分配。但这多算了两笔账:一是出现了空盒,二是盒子有编号而真实划分中团是无标签的。

先用容斥原理剔除空盒:从 k 个盒子中挑 i 个强迫为空,有 $\binom{k}{i}$ 种挑法,剩下 k-i 个盒子随便装,有 $(k-i)^n$ 种,并乘以 $(-1)^i$ 做奇偶抵消。这一步把“没有空盒”的方案精确打捞出来。最后再除以 $k!$:因为 k 个有标签盒子的全排列 $k!$ 种写法对应同一个无标签划分,所以除以 $k!$ 抹去标签。

S(n,k)=1k!∑i=0k(−1)i(ki)(k−i)n\displaystyle S(n,k)=\frac{1}{k!}\sum_{i=0}^{k}(-1)^{i}\binom{k}{i}(k-i)^{n}

1. 总方案:knk^n 是 n 位员工每人任选一个编号盒子的所有方式,允许空盒。

2. 容斥变量:(−1)i(-1)^{i} 的符号交替出现,是容斥原理的“加加减减”:减掉有空盒的,加回空盒重叠的……

3. 选择空盒:(ki)\binom{k}{i} 表示从 k 个盒子中挑出 i 个指定为空盒。

4. 剩余分配:(k−i)n(k-i)^n 表示剩下 k-i 个盒子完全自由地接收 n 位员工。

5. 去标签:1k!\dfrac{1}{k!} 把 k! 种盒子编号方式合并为一种,因为真实旅行团没有“一号团、二号团”的区分。

以 S(4,2) 验证:$k=2$ 时原式等于 $\frac{1}{2}(2^4-2\times1^4+0)=7$,与递推表一致。显式公式就像团建的“万能模板”:不查表、不递推,直接代入 n 和 k 就能算出答案,是程序实现时的首选。

组合恒等式与应用:从计数到工具

Stirling 数不仅是计数器,更是组合数学的“语法”。第一个重要的恒等式是幂和展开:$x^n=\sum_{k=0}^{n}S(n,k)(x)_k$,其中 $(x)_k=x(x-1)\cdots(x-k+1)$ 是下降阶乘。它的组合解释很漂亮:把 n 位员工每人发一顶帽子,帽子共有 x 种颜色且允许同色——左边 $x^n$ 数的是所有染色方案;右边先把员工分成 k 个同色小组(S(n,k) 种),再给 k 个小组依次挑 x 种颜色中的 k 种不同颜色($(x)_k$ 种)。

第二个恒等式是两类 Stirling 数的正交性:$\sum_{k=m}^{n}S(n,k)\,c(k,m)=\delta_{nm}$,当且仅当 n=m 时为 1,否则为 0。这就像同一批员工的两份档案——“分组账本”和“围圈账本”——互为逆变换,组合起来可以互相校验、互推公式。

xn=∑k=0nS(n,k) (x)k,∑k=mnS(n,k) c(k,m)=δnm\displaystyle x^{n}=\sum_{k=0}^{n}S(n,k)\,(x)_{k},\qquad \sum_{k=m}^{n}S(n,k)\,c(k,m)=\delta_{nm}

1. 左侧计数:xnx^{n} 是 n 位员工每人从 x 种颜色里挑一顶帽子的染色总数。

2. 分组:S(n,k)S(n,k) 先把员工按“同色”分成 k 个无标签小组。

3. 下降阶乘:(x)k=x(x−1)⋯(x−k+1)(x)_{k}=x(x-1)\cdots(x-k+1) 表示依次给 k 个小组挑互不相同的颜色,挑过的颜色不能再选。

4. 正交记号:δnm\delta_{nm} 是克罗内克函数,n=m 时取 1,否则取 0。

5. 求和范围:∑k=mn\sum_{k=m}^{n} 表示遍历中间所有可能的团数,两类 Stirling 数在这一路上恰好“一进一出”互相抵消。

这些恒等式让 Stirling 数成为算法设计与概率统计的常客:在分析随机置换的轮换个数时,第一类 Stirling 数给出精确分布;在计算生日问题、占位问题等概率模型时,第二类 Stirling 数提供计数基础;在密码学中分析伪随机置换的轮换结构时,两类 Stirling 数更是不可或缺。

---

AI 应用场景

无监督聚类方案的规模估算

阶段:模型选择与评估

解决的问题:聚类算法(如 K-Means)本质上是在所有可能的划分方案里寻找一个“好的团建分组”。传统观念常误以为可以“试遍所有分组”,但第二个 Stirling 数揭示:n 个点分成 k 个无标签簇的方案数是 S(n,k),而所有可能划分的总数是贝尔数 B_n,增长速度极快(B_100 是天文数字)。这让数据科学家明白穷举不可能,必须依赖启发式迭代。

具体案例:某推荐系统团队要对 50 万用户做行为分群。分析师用贝尔数估算出候选划分空间远超宇宙原子数,于是果断放弃穷举,改用 Mini-Batch K-Means 配合轮廓系数做多轮采样评估,三天内锁定了 12 个可解释的用户簇。

密码学中随机置换的轮换分析

阶段:安全性与随机性验证

解决的问题:许多加密算法(如 Feistel 网络、伪随机置换 PRP)依赖随机置换的统计性质。第一类 Stirling 数 c(n,k) 恰好给出“n 元素随机置换恰好含 k 个轮换”的方案数,从而可以计算轮换数量的期望与方差,用于判断置换是否足够“混乱”。

具体案例:某区块链项目需要评估其签名算法中 S-box 置换的随机性。安全工程师用第一类 Stirling 数算出 n=128 时随机置换轮换数的理论分布,与实际抽样结果对比,发现偏差在置信区间内,顺利通过审计。

组合特征工程与实验设计

阶段:特征工程与 A/B 测试

解决的问题:建模时面对几十个候选特征,常需要尝试“哪些特征组合在一起效果最好”。若按特征子集划分来枚举,方案数是贝尔数级别的;Stirling 数递推表可以帮助估算搜索空间,指导用贪心或随机搜索代替全枚举,并为“特征组团”提供理论边界。

具体案例:推荐算法团队有 15 个候选特征,想测试把特征分成若干组分别建模的效果。数据科学家用 S(n,k) 递推计算不同分组规模下的方案数量级,决定采用“前向特征分组 + 交叉验证”策略,将实验次数从不可行的全枚举压缩到 20 组有效对照。

Python 演示

python48 行
from math import comb, factorialfrom functools import lru_cache  @lru_cache(maxsize=None)def s2(n, k):    """第二类 Stirling 数 S(n,k): n 个元素分成 k 个非空无标签块"""    if k == 0 or k > n:        return 1 if n == 0 and k == 0 else 0    if k == 1 or k == n:        return 1    return s2(n - 1, k - 1) + k * s2(n - 1, k)  @lru_cache(maxsize=None)def s1(n, k):    """无符号第一类 Stirling 数 c(n,k): n 个元素分成 k 个轮换"""    if k == 0 or k > n:        return 1 if n == 0 and k == 0 else 0    if k == n:        return 1    return s1(n - 1, k - 1) + (n - 1) * s1(n - 1, k)  def bell(n):    """贝尔数: n 个元素所有划分方案的总数"""    return sum(s2(n, k) for k in range(n + 1))  def explicit_s2(n, k):    """用容斥显式公式计算 S(n,k),与递推结果互相验证"""    total = 0    for i in range(k + 1):        total += (-1) ** i * comb(k, i) * (k - i) ** n    return total // factorial(k)  if __name__ == "__main__":    print("第二类 S(n,k) 三角表:")    for n in range(6):        print(n, [s2(n, k) for k in range(n + 1)])     print("第一类 c(n,k) 三角表:")    for n in range(6):        print(n, [s1(n, k) for k in range(n + 1)])     print("贝尔数 B_1..B_8:", [bell(n) for n in range(1, 9)])    print("S(8,3) 递推 =", s2(8, 3), " 容斥公式 =", explicit_s2(8, 3))
目的:用记忆化递归实现两类 Stirling 数递推与贝尔数求和,并用容斥显式公式交叉验证结果。
  1. @lru_cache(maxsize=None)给递归函数装上“记忆手环”,避免重复计算同一个 (n,k),就像查表而不是从头枚举。
  2. if k == 1 or k == n: return 1边界条件:全员一团或每人一团都只有 1 种分法。
  3. s2(n - 1, k - 1) + k * s2(n - 1, k)第二类递推:新元素自立一团,或加入已有 k 个团之一。
  4. s1(n - 1, k - 1) + (n - 1) * s1(n - 1, k)第一类递推:新元素自立一圈,或插到 n-1 个老员工右手边的空位。
  5. sum(s2(n, k) for k in range(n + 1))贝尔数就是第二类 Stirling 数按行求和,把“按团数分列”的账本叠成总账。
  6. (-1) ** i * comb(k, i) * (k - i) ** n容斥公式的单次迭代:选 i 个空盒并加/减符号。
  7. total // factorial(k)除以 k! 去掉盒子标签,把“有编号盒子”还原成“无标签旅行团”。

常见误区

误区我一直以为第一类和第二类 Stirling 数差不多,反正都是“把 n 个东西分成 k 组”,区别只是在符号或写法上,用的时候随便挑一个就行。

正解两者差在“组内是否需要围圈”。第二类 S(n,k) 是纯分组——团内不排序、团无标签,就像自由行旅行团;第一类 c(n,k) 是分组后再“围成圆圈”——圈内相对顺序有意义、旋转算同一种,就像篝火晚会。最直观的判别法:如果问题中出现了“循环”“圆桌”“轮换”“置换分解”,用第一类;如果只是“划分”“聚类”“分组”,用第二类。

为何常见:两类数的记号非常相似(${n\brace k}$ 与 ${n\brack k}$ 只差一个括号方向),初学时容易只看表象不看组合含义,导致用错场景。

误区递推不都是 S(n,k) = S(n-1,k-1) + (n-1)·S(n-1,k) 吗?反正都是“新元素加进来”,系数写成 n-1 或 k 应该都行吧?

正解系数完全不同,且各有明确来源。第二类的“加入”是加入 k 个团之一,所以系数是 k;第一类的“加入”是插到 n-1 个老员工之一右手边的空位,所以系数是 n-1。记忆口诀:第二类看团数 k,第一类看人数 n-1。写代码时把系数写反,整张三角形表都会错。

为何常见:人的直觉容易把“加入”统一理解为“和每个人相邻”,忽略了第二类分组不关心组内位置,于是误把 n-1 套用到第二类上。

误区把 n 个球放进 k 个不同的盒子里、每个盒子非空,这不就是 S(n,k) 吗?我直接数就好了。

正解那是 $k!\,S(n,k)$,不是 S(n,k)。S(n,k) 的划分中,块是没有名字的——{12}{3} 和 {3}{12} 是同一种划分;而“放进 k 个不同盒子”相当于给每个团贴上了 1 到 k 的编号,方案数要乘 k!。显式公式最后除以 k! 的步骤就是在做“撕标签”,省略它就会恰好多算 k! 倍。

为何常见:生活语言里“分成三组”常常默认组有编号(一组、二组、三组),数学里“划分”默认无标签,语义的细微差别被忽略。

误区S(n,k) = (1/k!)·k^n 不就行了吗,为什么要那么长的求和?容斥公式里的 (-1)^i 是装饰吧?

正解$k^n$ 严重高估——它允许空团且团有编号。容斥公式里的每一项都在“纠错”:$i=0$ 项是所有 $k^n$ 种分配;$i=1$ 项减去“至少一个团为空”的方案;$i=2$ 项加回“两个团同时为空”被多减的部分……符号 $(-1)^i$ 交替出现是容斥原理的精髓,绝不能省略或改号。

为何常见:初学容斥原理时只记住了“减重叠”,但没有理解“奇减偶加”的交替逻辑,遇到具体求和时容易把符号写反、项数算错,最终结果差之千里。

面试题

Q1. 第二类 Stirling 数 S(3,2) 的值是多少?

单选题 · easy

  • A.1
  • B.2
  • C.3← 正确答案
  • D.6

答案:C。S(3,2) 表示把 3 个不同元素分成 2 个非空无标签块。三种划分是 {1}{2,3}、{2}{1,3}、{3}{1,2},所以答案是 3。选项 A 是 S(3,1) 的值,选项 D 是 3 个元素的排列数 3!,B 是二人旅行团配对的直觉误差。

Q2. 第一类 Stirling 数 c(3,2) 的值是多少?

单选题 · easy

  • A.1
  • B.2
  • C.3← 正确答案
  • D.5

答案:C。c(3,2) 表示 3 个元素分成 2 个轮换。轮换结构必定是 1+2:固定一个元素单独成圈(3 种选择),剩下两个元素围成一圈只有 1 种((a b) 与 (b a) 是同一个圈),所以共 3 种。选项 D 是贝尔数 B_3。

Q3. 贝尔数 B_4 等于多少?

单选题 · easy

  • A.5
  • B.10
  • C.15← 正确答案
  • D.52

答案:C。B_4 = S(4,0)+S(4,1)+S(4,2)+S(4,3)+S(4,4) = 0+1+7+6+1 = 15。选项 A 是 B_3,选项 D 是 B_5,选项 B 是 C(5,2) 的干扰值。贝尔数是“任意团数分组方案的总账”。

Q4. 已知 S(3,1)=1、S(3,2)=3,利用递推公式 S(n,k)=S(n-1,k-1)+k·S(n-1,k) 求 S(4,2):

单选题 · mid

  • A.5
  • B.6
  • C.7← 正确答案
  • D.8

答案:C。代入 n=4、k=2:S(4,2) = S(3,1) + 2·S(3,2) = 1 + 2×3 = 7。系数 k=2 表示新员工可以加入已有的 2 个团之一。选项 A、B、D 都是对系数或加法运算的误算。

Q5. 第一类 Stirling 数递推 c(n,k)=c(n-1,k-1)+(n-1)·c(n-1,k) 中的系数 (n-1) 应如何理解?

单选题 · mid

  • A.新员工可以选择加入已有 k 个团中的任意一个,所以乘 k
  • B.因为每个人都可以当“团代表”,所以乘 n
  • C.新员工可以插到 n-1 个老员工任一人的右手边,所以乘 n-1← 正确答案
  • D.因为一个圈里至少有 2 人,所以乘 n-1

答案:C。围篝火时,新员工要么自立一圈,要么插入已有圈的某个空位。已有 n-1 位老员工,每人右手边恰好一个空位,所以有 n-1 种插入方式。选项 A 描述的是第二类 Stirling 数的系数 k,B 和 D 的倍数都无组合依据。

Q6. 关于贝尔数 B_n,下列说法正确的有:

多选题 · mid

  • A.B_4 = S(4,1)+S(4,2)+S(4,3)+S(4,4) = 15← 正确答案
  • B.B_3 = 3
  • C.B_n 表示 n 个不同元素所有划分方案的总数← 正确答案
  • D.B_4 = 4

答案:AC。贝尔数就是把第二类 Stirling 数按 k 求和,B_4 = 1+7+6+1 = 15,所以 A 对、D 错;B_3 应为 5({123}、{12}{3}、{13}{2}、{23}{1}、{1}{2}{3}),B 错;C 是贝尔数的定义,正确。

Q7. 用容斥显式公式计算 S(4,2) 时,中间项 (-1)^1·C(2,1)·1^4 的作用是什么?

单选题 · hard

  • A.剔除“至少一个团为空”的多余方案← 正确答案
  • B.计算所有 2^4 种分配的总数
  • C.给两个团贴上标签
  • D.补偿“两个团都为空”被多减的部分

答案:A。S(4,2) = (1/2!)[2^4 - 2·1^4 + 0] = 7。i=1 的项对应容斥原理第一步剔除:选 1 个团为空(C(2,1) 种选法),剩下 1 个团接收全部 4 人(1^4 种),带负号表示减去空团方案。D 描述的是 i=2 的项,B 是 i=0 的项。

Q8. 在幂和恒等式 x^n = Σ S(n,k)·(x)_k 中,第二类 Stirling 数 S(n,k) 承担的计数任务是:

单选题 · mid

  • A.给 k 个盒子排顺序
  • B.把 n 个不同元素分成 k 个无标签的非空组← 正确答案
  • C.从 x 种颜色里挑 k 种颜色
  • D.计算 n 个元素的排列数

答案:B。恒等式的组合证明是“先分组、再选色”:S(n,k) 负责把 n 个元素分成 k 个无标签同色组,然后 (x)_k 给这些组依次分配互不相同的颜色。A 是排列的职责,C 由 (x)_k 完成,D 与分组无关。

Q9. 关于第一类 Stirling 数 c(n,k),下列说法正确的有:

多选题 · mid

  • A.它对应 n 个元素排列分解为 k 个轮换的计数← 正确答案
  • B.它的递推系数是 (n-1)← 正确答案
  • C.c(n,1) = (n-1)!← 正确答案
  • D.c(5,2) = 120

答案:ABC。A 是第一类 Stirling 数的定义;B 是篝火插入空位的递推系数;C 是 n 个人围成一个圈的方案数。D 错误:c(5,2) = 50(结构 1+4:5×(3!)=30;结构 2+3:C(5,2)×2=20;共 50),120 是 5!。

Q10. 两类 Stirling 数满足正交性 Σ_{k=m}^{n} S(n,k)·c(k,m) = δ_{nm},那么当 n=4、m=2 时,该求和等于:

单选题 · extreme

  • A.0← 正确答案
  • B.-1
  • C.1
  • D.无法确定

答案:A。δ_{nm} 当且仅当 n=m 时为 1,否则为 0。这里 n=4 ≠ m=2,所以结果为 0。这个正交性就像两份“互为反查表”的账本:先按某规则分组再按另一规则围圈,只要起点终点不同,中间过程全部抵消。