zoukankan      html  css  js  c++  java
  • 数学--数论-多重集排列组合与母函数

    一、无重复元素的排列组合定义

    排列,英文名为Permutation,是指从某元素集合中取出指定个数的元素进行排序
    组合,英文名为Combination,是指从某元素集合中仅仅取出指定个数的元素,不考虑排序

    从有n个不同元素的集合任取r个元素的排列方式有:
    P(n,r)=n(n1)...(nr+1)=n!/(nr)!,P(n,n)=n!P(n, r) = n*(n-1)*...*(n-r+1) = n! / (n-r)!,特别地 P(n,n) = n!

    从有n个不同元素的集合任取r个元素的组合方式有:
    C(n,r)=P(n,r)/r!=n!/((nr)!r!)C(n,n)=1C(n, r) = P(n, r) / r! = n! / ( (n-r)! * r!),特别地C(n,n) = 1

    二、多重集合(multiset)的排列组合

    设多重集合 S=n1a1,n2a2,...,nkak     n=n1+n2+...+nkS = { n1 * a1, n2 * a2, ..., nk * ak } n = n1 + n2 + ... + nk

    即集合 S 中含有n1个元素a1, n2个元素a2,…,nk个元素ak,ni被称为元素ai的重数,k成为多重集合的类别数

    在 S 中任选 r 个元素的排列称为S的r排列,当r = n时,有公式
    P(n;n1a1,n2a2,...,nkak)=n!/(n1!n2!...nk!)P(n; n1*a1, n2*a2, ..., nk*ak) = n! / (n1! * n2! * ...* nk!)

    在 S 中任选 r 个元素的组合称为S的r组合,当r<=任意ni时,有公式
    C(n;n1a1,n2a2,...,nkak)=C(k+r1,r)C(n; n1*a1, n2*a2, ..., nk*ak) = C(k+r-1, r)

    由公式可以看出多重集合的组合只与类别数k 和选取的元素r 有关,与总数无关!

    三、多重集合问题的转化例子

    例1:线性方程 x1 + x2 + … + xk = r 一共有多少组非负整数解?

    解答:上述不定方程的非负整数解对应于下述排列

    1…101…1 01…1 0 … 01…1

    x1 个 x2 个 x3 个 … xk 个

    其中 k-1个 0 将 r 个 1 分成k段, 每段含1的个数分别为 x1, x2, …, xk,

    很明显这个排列是多重集合 S = { r * 1, (k-1)* 0 }的全排列

    即:P(r+k-1; r*1, (k-1)*0) = (r+k-1)! / ( r! * (k-1)! ) = C( r+k-1, r),即从k类元素中选r个的种类

    例二:某车站有6个入口处,每个入口处每次只能进一个人, 一组9个人进站的方案有多少?

    解答:进站方案可以表示为

    1 011 011 01 011 01

    g1 g2 g3 g4 g5 g6

    其中 1 表示不同的人, 而 0 表示门框, 6-1= 5个门框将序列分为六段,

    则任意进站方案可表示成上面 14 个元素 S = { 5 * 1, 1 * p1, 1 * p2, …, 1 * p9 }的一个排列

    即:P(5+9;51, 1p1, 1p2, …, 1p9) = 14! / ( 5! * 1! * … 1! ) = 14! / 5!

    例三、求从(0,0)点到(m,n)点的非降路径数

    解答:无论哪条路径,必须在x方向上走m步,y方向上走n步,将非降路径数与多重集合 S = { m * x, n * y } 的排列建立一一对应关系,所以格路总数为 P(m+n; mx, ny) = (m+n)! / ( m! * n! ) = C(m+n, n) = C(m+n, m)

    一般地,设c>=a, d>=b,则由(a,b)到(c,d)的非降路径数为C(c-a+d-b, c-a)

    扩展问题: 在上例基础上若设m<n,求点(0,1)到点(m,n)不接触对角线 y=x的非降路径数据(接触包括穿过)

    解答:从(0,1)到(m,n)的非降路径,有的接触 y=x,有的不接触,对于每条接触 y=x的非降路径,做(0,1)关于y=x的对称点(1,0)到(m,n)的对称非降路径,容易看出从(0,1)到(m,n)接触y=x的非降路径与 (1,0)到(m,n)的非降路径(必穿过y=x)一一对应,

    故所求的非降路径数为 C(m+n-1, m) - C(m+n-1, m-1)

    例四、将r个相同的小球放入n个不同的盒子,总共有多少种方案?

    解答:该问题可以转化为r个相同的小球与n-1个相同的盒壁的排列问题

    1…1 0 1…1 0 1…1 0 … 0 1…1

    其中有 n-1个 0 分成 n段,每段表示不同的盒子, 每段中1的个数表示该盒子里放入的小球总数,总共r个1

    即:P( r+n-1; r*1, (n-1)*0 ) = (r+n-1)! / ( r! * (n-1)! ) = C( r+n-1, r)

    例五、求集合 X = { 1,2,…, n }的不含相邻整数的k元子集个数

    解答:任意一个X的k元子集s都可以对应于一个由0,1组成的有序n重组(a1 a2 … an),其中 ai = 1 当 i属于s,否则 ai = 0,当i不属于s,由于s中不含相邻整数,所以在此n重组中没有两个1是相邻的,所以子集s是与这样的n重组 S = { k*1, (n-k)*0 }之间是一一对应的,由于任意两个1彼此不相邻,故可以把(n-k)个0依次排列,然后在(n-k+1)个空隙中插入k个1,所以从(n-k+1)个空隙中选择k个位置来放置1,有 C(n-k+1, k) 种选法,这也是原问题所对应的答案。

    四、母函数
    生成函数(母函数)有普通生成函数和指数生成函数:
    1.普通生成函数用于解决多重集的组合问题

    2.指数型母函数用于解决多重集的排列问题

    母函数可以解决递归数列的通项问题:斐波那契数列、卡特兰数列等

    普通母函数:
    构造母函数G(x), G(x) = a0 + a1x + a2 + a3* +…+ an*, 则称G(x)是数列a0,a1…an的母函数。

    通常普通母函数用来解多重集的组合问题,其思想就是构造一个函数来解决问题,一般过程如下:

    1.建立模型:

    物品n种,每种数量分别为k1,k2,…kn个,每种物品又有一个属性值p1,p2,…pn,(如本题的字母价值),求属性值和为m的物品组合方法数。(若数量ki无穷 也成立,即对应下面式子中第ki项的指数一直到无穷)

    2.构造母函数:

    G(x)=(1++…)(1+++…)…(1+++…) (一)

    =a0 + a1x + a2 + a3* +…+ akk* (设kk=k1·p1+k2·p2+…kn·pn) (二)

    G(x)含义: ak 为属性值和为k的组合方法数。

    母函数利用的思想:
    1.把组合问题的加法法则和幂级数的乘幂对应起来。

    2.把离散数列和幂级数对应起来,把离散数列间的相互结合关系对应成为幂级数间的运算关系,最后由幂级数形式来 确定离散数列的构造。

    代码实现:
    求G(x)时一项一项累乘。先令G=1=(1+0x+0+…0*),再令G=G*(1++…)得到形式(二)的式子…最后令G=G*(1+++…)。
    下面是指数型母函数的定义:

    在这里插入图片描述
    在这里插入图片描述

    对于上面的问题“假设有8个元素,其中a1重复3次,a2重复2次,a3重复3次。从中取r个组合,求其组合数。”:

    (感谢 3Dnn 同学指出,下图的 28/3! 应该改为 26/3!)
    在这里插入图片描述

    引用博客1
    引用博客2
    引用博客3

  • 相关阅读:
    神奇玻璃制品:鲁珀特之泪
    ReCaptcha——基于验证码的数据挖掘
    GCC 编译使用动态链接库和静态链接库
    转:Android View.post(Runnable )
    两个adb命令使用的问题
    转:android menu 实现动态修改menu
    Android Dialog自定义
    转:ActivityGroup + GridView 实现Tab分页标签
    TabHost与ActivityGroup整理
    转:Android之Tab分页标签的实现方法一TabActivity和TabHost的结合
  • 原文地址:https://www.cnblogs.com/lunatic-talent/p/12798511.html
Copyright © 2011-2022 走看看