前言
排列和组合是组合学基本概念。
难学只是因为概念上比较难理解,没有对排列和组合形成的实体感受。
做个小实验:
1个盒子,盒子里放置4个带编号球,一定是带编号的球。
什么是排列,在盒子依次取出2个球的不同结果共有12种。
A
4
2
=
4
!
(
4
−
2
)
!
=
4
∗
3
∗
2
∗
1
2
∗
1
=
12
A_4^2=\frac {4!}{(4-2)!}=\frac {4*3*2*1}{2*1}=12
A42=(4−2)!4!=2∗14∗3∗2∗1=12
什么是组合,在盒子依次取出2个球的不同结果组合共有6种。
C 4 2 = A 4 2 A 4 4 = 4 ! ( 4 − 2 ) ! 2 ! = 4 ! ( 4 − 2 ) ! 2 ! = 4 ∗ 3 ∗ 2 ∗ 1 2 ∗ 1 ∗ 2 ∗ 1 = 6 C_4^2=\frac {A_4^2}{A_4^4}=\frac {\frac {4!}{(4-2)!}} {{2!}}=\frac {4!}{(4-2)!2!}=\frac {4*3*2*1}{2*1*2*1}=6 C42=A44A42=2!(4−2)!4!=(4−2)!2!4!=2∗1∗2∗14∗3∗2∗1=6
单学排列,单学组合都不难,但是因为两者数学概念定义严谨复杂,大家搞不懂概念,很难学。
我有一个简单方法动手做实验,买些兵乓球
先介绍分类相乘原理——介绍排列定义——用分步相乘原理理解排列——通过排列理解分组。
一、分步乘法原理
1.定义
定义:做一件事,完成它需要n个步骤,在第1步骤中有m1种的方法;第2步骤中有m2种不同的方法…第m步骤中mn种不同的方法,那么完成这件事情共有m1xm2x…xmn种不同方法。
方法总数
=
每一步骤的方法数的积
=
m
1
∗
m
2
∗
.
.
.
m
n
方法总数=每一步骤的方法数的积=m_1*m_2*...m_n
方法总数=每一步骤的方法数的积=m1∗m2∗...mn
2.举例
举例:从广州出发要经过中转站上海再去北京。
要完成这件事,有两个步骤
第一步骤:从广州坐动车去上海;从广州坐火车去上海;从广州坐飞机去上海(共3种方法)
第二步骤:从上海坐动车去北京;从上海坐飞机去北京(共2种方法)
按照分步乘法原则,要完成这件事,有2*3=6种方法。
二、排列
1.定义
从n个不同元素中,任取m(m≤n)个元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列。简单来说,
从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,记做
A
n
m
A_n^m
Anm
2.计算公式
A n m = n ! ( n − m ) ! A_n^m=\frac {n!}{(n-m)!} Anm=(n−m)!n!
3.举例分析
问题:盒子里有3个球分别标上a,b,c号,现在依次取出2个球组成排列,请问有多少种排列?
穷举法:
(a,b)(a,c)
(b,a)(b,c)
(c,a)(c,a)
注意是依次,
按照分步骤完成这件事情:
第1步骤:盒子有3个球,抽取出1个球,有3种情况。
第2步骤:现在盒子有2个球,抽取出1个球有2种情况。
根据分步相乘原理:3x2=6
A
3
2
=
3
∗
2
=
6
A_3^2=3*2=6
A32=3∗2=6
4.公式推导过程
按照定义,排列数是等于从n到n-(m-1)之间所有数相乘的积(共有m项)。
所以有公式一(乘数版):
A
n
m
=
n
∗
(
n
−
1
)
(
n
−
2
)
.
.
.
(
n
−
(
m
−
1
)
)
A_n^m=n*(n-1)(n-2)...{(n-(m-1))}
Anm=n∗(n−1)(n−2)...(n−(m−1))
实际上,我们对于计算一些简单A(6,2)、A(5,4)这些乘数项数很少的排列数直接使用定义就是公式一:
A
6
2
=
6
∗
5
=
30
A_6^2=6*5=30
A62=6∗5=30
A
5
4
=
5
∗
4
∗
3
∗
2
=
120
A_{5}^4=5*4*3*2=120
A54=5∗4∗3∗2=120
但是排列数计算数字很大就需要用阶乘版计算公式,这是我们常用的公式。(科学计算器上阶乘运算,大的数直接可以摁计算器来计算)
阶乘定义,从1相乘到n的积就是n的阶乘。如:
3!=3x2x1=6;
4!=4x3x2x1=24;
公式是n!=n*(n-1)*…*1。
我们通过排列数公式一(乘数版),推导排列数公式二(阶乘版):
第一步把最后一项括号去掉:(n-(m-1))=(n-m+1))
A
n
m
=
n
∗
(
n
−
1
)
.
.
.
(
n
−
(
m
−
1
)
)
=
n
∗
(
n
−
1
)
.
.
.
(
n
−
m
+
1
)
)
A_n^m=n*(n-1)...{(n-(m-1))}= n*(n-1)...(n-m+1))
Anm=n∗(n−1)...(n−(m−1))=n∗(n−1)...(n−m+1))
第二步:分子分母都乘上(n-m)!
分子被凑成n!
即n*(n-1)…(n-m+1)(n-m)…1=n!
这样我们就推导出公式二(阶乘版):
A n m = n ∗ ( n − 1 ) . . . ( n − m + 1 ) ( n − m ) . . . 1 ( n − m ) . . . 1 = n ! ( n − m ) ! A_n^m=\frac {n*(n-1)...(n-m+1)(n-m)...1}{(n-m)...1}= \frac {n!}{(n-m)!} Anm=(n−m)...1n∗(n−1)...(n−m+1)(n−m)...1=(n−m)!n!
三、组合
1.定义
组合(combination):从n个不同元素中每次取出m个不同元素(0≤m≤n),不管其顺序合成一组,称为从n个元素中不重复地选取m个元素的一个组合。所有这样的组合的总数称为组合数,
2.计算公式
C n m = A n m A m m = n ! ( n − m ) ! m ! = n ! ( n − m ) ! m ! C_n^m=\frac {A_n^m}{A_m^m}=\frac {\frac {n!}{(n-m)!}} {{m!}}=\frac {n!}{(n-m)!m!} Cnm=AmmAnm=m!(n−m)!n!=(n−m)!m!n!
3.举例分析
盒子有3个球:A、B、C,取出2个球有多少种组合方法。
穷举法:
AB AC BC 共三种组合
组合的有多少种方法怎么理解。虽然可以举例,但是想要直接把内在原理说清楚,做不到,这里可以用组合的公式借助排列来倒推理解。
C
n
m
=
A
n
m
A
m
m
C_n^m=\frac {A_n^m}{A_m^m}
Cnm=AmmAnm
假如取2个球按照1个个来取,那么
A
3
2
=
3
∗
2
A_3^2=3*2
A32=3∗2
结果是AB AC BA BC CA CB 六种方法
按照组合的概念,不按顺序,那么AB和BA、AC和CA、CB和BC两两相同。
就是抽取出来6种方法,实际上结果是进行两两排列。
A
2
2
=
2
∗
1
=
2
A_2^2=2*1=2
A22=2∗1=2
那么我们理解:求组合我们找到他们的排列6种方法,但是组合不按顺序,我们去掉不按顺序,去掉重复,用除法,除以2个球排列方法数。
C
3
2
=
A
3
2
A
2
2
=
3
∗
2
2
=
3
C_3^2=\frac {A_3^2}{A_2^2}=\frac {3*2}{2}=3
C32=A22A32=23∗2=3
这个理解很难,但是多演练就是慢慢明白。
比如:盒子4个球:ABCD,抽取2个,有多少种组合?
结果是:
AB AC AD
BC BD
CD
C
4
2
=
A
4
2
A
2
2
=
4
∗
3
2
=
6
C_4^2=\frac {A_4^2}{A_2^2}=\frac {4*3}{2}=6
C42=A22A42=24∗3=6
比如:盒子5个球:ABCDE,抽取3个,有多少种组合?
结果是:
AB AC AD AE
BC BD BE
CD CE
DE
C
5
3
=
A
5
3
A
3
3
=
5
∗
4
∗
3
3
∗
2
=
10
C_5^3=\frac {A_5^3}{A_3^3}=\frac {5*4*3}{3*2}=10
C53=A33A53=3∗25∗4∗3=10
4.其他一些规定和转换
我们规定了
C
n
0
=
1
C_n^0=1
Cn0=1
组合公式推导公式
C
n
m
=
C
n
n
−
m
C_n^m=C_n^{n-m}
Cnm=Cnn−m
怎么理解,盒子3个球,抽取2个的组合方法数,倒过来思考是不是等同于3个球留1个的组合方法。想不通就硬想,接不了就硬接。
C
3
2
=
C
3
1
C_3^2=C_3^1
C32=C31
总结
我在看python的hash()函数不太明白,找了数据结构书来看,然后又看到哈希表建立的思想描述,提到哈希表大小怎么测算,用到了组合思想,特此把排列这块知识也学了一遍。
第一次写太详细也太复杂,现在删掉一部分内容,删掉了分类相加原理解释,不展开排列组合的分堆问题,也删掉排列公式一如何记忆技巧。