程序员社区

【组合数学】排列组合 ( 多重集排列 | 多重集全排列 | 多重集非全排列 所有元素重复度大于排列数 | 多重集非全排列 某些元素重复度小于排列数 )

文章目录

  • 一、多重集
  • 二、多重集全排列
  • 三、多重集全排列示例
  • 三、多重集非全排列 1 所有元素重复度大于排列数 (

    n

    i

    r

    n_i \geq r

    nir )

  • 四、多重集非全排列 2 某些元素重复度小于排列数 (

    n

    i

    r

    n_i \leq r

    nir )

排列组合参考博客 :

  • 【组合数学】基本计数原则 ( 加法原则 | 乘法原则 )
  • 【组合数学】集合的排列组合问题示例 ( 排列 | 组合 | 圆排列 | 二项式定理 )
  • 【组合数学】排列组合 ( 排列组合内容概要 | 选取问题 | 集合排列 | 集合组合 )
  • 【组合数学】排列组合 ( 排列组合示例 )

一、多重集


多重集表示 :

S

=

{

n

1

a

1

,

n

2

a

2

,


,

n

k

a

k

}

,

   

0

n

i

+

S = \{ n_1 \cdot a_1 , n_2 \cdot a_2 , \cdots , n_k \cdot a_k \} , \ \ \ 0 \leq n_i \leq +\infty

S={n1a1,n2a2,,nkak},   0ni+

  • 元素种类 : 多重集中含有

    k

    k

    k 种不同的元素 ,

  • 元素表示 : 每个元素表示为

    a

    1

    ,

    a

    2

    ,


    ,

    a

    k

    a_1 , a_2 , \cdots , a_k

    a1,a2,,ak ,

  • 元素个数 : 每个元素出现的次数是

    n

    1

    ,

    n

    2

    ,


    ,

    n

    k

    n_1, n_2, \cdots , n_k

    n1,n2,,nk ,

  • 元素个数取值 :

    n

    i

    n_i

    ni 的取值要求是 大于

    0

    0

    0 , 小于正无穷

    +

    + \infty

    + ;

二、多重集全排列


多重集 :

S

=

{

n

1

a

1

,

n

2

a

2

,


,

n

k

a

k

}

,

   

0

n

i

+

S = \{ n_1 \cdot a_1 , n_2 \cdot a_2 , \cdots , n_k \cdot a_k \} , \ \ \ 0 \leq n_i \leq +\infty

S={n1a1,n2a2,,nkak},   0ni+

★ 全排列 :

r

=

n

1

+

n

2

+

+

n

k

=

n

r = n_1 + n_2 + \cdots + n_k = n

r=n1+n2++nk=n

N

=

n

!

n

1

!

n

2

!

n

k

!

N = \cfrac{n!}{n_1! n_2! \cdots n_k!}

N=n1!n2!nk!n!

多重集的全排列数是 元素总数阶乘 , 除以 所有重复度的阶乘 ;

下面是推导过程

k

k

k 种元素 ,

放置元素

a

1

a_1

a1 : 在排列中先放第一种元素

a

1

a_1

a1 , 该元素有

n

1

n_1

n1 个 ,

n

n

n 个位置中选出

n

1

n_1

n1 个 位置 , 有

C

(

n

,

n

1

)

C(n, n_1)

C(n,n1) 种方法 ;

C

(

n

,

n

1

)

=

n

!

(

n

n

1

)

!

 

n

1

!

C(n, n_1) = \cfrac{n!}{(n-n_1) ! \ n_1!}

C(n,n1)=(nn1)! n1!n!

放置元素

a

2

a_2

a2 : 放置好

n

1

n_1

n1 之后放置第二种元素

a

2

a_2

a2 , 该元素有

n

2

n_2

n2 个 , 此时还有

n

n

1

n-n_1

nn1 个空位 ,

n

1

n-1

n1 个位置中选择

n

2

n_2

n2 个位置有

C

(

n

n

1

,

n

2

)

C(n-n_1 , n_2)

C(nn1,n2) 种方法 ;

C

(

n

n

1

,

n

2

)

=

(

n

n

1

)

!

(

n

n

1

n

2

)

!

 

n

2

!

C(n - n_1, n_2) = \cfrac{(n-n_1)!}{(n-n_1 - n_2) ! \ n_2!}

C(nn1,n2)=(nn1n2)! n2!(nn1)!

\vdots

放置元素

a

k

a_k

ak : 放置最后一个元素

a

k

a_k

ak , 该元素有

n

k

n_k

nk 个 , 此时还有

n

n

1

n

k

1

n-n_1- \cdots -n_{k-1}

nn1nk1 个空位 ,

n

n

1

n

k

1

n-n_1- \cdots -n_{k-1}

nn1nk1 个位置中选择

n

k

n_k

nk 个位置有

C

(

n

n

1

n

k

1

,

n

k

)

C(n-n_1- \cdots -n_{k-1} , n_k)

C(nn1nk1,nk) 种方法 ;

C

(

n

n

1

n

k

1

,

n

k

)

=

(

n

n

1

n

k

1

)

!

(

n

n

1

n

k

1

n

k

)

!

 

n

k

!

C(n-n_1- \cdots -n_{k-1} , n_k) = \cfrac{(n-n_1- \cdots -n_{k-1})!}{(n-n_1- \cdots -n_{k-1} - n_k) ! \ n_k!}

C(nn1nk1,nk)=(nn1nk1nk)! nk!(nn1nk1)!

乘法法则 : 最后根据乘法法则 , 将上述每个放置方法乘起来 , 就得到最终的结果 , 阶乘看起来很复杂 , 但是 阶乘选项如

(

n

n

1

n

k

1

)

!

(n-n_1- \cdots -n_{k-1})!

(nn1nk1)! 都可以约掉 , 最终结果如下 :

N

=

C

(

n

,

n

1

)

C

(

n

n

1

,

n

2

)

C

(

n

n

1

n

k

1

,

n

k

)

=

n

!

(

n

n

1

)

!

 

n

1

!

×

(

n

n

1

)

!

(

n

n

1

n

2

)

!

 

n

2

!

×

(

n

n

1

n

k

1

)

!

(

n

n

1

n

k

1

n

k

)

!

 

n

k

!

   

=

n

!

n

1

!

n

2

!

n

k

!

\begin{array}{lcl} N & = & C(n, n_1) C(n - n_1, n_2) C(n-n_1- \cdots -n_{k-1} , n_k) \\\\ & = & \cfrac{n!}{(n-n_1) ! \ n_1!} \times \cfrac{(n-n_1)!} {(n-n_1 - n_2) ! \ n_2!} \times \cfrac{(n-n_1- \cdots -n_{k-1})!}{(n-n_1- \cdots -n_{k-1} - n_k) ! \ n_k!} \ \ \ 约掉部分阶乘 \\\\ &=& \cfrac{n!}{n_1! n_2! \cdots n_k!} \end{array}

N===C(n,n1)C(nn1,n2)C(nn1nk1,nk)(nn1)! n1!n!×(nn1n2)! n2!(nn1)!×(nn1nk1nk)! nk!(nn1nk1)!   n1!n2!nk!n!

三、多重集全排列示例


求多重集

S

=

{

3

a

,

2

b

,

1

c

}

S=\{ 3 \cdot a , 2 \cdot b , 1 \cdot c \}

S={3a,2b,1c} 的全排列 ?

上述多重集元素总个数是

n

=

3

+

2

+

1

=

6

n = 3 + 2 + 1 = 6

n=3+2+1=6 ;

全排列个数是 :

N

=

6

!

3

!

×

2

!

×

1

!

=

6

×

5

×

4

×

3

×

2

×

1

(

3

×

2

×

1

)

×

(

2

×

1

)

×

(

1

×

1

)

=

60

N = \cfrac{6!}{3! \times 2! \times 1!} = \cfrac{6 \times 5 \times 4 \times 3 \times 2 \times 1}{( 3 \times 2 \times 1 ) \times ( 2 \times 1 ) \times (1 \times 1)} = 60

N=3!×2!×1!6!=(3×2×1)×(2×1)×(1×1)6×5×4×3×2×1=60

三、多重集非全排列 1 所有元素重复度大于排列数 (

n

i

r

n_i \geq r

nir )


多重集 :

S

=

{

n

1

a

1

,

n

2

a

2

,


,

n

k

a

k

}

,

   

0

n

i

+

S = \{ n_1 \cdot a_1 , n_2 \cdot a_2 , \cdots , n_k \cdot a_k \} , \ \ \ 0 \leq n_i \leq +\infty

S={n1a1,n2a2,,nkak},   0ni+

★ 非全排列情况

1

1

1 :

r

n

i

r \leq n_i

rni , 注意这里的

r

r

r 要 小于等于 最小的

n

i

n_i

ni ;

N

=

k

r

N = k^r

N=kr

推导过程 :

在上述条件下 ,

r

r

r 个位置 ,

每个位置的元素都有

k

k

k 种选择 ,

根据乘法法则 , 总的选择个数是

k

×

k

×

×

k

r

k

\begin{matrix} \underbrace{ k \times k \times \cdots \times k } \\ r 个 k \end{matrix}




k×k××k
rk
,

r

k

r^k

rk ;

四、多重集非全排列 2 某些元素重复度小于排列数 (

n

i

r

n_i \leq r

nir )


上述情况只适用于重复度足够大的情况 , 即 每个元素的重复度都大于选取个数 ,

r

n

i

r \leq n_i

rni

如果 有一个元素的重复度小于选取个数 ,

r

n

i

r \geq n_i

rni ,

S

=

{

3

a

,

2

b

,

1

c

}

S=\{ 3 \cdot a , 2 \cdot b , 1 \cdot c \}

S={3a,2b,1c} 多重集的三排列 , 就无法使用公式计算了 ,

没有公式可以计算 , 但是可以 使用 包含排斥原理 , 生成函数 进行计算 ;

赞(0) 打赏
未经允许不得转载:IDEA激活码 » 【组合数学】排列组合 ( 多重集排列 | 多重集全排列 | 多重集非全排列 所有元素重复度大于排列数 | 多重集非全排列 某些元素重复度小于排列数 )

相关推荐

  • 暂无文章

一个分享Java & Python知识的社区