排列与组合
排列与组合是组合数学中最基础的东西了。在此做一点记录。
阶乘
在组合数学中,阶乘随处可见,它极大的简化了公式的形式。
我们将
特别的,
我们来看一下阶乘函数的增长:
上图中,红色的阶乘函数
由此可见阶乘函数的增长比平方快。与三次方相比,阶乘函数在之后也将赶超。
因此如果时间复杂度里面出现了阶乘,那将是一件可怕的事情。
排列
对于一个集合
例如集合
其2排列为:
3排列为:
由于
为了方便计数,我们将一个含有
如:
特别的,我们定义
如何计算这个值呢?当然我们是有公式的:
定理 对于任意的
证明 我们有
现在我们来运用一下排列。
首先来计数由
这个非常简单,就是
如果现在要求
我们考虑将连续出现的数给计数出来,这样就可以得到答案。
我们发现,通过向一个
因此最终的答案为
组合
与排列相对,一个集合的组合2是其元素的无序放置。
其含义就是从集合中”选取”出几个元素。由于不考虑位置关系,所以像
组合这一概念在整个组合数学中用处十分巨大。接下来我们先看到如何计数它。
首先我们将组合数记为
因此
同样,为了能够更加方便的计数它,我们当然也是有公式的。
我们发现,任意一个
将排列数展开,我们可以得到下面的公式:
其中,
组合数的基本性质
组合数有着许多非常有用的性质。首先一个非常基本的等式就是:
直接利用组合数的公式可以得证这一性质。
通过对组合数进行求和,我们可以得知一个集合的子集数量:
这个等式当然可以用求和来得出。我们可以换个角度来考量它。一个集合的子集中,某些元素要么没有出现,要么就出现了。因此对于每个元素一共有两种选择,因此子集的总数为
接下来是比较重要的帕斯卡公式:
定理 对于所有的
证明 尝试将右式化为左式即可。
这样就完成了证明。注意,在上面的证明中,利用到了阶乘的性质:
不难发现,帕斯卡公式实际上是组合数的一个递推公式。
上图是由帕斯卡公式得到的一个递推的关系图,这里以
上面的步骤就是动态规划中的状态转移的过程。利用这个公式,我们可以在
在具体实现的时候只需注意一些无效的特殊情况,其中包括