zoukankan      html  css  js  c++  java
  • 斯特林数

    简介

    斯特林数是组合数学中的一个重要内容,有许多有用的性质。它由十八世纪的苏格兰数学家James Stirling首先发现并说明了它们的重要性。
    斯特林数主要处理的是把(N)个不同的元素分成(k)个集合或环的个数问题。现在我们说的斯特林数可以指两类数,分为第一类斯特林数和第二类斯特林数,其中第一类斯特林数还分成有符号和无符号两种。

    第一类斯特林数

    这里仅讨论有符号的第一类斯特林数。
    第一类斯特林数表示的是将(n)个不同元素分成(k)个不同的环的方案数。两个环不相同当且仅当这两个环不能通过旋转得到。表示方法为:

    [egin{bmatrix} n \ k end{bmatrix} ]

    考虑递推,把(n)个不同元素分成(k)个不同的环有两种转移。第一种,有可能是(n-1)个不同元素分成(k-1)个不同的环,当前的第(n)个独立成一个元素。第二种可能是(n-1)个不同元素已经分好了(k)个不同的环,当前这个可以加进去。加在每个已有元素的逆时针方向(或顺时针方向,方向没有关系,只要统一即可)就不会出现重复,共有(n-1)种方法,所以:

    [egin{aligned} egin{bmatrix} 0 \ 0 end{bmatrix} &=1 \ egin{bmatrix} n \ k end{bmatrix} &= egin{bmatrix} n-1 \ k-1 end{bmatrix} + egin{bmatrix} n-1 \ k end{bmatrix} *(n-1) end{aligned} ]

    这就是第一类斯特林数的递推式,也可以写成:

    [s(n,k)=s(n-1,k-1)+s(n-1,k)*(n-1) ]

    性质

    组合数学中的定理暴力求解可行,但是不好玩。所以组合数学中很多定理的证明是通过构造一个问题,用两种不同的方法计算,由于是同一个问题,那么算出来的答案一定是相等的,从而证明等式,简称“算两次”。
    第一类斯特林数有如下特殊性质:

    1. (s(0,0)=1)
    2. (s(n,0)=0~ (n>0))
    3. (s(n,1)=(n-1)!)
    4. (s(n,n-1)=C_n^2)
    5. (s(n,2)=(n-1)!*sum _{i=1}^{n-1}frac{1}{i})
    6. (s(n,n-2)=2C_n^3+3C_n^4)
    7. (sum _{k=0}^ns(n,k)=n!)

    下面给出性质1,3,4,5的证明。

    性质一

    显然,我们把(n)个元素排列起来,有(n!)种可能,首尾相接即可得到一个环。这里面每种情况重复了(n)次,因为可以旋转(n)次,所以除以(n),得到(s(n,1)=(n-1)!).

    性质三

    (s(n,2)=(n-1)!*sum \_{i=1}^{n-1}frac{1}{i})
    这里给出数学归纳法的证明。
    首先,(s(2,2)=1*1=1),符合定义。
    下面通过递推式和性质一证明性质三对于(n)也成立:

    [egin{aligned} s(n+1,2)&=s(n,1)+s(n,2)*n \ &=(n-1)!+n*(n-1)!*sum _{i=1}^{n-1}frac{1}{i} \ &=(n-1)!+n!*sum _{i=1}^{n-1}frac{1}{i} \ &=frac{n!}{n}+n!*sum _{i=1}^{n-1}frac{1}{i} \ &=n!*sum _{i=1}^{n}frac{1}{i} \ end{aligned} ]

    得证!

    性质四

    同理可用数学归纳法强行计算。巧妙的方法我还没想到。

    性质五

    这里有一个巧妙地“算两次”方法。
    首先构造一个问题,求(n)个数的所有排列。
    首先用乘法原理直接得出结论,(ans=n!)
    我们知道,对于一个排列对应一个置换,即:

    [egin{pmatrix} 1 & 2 & ... & n \ a_1 & a_2 & ... & a_n end{pmatrix} ]

    把这个置换中的上下对应位置连边,可以得到许多的环。由于排列和置换是一一对应的,所以我们要求排列的个数,就是求用(n)个元素组成环的方案数,所以我们枚举环的个数:

    [n!=sum _{k=1}^ns(n,k) ]

    由于我们有(s(n,0)=0),所以也可以写成:

    [sum _{k=0}^ns(n,k)=n! ]

    第二类斯特林数

    第二类斯特林数表示把(n)个元素分成(k)个非空集合的方案数,集合内是无序的。这样,我们很容易得出转移:
    分为两种情况。第一种情况,如果前(n-1)个元素组成了(k-1)个非空集合,那么当前元素自成一个集合。第二种情况,如果前(n-1)个元素组成了(k)个集合,那么当前的这个元素可以放进这(k)个集合中任意的一个。所以我们的到来递推方程:

    [egin{Bmatrix} n \ k end{Bmatrix}=egin{Bmatrix} n-1 \ k-1 end{Bmatrix}+egin{Bmatrix} n-1 \ k end{Bmatrix}*k ]

    也可以写成:

    [S(n,k)=S(n-1,k-1)+S(n-1,k)*k ]

    性质

    1. (S(0,0)=1)
    2. (S(n,0)=0,n>0)
    3. (S(n,n)=1)
    4. (S(n,2)=S(n-1,1)+S(n-1,2)*2=1+S(n-1,2)*2=2^{n-1}-1)
    5. (S(n,n-1)=C_n^2)
    6. (S(n,n-2)=C_n^3+3C_n^4) 简单巧妙的证明:我们分成两种情况,把(n)个不同的元素分成(n-2)个集合有两种情况,分别是有一个集合有三个元素和有两个集合有两个元素。对于前者,我们选出三个元素为一个集合,其他的各成一个集合,这种情况的方案数就是(C_n^3)。对于后者,先选出四个元素来,考虑怎么分配。当其中一个元素选定另一个元素形成同一个集合时,这种情况就确定了,所以是(3C_n^4)。加法原理计算和即得证。
    7. (S(n,3)=frac{1}{2}(3^{n-1}+1)-2^{n-1}) 数学归纳法
    8. (S(n,n-3)=C_n^4+10C_n^5+15C_n^6) 同性质六

    通项公式:

    [S(n,m)=frac{1}{m!} sum _{k=0}^m (-1)^kC_m^k(m-k)^n ]

    大概就是容斥原理,(k)枚举有多少个集合是空的,每种情况有(C_m^k)种空集情况,(n)个元素可以放进非空的(m-k)个集合中。这样求出来的答案是有序的,所以我们除以(m!)使得其变为无序。

    此公式更直接的推导,可以使用生成函数,这篇文章 中给出了其中一种生成函数的推导方法。

  • 相关阅读:
    [置顶] java 通过classloader加载类再通过classforname实例化
    Linux内核源代码解析——用户发送数据包的起源之sendto
    POJ 2774 Long Long Message&&HDU 1403 Longest Common Substring&&COJ 1203
    add-two-numbers-ii
    【转载】React初学者入门须知
    【Todo】【转载】ES6的学习记录
    【转载】Java中如何写一段内存泄露的程序 & ThreadLocal 介绍和使用
    【Todo】深入理解Javascript系列
    【转载】什么是优秀技术团队
    【转载】React入门-Todolist制作学习
  • 原文地址:https://www.cnblogs.com/owenyu/p/6724661.html
Copyright © 2011-2022 走看看