计数问题其实只是组合数学中的一小部分,以上也仅仅介绍了比较经典的结论。组合问题复杂多变,它们之间也少有联系,所以把组合数学称作一门学科并不准确。组合难题也会出现在各种益智趣题或竞赛难题中,随随便便就会出现一些未解的难题,所以我们也将止步于此。在结束本课之前,我决定再窥探一下组合问题中的一大类:组合设计。这些问题的关注点在如何布局元素,以满足一些特定要求,它们已然构成了组合学的众多分支。
1. 0-1矩阵
1.1 关联矩阵的秩
有的问题需要在两个集合间建立联系,如果把的元素分别纵横排列,对应位置上以表示元素是否有关联。这就得到了一个0-1矩阵,当然这里我们并不关注它的代数性质,而仅仅是借用其便捷的形式,来研究满足一定条件的组合问题。0-1矩阵也被称为关联矩阵,它可以是两个集合间的联系(比如集合的子集与元素的包含关系),也可以是同一集合中元素的关系(比如图论中的图)。

在讨论关联矩阵时,矩阵的行列的顺序对问题并无影响,为了讨论方便,可以随意交换行或列。好的,现在面对着一个满是的矩阵,我们需要讨论些什么问题呢?除了看每个0,1项之外,当然还看到了每一行和每一列,我们把它们都称为矩阵中的线。只要选择足够多的线,总可以包含所有的,这些线称为关联矩阵的覆盖。你自然会想到一个有意义的问题:线数最小的覆盖是多少?我们把它定义为矩阵的线秩,记作。
换个角度,称矩阵中的一个为项,与之相关的有行、列两条线,把不在同一条线上项称为无关项。无关项足够多时,它们的线也可以覆盖关联矩阵,这就有了另外一个有意义的问题:最多可以有多少个无关项?我们把它定义为矩阵的项秩,记作。因为所有项包含在任意一个线覆盖中,而每条线上最多只能有一个无关项,故首先有。
反之对于线数为的覆盖,设有行列,下面证明可以在每行、列上取得一个无关的代表项。考察行中与列不相交的部分,如果不能在其中选出个无关的项,则必然可以用小于条列线取代这条行线。另一部分同样论证,这就证明了总可以选出个无关项,从而有。这就得到了等式(1),以后可以统称线秩、项秩为秩,线秩和项秩的问题可以互相转化,这从下面的例子和定理中都能看出。
秩等于行列中较小值的矩阵便称为是满秩的,存在一种满秩的阶方阵,它仅有个,每行每列有且仅有一个。换个说法,这种矩阵的每行每列之和都是,若干这种矩阵的凸线性组合(式(2))也必然满足这一条件。每条线上和都为的非负实矩阵被称为双随机矩阵,这是一种很有用的矩阵。
现在反过来问,是不是所有双随机矩阵都有式(2)的凸线性分解呢?这个其实不难,首先双随机矩阵不能被少于条线覆盖,故必然是满秩的。选择个无关项并取最小值,作关联矩阵使其仅在这个项为。作出满足的,它也是双随机矩阵,但非零项比少一个。对继续这个过程,有限步后便可得到式(2),结论得证,它被称为Birkhoff定理。
1.2 Hall定理
关联矩阵的项秩有一个非常重要的等价描述,把关联矩阵看出是点集之间的连接,这在图论中被称为二部图。各选出一个关联的元素称为一个匹配,然后继续在剩下的元素中选取匹配,项秩正表示二部图中的最大匹配数。这个模型有很广泛的应用,典型的就是任务分配问题:每个人能胜任某些任务,给一个分配方案,使尽量多的人能做自己胜任的任务。

当然这个问题的第一步先要求矩阵的秩,或者更弱一点,至少我们要找到满秩的判定条件。为了表述方便,下面换一个等价模型,设是集合,把看成是的一个子集,关联当且仅当。是集合的集合,一般也称为集系。对于满秩的关联,为每个都能找到一个互异的,它们被称为的相异代表系。
对于集系矩阵满秩有一个很显然的必要条件,就是任意个子集的并不小于。令人惊喜的是,它居然还是个充分条件,该结论被称为霍尔(Hall)定理(式(3))。其实条件本身等价于说,矩阵的零子矩阵总不大于,故零子矩阵的行列和总小于,从而线覆盖数至少为。这就证明了满秩,论证中用到了线秩在零子矩阵里的等价条件,这也是线秩最常用的方法。
Hall定理有很高的理论价值,但在实际应用中仍不是很方便,但借助这个定理,我们可以有更强但更方便的条件。比如如果存在,使得矩阵每行至少有个而每列最多有个,可以证明它满足Hall定理,从而为满秩。其实任选行,其中包含至少个,它们至少要有列来覆盖,结论得证。当然实际应用中并不总能找到完美匹配,假设至少有个找不到工作,只需再添加个虚拟的大家都能做的工作,利用Hall定理也可以得到只有个人找不到工作的充要条件是:任意个子集的并不小于。
再来看Hall定理的两个有趣的应用。考察集合的的两个分割和,我们希望找到个互异的元素,使得且,它们被称为分割的共同代表元组。以有非空交集作为关联,问题等同于判断满秩,Hall定理说明满秩的充要条件是:任何个之并最多包含个之并。特别地,当全部相等时,充要条件显然满足,也就是说,集合的任意两个分割数相等的平均分割总存在共同代表元组。
有一种常见的阶矩阵,共有个不同的元素组成,且每条线上的元素不同。这样的矩阵称为拉丁矩阵,显然有,当时称为拉丁方。一个自然的问题是,任何拉丁矩阵是否都能扩展为拉丁方?考察不属于第列的元素组成的集合,它们和个元素以包含关系建立关联。显然,每个包含个元素,而每个元素已经出现过次且属于不同的列,故未出现在列中。直接利用Hall定理的推论,可选出的相异代表系,以它们组成新的一行,可以继续这个过程,直至构造出拉丁方。
1.3 积和式
对阶的关联矩阵(),一组相异代表系其实就是在每行取一个元素,满足。这就启发我们,对每行的任意选取计算其乘积,并将所有可能的乘积相加,结果便是相异代表系的个数。严格来讲,一种选取就是一个从行数到列数的互异映射,记所有这种映射的集合为,称式(4)为关联矩阵的积和式(permanent)。
式(4)的定义与矩阵行列式的定义非常类似,故不难证明积和式也有类似行列式计算的拉普拉斯展开式,这里就不展开阐述了。积和式的计算并不容易,它只有理论价值,对于特殊的形式的关联矩阵可以通过拉普拉斯方法简化计算。积和式一般用于一些计数问题中,这里举一个常见的例子。
考虑将个元素重新排列,并限制每个元素出现的位置,这种问题被称为限位排列问题。每个元素和可以出现的位置建立起阶关联矩阵,排列的个数显然就是矩阵的积和式。前面多次提到的错位排列问题就是一个特例,它的关联矩阵为(为全矩阵),容易得到,你可以尝试计算其母函数和通项公式。
还有一个经典的限位排列问题,就是著名的“夫妻围坐”问题:对夫妻围坐在圆桌边,要求男女相间但夫妻不相邻。可以先让女士入座,问题的难点就是男士入座的坐法数。记女士左手边的位置为,男士就不能坐或(时为),这是个典型的限位排列问题。我们可以轻松地写出关联矩阵(是的矩阵),但它的显式表达式比较难解,这里只给出结论(式(5),试试用容斥原理解决)。
1.4 0-1矩阵类
对一个阶的关联矩阵,可以计算每行和每列的个数,向量被称为行和向量与列和向量。我们自然想问,任意给定维向量和维向量,存在以它们为行(列)和向量的关联矩阵吗?首先当然有式(6)成立,这个条件过于平凡,以下把它当做默认条件,并把以作为行(列)和向量的所有关联矩阵的集合记作。
由于行列可以任意交换,我们事先假定都是递减排列的。在具体排列时,先将每行的个全部靠左放置,得到的矩阵记作。它的列和向量记作。的特点是向左紧凑排列,具体来讲就是任意都取到了最大值。为讨论方便,如果两个维向量满足式(7),则称优超于。刚才的讨论说明,非空的必要条件是。
其实也是非空的充分条件(式(8),当然还要求(6)成立),它由Ryser和Gale分别单独发现,这里仅描述一下思路,严格证明请看教材。以为初始状态,第一步将行和最小的行向右平移一列,这样第一列就只有个。去除掉第一列后矩阵仍然是相左紧凑排列的,将余下矩阵的行和最小的行向右平移一列,依次类推便可构造出。
2. 集系的极值
组合设计问题中还有一类问题,就是在的所有子集中选出满足条件的子集构成集系,并且讨论能取到的最值。这类问题花样繁多,大部分也很难解决,残留了大量尚未解决的问题。以我有限的眼光看,这些智力竞逐的游戏并没有广泛的应用领域,这里暂时就不做介绍了,留作后话吧。子集间最简单的关系就是交集和包含,下面从这两方面讨论两个简单的问题。
2.1 相交集系
第一个问题很简单,就是要求集系中的元素两两交集非空,问集系最大为多少?构造两两相交的集系并不难,任取,所有包含的子集便满足条件,其个数是所有子集的一半。还能更大吗?对任何子集,和不能同时选取,故已是最大值。
甚至对一个阶小于的相交集系,总可以将其扩展为个。因为总存在使得都不属于,如果与的所有元素都相交,则可添加进。否则设存在使得,则可证中任意元素都满足,因为这样的话,矛盾。既然恒有,则必然有,可将添加到中,结论得证。
如果把条件改成任意三个集合有交集呢?基于开始的构造(总取),最多仍然能取到个,现在来证明这是唯一的情况。假设是满足的最大值,如果,则易证不属于,但却与中所有元素有交集,矛盾。故,唯一性便容易证明。
2.2 Sperner系
第二个问题可以描述为,集系中的元素互不包含,问集系最大为多少?这样的集系也称为Sperner系。既然讨论到包含关系,我们来考察所有满足时(9)的包含链,Sperner系在每条链上最多只能有一个元素。由于包含链上每一步只多一个元素,故包含链总共有条。对任意,如果,则包含的链共有条。若记中阶为元素有个,由于每条链最多只能包含的一个元素,则显然有式(10)左成立,整理后便是式(10)右。
以下记,由的单调性易知,等号成立的充要条件是:只有当时,并且所有链上都有中的元素。当取所有阶子集,或者取所有阶子集时,都满足等式要求。下面证明其实只能取这两种子集之一,证明中一定要牢记:每条链都有且仅有一个的元素。
假设阶子集只有部分在中,则必然可选出阶子集。将向每次换一个元素地渐变,过程中必有某个时刻有,且。由知,但由又有,矛盾!只就证明了,Sperner系取最大值时,要么全是阶子集,要么全是阶子集,该结论被称为Sperner定理。
【全篇完】
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架