使用 ABCDEFG 来表示组合类,使用 a,b,c,d∈ABCDEF⋯ 表示组合对象。使用 |a| 表示组合对象的大小。
定义两个组合类 A,B 的笛卡尔积为 A×B={(a,b) | a∈A,b∈B}。
定义代数对象 z。a 的幂表示记做 z|a|。
定义组合类 A 的 OGF 为:
A(z)=∑a∈Az|a|=∑i≤naizi
不难发现有下面等价关系:
- C(z)=A(z)+B(z)⟺C=A+B
- C(z)=A(z)×B(z)⟺C=A×B
其中 × 操作表示两个组合类之间的笛卡尔积。
接下来定义一些基本的组合类。
- E={ϵ},其中 ϵ 表示中性对象,E 为中性类。其大小为 0。E(z)=z|ϵ|=1。
- Z={∘},其中 ∘ 为原子对象,Z 为原子类。其大小为 1。Z(z)=z。
Example 1.1 :求卡特兰数的 OGF。
一个广为人知的卡特兰数定义方法是通过 n 个点的二叉树数量。
对于一个二叉树,其一个节点为一个原子对象。空树可以看做中性对象。
对于一个节点,需要考虑左右儿子,本身节点以及空集的情况。因此有:
C=E+C×Z×C
因此有 C(z)=E(z)+C(z)×Z(z)×C(z)=1+z×C(z)2。移项得:
z×C(z)2−C(z)+1=0
定义 E1,E2 表示两个不同的中性类。那么
A+B=(E1×A)+(E2×B)
这样有效区分了两个集合。这个定义可以起到一个类似多重集的效果。
集合的 Sequence 构造生成所有可能的排列(有序)。
例如:
-
SEQ({a})={ϵ}+{a}+{(a,a)}+{(a,a,a)}+⋯
-
SEQ({a,b})={ϵ}+{a,b}+{(a,a)}+{(a,b)}+{(b,a)}+{(b,b)}+{(a,a,a)}+{(a,a,b)}+{(a,b,a)}+⋯
可以看出,SEQ 生成了所有可能的不同有序组合。
我们定义,SEQ(A)=E+A+(A×A)+(A×A×A)+⋯
对应 OGF 的语言为:Q(A(z))=1+A(z)+A(z)2+A(z)3+⋯=11−A(z)
Example 3.1:求长度为 n 的 01 串有多少种。
使用 SEQ 构造,不难得出,Q(A(z))=Q({z,z})=11−2z。
答案显然是 [zn]11−2z=2n。
Example 3.2:大小为 n 的有序有根树个数。
考虑组合类 T,考虑任意一个节点,有:
T={∘}×SEQ(T)
也就是
T(z)=z1−T(z)
![image-20240331161523669]()
image-20240331161523669
所以这个玩意实际上就是少了一个点的卡特兰数。
Multiset 构造生成了所有无序的组合。如:
SEQ({a,b})={ϵ}+{a}+{b}+{(a,a)}+{(a,b)}+{(b,b)}+{(a,a,a)}+{(a,a,b)}+⋯
注意到形如 {(a,b)},{(b,a)} 的都在 SEQ 中出现了,但是在 MSET 中都没有出现。
我们定义其递推式为:
MSET({α1,α2,α3⋯αn})=MSET({α1,α2⋯αn−1})×SEQ(αn)
即
MSET({α1,α2,α3⋯αn})=SEQ(α1)×SEQ(α2)×SEQ(α3)×⋯×SEQ(αn)
也即
M=MSET(A)=∏α∈ASEQ(α)
改写成生成函数就是
M(z)=∏α∈A(11−z|α|)=∏i=1(11−zi)Ai
特别的,当 α={∘} 时,M(z)=(11−z)n。
对于计算,我们可以将 M 取 ln 后再做 exp。也就是
M(z)=expln∏i=1(11−xi)Ai=exp∑i=1Ailn(11−xi)
注意到有
ln(1+z)=z1−z22+z33−z44+⋯=∑i≥1(−1)i−1zii
因此有
exp∑i=1Ailn(11−xi)=exp(∑i≥1(−Ailn(1−xi)))=exp(∑i≥1(−Ailn(1+(−xi)))=exp(∑i≥1(−Ai∑j≥1(−1)j−1zijj))=exp(∑i≥1(Ai∑j≥1zijj))=exp(∑i≥1(∑j≥1Aizijj))=exp(∑i≥1A(zi)i)
记 Exp(A(z))=M(z),称为 Pólya 指数。其逆变换为 Ln。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示