zoukankan      html  css  js  c++  java
  • 组合数学

    封面图片

    无重排列与组合

    • 排列(Permutation)一般只等是从(n)个不同的元素中取出(r)个不重复的元素,按照一定的次序排列,通常称为(n)个中取(r)个的无重排列,通常记为(P_n^r).

    • 组合(Combination)一般指的是从(n)个元素中取出(r)个不相同的元素,组成一子集,而不考虑元素之间的顺序关系,通常称为(n)个中取(r)个的无重组合,记做(C_n^r).

        对于排列和组合计数最经典的模型是往盒子里面放小球.

        对于排列(P_n^r),将(n)个不同的小球放入到(r)个不同的盒子中.从盒子的角度分步来考虑,首先对于第一个盒子选择放小球,有(n)个小球可以选择,然后处理将(n-1)个盒子放入到(r-1)个盒子中,这里允许一个盒子只能放一个小球,.于是得到(P_n^r=n*P_{n-1}^{r-1})这个递推公式.如果从小球的角度考虑,选择第一个小球如果放,那么有(r)个盒子可以放置,同时要处理剩下的(n-1)个小球放入到(r-1)个盒子中;如果第一个小球不被选中,那么要处理的问题就是从(n-1)个小球中选择(r)个放入到盒子中去,并且每个盒子一个小球.于是可以得到(P_n^r=r*P_{n-1}^{r-1}+P_{n-1}^r).

        在组合的小球盒子模型中盒子是完全一样的没有区别,可以先假定盒子是有区别的,对盒子进行编号,则盒子的排列中共有(r!)种,此时就对应前面排列盒子完全不同的情况.于是可以得到(r!C_n^r=P_n^r),从何得到:

    [C_n^r = frac{P_n^r}{r!} ]

        有组合的定义可以知道,从(n)个中选择(r)个的数目与从(n)个中选择(n-r)个的数目是相同的,因为选择(r)个后,剩下的就恰好是(n-r),即(C_n^r = C_n^{n-r}).

    关于组合数还有一个公式:(C_n^l cdot C_l^r = C_n^r cdot C_{n-r}^{l-r}).意思是从(n)个中选择(l)个元素,再从这(l)个元素选择(r)个元素的数目等于先从(n)个元素中选择(r)个,在从剩下的(n-r)中选择剩下的(l-r)个.


    这明显是一条分割线,明天再写2020年7月7日23:57:53.


        组合数的另外一个应用模型是格路模型,从((0,0))走到((m,n)),在不能回退的情况下,总共有多少种走法,总共有(C_{m+n}^m)中.基于各路模型还可以得到关于组合数的另外一个恒等式,总共可以走(n)步,最后要求抵达((n-r,r))这个位置,那么这个位置的前一个位置只有两种选择 ((n-r-1,n))((n-r,r-1)),从而可以得到(C_n^r=C_{n-r-1}^r+C_{n-r}^{r-1}).

        二项式定理也是组合数的一个应用.对于

    [egin{matrix} (a+b)^n= underbrace{(a+b)cdot(a+b) cdots (a+b)} \ n \ = C_n^0a^n+C_n^1a^{n-1}b+cdots+C_n^{n-1}ab^{n-1}+C_n^nb^n end{matrix} ]

    表示从(n)((a+b))中每一个选择一个(a)(b)得到的(ab)的数目,如果从(n)个中选择出(r)(b),则(a^{n-r}b^r)的系数应该就是(C_n^r).特别的,当(a,b)取特殊值时可以得到下面两个等式.

    • (a=b=1)
      (2^n = C_n^0+C_n^1+cdots+C_n^r+cdots+C_n^{n-1}+C_n^n)
    • (a=1,b=-1)
      (0=C_n^0-C_n^1+cdots+(-1)^rC_n^r+cdots+(-1)^nC_n^n).

    最后,关于组合式的一个有名恒等式: (Chu-Vandermonde)恒等式

    (C_{m+n}^r=C_m^0C_n^r+C_m^1C_n^{r-1}+cdots+C_m^rC_n^0)

    这个恒等式可以用取小球来简单的解释,假设有(m)个红球,(n)个蓝球,从这个(m+n)个球中选择出(r)个,利用分类,可以知道,等价于选择(0)个红球(r)个蓝球,(1)个红球(r-1)个蓝球,(dots)这些选择之和,而对每一个选择采用的应该是分步原理.

    可重组合计数

        对于(r)个小球,小球之没有区别,认为是一样的,但是(n)个盒子是有区别的,对于每一个盒子允许放多个小球,允许盒子为空盒子.

        在前面的不可重组合中,(n)个小球是不同的,但是(r)个盒子是相同的,并且每个盒子只允许放一个小球.

        从集合(A={1,2,3,dots, n})中选择(r)个元素({a_1,a_2,dotsb,a_r},a_iin A,i=1,2,dotsb,r)并且允许(a_i=a_j,i e j),记做(overline{C_n^r}).并且(overline{C_n^r}=C_{n+r-1}^r).

        可以将其转化成门框分隔问题,有(r)个相同的球,放到(n)个不同的区域中,其中每个区域可以放多个或者不放小球,需要(n-1)个框来分割出这个(n)个区域,将小球看做(0),将框看做(|),那么:

    [egin{matrix} r \ overbrace{0cdots0 underbrace{|0cdots0|cdots|}0cdots0} \ n end{matrix} ]

        这里面的框(|)和小球(0)都是没有标记彼此相同的,将问题转化为求(n)个相同的(|)(r)个相同的(0)的间错排列问题,假设它们彼此不同,于是这个问题就相当于求(n-r+1)的全排列,然后剔除(0)(|)相同的情况,于是得到:

    [frac{(n+r-1)!}{r!(n-1)!}=C_{n+r-1}^r=overline{C_n^r} ]

        可重组合的一个应用是线性方程的整数解问题.线性方程(x_1+x_2+cdots+x_n=r)的非负整数解的个数是(C_{n+r-1}^r).这里把(+)看做隔板,将(r)个小球放到(n)个区域中,每个区域可放多个也可不放小球,于是就是一个可重组合计数的问题.

        关于是否重复排列组合计数的总结:

    Type Sample Order counts? Repetition allowed Number ofways
    无重组合 n个求取r个 No No (C_n^r)
    无重排列 n个人找r个人排队 Yes No (P_n^r)
    可重排列 n中水果选择r个拼果篮 No Yes (C_{n+r-1}^r)
    可重排列 n个字母组成的r位串 Yes Yes (n^r)
    多重全排列 (r_1)个a,(r_2)个b组成的n位串 Yes Yes $$frac{n!}{{r_1}!{r-2}!}$$

    放球问题计数的八种模型

    (n)个球放到(m)个盒子中,根据球和盒子是否有区别,是否允许空盒,有下面这些情况:

    Type Number of ways
    n个球有区别,m个盒子有区别,有空盒 (m^n)
    n个球有区别,m个盒子有区别,无空盒 (n!S(n,m))
    n个球有区别,m个盒子无区别,有空盒 $$sum_{k=1}^{min{n,m}}{S(n,k)}$$
    n个球有区别,m个盒子无区别,无空盒 (S(n,m))
    n个球无区别,m个盒子有区别,有空盒 (C_{n+m-1}^r)
    n个球无区别,m个盒子有区别,无空盒 (C_{n-1}^{n-m}=C_{n-1}^{m-1})
    n个球无区别,m个盒子无区别,有空盒 $$G(x)=frac{1}{(1-x)(1-x^2)cdots(1-x^m)}$$中(x^n)项的系数
    n个球无区别,m个盒子无区别,无空盒 $$G(x)=frac{x^m}{(1-x)(1-x^2)cdots(1-x^m)}$$中(x^n)项的系数

    母函数

        对于一个计数序列:
    (qquad G(x) = c_0+c_1x+c_2x^2+cdots+c_rx^r+cdots)
    函数(G(x)),称作序列(c_0,c_1,cdots,c_r,cdots)的母函数,母函数也称作生成函数,用来表示一个计数序列.

    母函数就是一列用来表示一串数字序列的挂衣架.

        母函数的一个应用是给出(m)个骰子,计算点数之和为(n)的数目,对应的(G(x)=(x+x^2+x^3+x^4+x^5+x^6)),点数为(n)的数目即是展开后(x^n)的系数.

    整数拆分

        将一个正整数拆分为若干正整数之和,如果拆分的各部分之间有序称为有序拆分,否则称为无序拆分.等价于有(n)个相同的小球,将这些相同的小球分成若干堆,总共有多少种分法.

        对于有序拆分,(n)个小球分成(r)堆,(n)个小球紧密相邻,中间有(n-1)个空隙,选择(r-1)个插入一个隔板,从而可以把这(n)个小球分成(r)份,从而结果就是(C_{n-1}^{r-1}).相当于将(n)个无区别的求放到(r)个有区别的盒子中,并且每一个盒子不允许空.

        对于正整数的无序拆分,数字之间无顺序并且允许重复,它的个数是(p(n)).欧拉给出的这个问题的解是利用母函数:
    (G(x)=(1+x+x^2+cdots)(1+x^2+x^4+cdots)cdots(1+x^m+x^{2m}+cdots)cdots)展开式中(x^n)的系数就是拆分解的数目.

        另外,(frac{1}{1-x})的无穷级数展开是((1+x+x^2+cdots)),所以上面的(G(x)),可以记做:

    [G(x) = frac{1}{(1-x)(1-x^2)cdots(1-x^m)cdots} ]

    (p(n))就是(G(x))展开式中(x^n)的系数.对青前面放球无区别的球放入无区别的盒子中并且允许盒子为空.

        对于上面放球问题中球和盒子都相同并且不允许空盒时,可以首先选择往每一个盒子放一个球,然后往从剩下的(n-m)个求进行上面那种允许空盒的放置,此时应该对应(G(x))的展开式中(x^{n-m})的系数.

    Stirling数

    第一类Stirling数(s(n,k))

        (n)个人条集体舞,分成(m)个圆环的方法的数目.

    [egin{aligned} s(n,0)&=0,s(1,1)=1 \ s(n+1,m) &= s(n,m-1) + ncdot s(n,m) end{aligned} ]

    对于第(n+1)个人,它可以自己跳舞,剩下的(n)个人构成(m-1)个圆环;或者加入到已有的队伍中去,总共有(n)种选择.

    第二类stirling数(S(n,k))

        相当于将(n)个不同的小球放到(m)个无区别的盒子中并且不允许盒子为空,求放球的数目.可以先考虑解决盒子有区别,并且每一个盒子不空,然后通过除以(m!)得到无区别的数目.将(n)个不同的小球放到(m)个不同的盒子中并且允许盒子空的方案数(|S|=m^n).设(A_i,i=1,2,3,cdots)表示第(i)个盒子为空则(A_i=(m-1)^n).,总共有(C_n^1)个;两个盒子为空,即(|A_icap A_j|=(m-2)^n),总共有(C_n^2)种;(cdots).由容斥原理:

    [egin{aligned} N &=|overline{A_1}capoverline{A_2}cap cdots cap overline{A_n}|\ & = m^n - C_n^1(m-1)^n + C_n^2(m-1) + cdots+ (-1)^rC_n^r(m-r)^n+cdots\ & = sum_{k=0}^n{(-1)^kC_n^k(m-k)^n} end{aligned} ]

    从而:

    [egin{aligned} S(n,m) = frac{1}{m!}sum_{k=0}^n{(-1)^k(m-k)^n} end{aligned} ]

    特别地:因为(S(m,m)=1),所以

    [m!=sum_{k=0}^m{(-1)^kC_m^k(m-k)^m}$$. *** 这是一条未完待更的分割线2020年7月8日15:21:31 ***]

  • 相关阅读:
    MySQL
    LeetCode
    数据结构
    我的编程幻想曲,更新中
    快速排序
    C与C++的区别
    必须要使用列表初始化的几种情况
    析构中delete this
    指向自身类型的成员指针的初始化,this不属于类对象的一部分
    构造函数
  • 原文地址:https://www.cnblogs.com/2018slgys/p/13264353.html
Copyright © 2011-2022 走看看