计算机算法基础 ——数学(排列组合函数)

一 排列

1.从n个元素中取r个元素排列的全体数目

Pnr=P(n,r)=n(n-1)(n-2)...(n-r+1)=n!/(n-r)!                  :例:n个球取r个放入r个不同盒子,每个盒子一个球,多少种放法

2. n个元素的全排列

Pnn=P(n,n)=n!

3.例:随机选n(n<365)个人,求其中至少有两人生日相同的概率。

n个人的生日的序列数:365n

n个人生日均不相同的概率:P(365,n)

故:1-P(365,n)/365n

4.圆排列

从n个元素中取r个元素沿一圆周排列

Qnr = Pn/r  (取r个元素作排列的结果与圆排列的结果比较,每个排列重复了r次)

同理:Qnn = n!/n =(n-1)!

二 组合

1. Cnr :从n个元素中取r个元素排列而不考虑顺序;

如:n个球取r个放入r个盒子,r个盒子是相同的。

若在每种组合结果的基础对盒子排列,便得到n取r的排列,则:

Cnr r! = Pnr  故  Cnr = Pnr /r! = n!/(n-r)!r!

2 分组

有a1,a2...a8八位成员,两两配对,分成4组,试求方案N

方法一:依次选择: a1选择同样有7种选择,余下6人中一人,选择同样有5种选择,余下4个,其中一个选择同样有3种可能; N=7*5*3

方法二:全排列与分组(组内,组间):

将8个成员全排列,共8!种可能;若分成4组,{12}{34}{56}{78},若在组内位置互换,对于选择同样没有影响,则全排列中选择同样有重复,重复数:2n

同时,4组之间的排列也不影响同样关系,故全排列中对同样关系也有重复,重复数:4!

故得 8!/(2n*4!)

方法三:先分组,再组内

8个人分成4组,第1组有C82种选择,第2组有C62种选择,同理第3组有C42种选择; 且组的顺序无关

N= C82* C62*C42 * C22 /4! =105

3 允许重复的组合

定理1:在n个不同元素中取r个进行组合,允许重复(r个元素中元素是可重复的),组合数:Cn+r-1r

定理2:将r个无区别的球,放入n个有标志的盒子,每个盒子中可多于一个,则共有 Cn+r-1r 种方案

例:(x+y+z)共有多少项:

相当于 将4个球,放入3个盒子里,而且每个盒子中的数目不限。如 X4  可理解为将4个球都放入盒子X中。

N=C(n+r-1,r)=C(3+4-1,4)=C(6,4)=15

4 不相邻的组合

指:从序列A={1,2,....n}中取r个,其中不存在,i,i+1两个相邻数同时出现于一个组合中的组合。

定理: 从序列A={1,2,....n}中取r个作不相邻组合,其中组合数为:Cn-r-1r

三 母函数-幂级数

定义:设 a0,a1,a2...an是一个数列,定义它的母函数为幂级数                            ——————————解决元素重复的组合问题

fa(x)=(1+x)=C(a,0)X0 +C(a,1)X+C(a,2)X+C(a,3)X+.....+C(a,n)Xn+

母函数与其他母函数存在的关系式:

A(x)= 1/(1-x) = 1+X+X2+X+.....+Xn+

B(x)=1/(1-x)2 =A(x)/(1-x) = 1+2X+3X2+4X+.....+nXn-1

C(x)=1/(1-x)=B(x)/(1-x) = 1+3X+6X2+10X+.....+


应用:

例1:红球两个,白球,黄球各一个,试问有多少种不同的组合数

利用: fa(x)=(1+x)=C(a,0)X+C(a,1)X+C(a,2)X+C(a,3)X+.....+C(a,n)Xn+ 其中每一项 指数表示选择数,系数表示该该选择的方案数。

令r个球组合数为Cr,则 C0 , C1 , C2 , C3 , C4 的母函数:

G(x)=( 1+x+x)(1+x)(1+x)=1+3x+4x2+3x3+x4

1+x+x2  表示第红球选0个,选一个,选两个

共有:1+3+4+3+1=12种不同组合数。

由4x表示选2个球的组合数为4;3x表示选1个球的组合数

例2 :若有1g,2g,3g,4g的砝码各一枚,问能称出几种可能的重量。

利用: fa(x)=(1+x)=C(a,0)X+C(a,1)X+C(a,2)X+C(a,3)X+.....+C(a,n)Xn+ 其中每一项 指数表示重量,系数表示该重量的方案数。

母函数为:G(x)=(1+x)( 1+x+x)( 1+x+x2+x)( 1+x+x2+x3 +x4  )

将系数相加,可得答案。

例3: 若有1g的砝码3枚,2g的砝码4枚,4g的砝码2枚,问能称出哪些重量,各有几种方案。

G(x)=(1+x+x2+x3  )( 1+x2 +x4+x6+x8  ) (1+x4+x8)

四 母函数—指数型

定义:设 a0,a1,a2...an是一个数列,定义它的母函数为指数型母函数:                                 —— 解决元素重复的排列问题

fa(x)=(1+x)=C(a,0)X+C(a,1)X1/1! +C(a,2)X2/2! +C(a,3)X3/3! +.....+C(a,n)Xn/n!+

例1:

8个元素,a1重复3次,a2重复2次,a3重复3次,从中取r个组合,其组合数的母函数:

G(x)=(1+x+x2+x3  )( 1+x2 )(1+x+x2+x3  )=1+3x+6x2+9x3+10x4+9x5+6x6+3x7+x8

可得到,若取4个元素进行组合有10种方案。  若需要取4个元素进行排列呢:问题就转化为从8个元素取4个进行排列,其排列数应是每种组合的排列。

如:x1x33表示1个a1,3个a3; 那么它对应的排列数为 4!/1!3! ;

由:

Cnr = Pn/r!

Ge(x)=(1+x/1!+x2/2!+x3/3!  )( 1+x/1!+x2/2! )(1+x/1!+x2/2!+x3/3!  )=

1+ 3X/1! + 9x2/2! + 28x3/3! + 70x4/4! + 170x5/5! + 350x6/6! + 560x7/7!+ 560x8/8!

这里取K的排列数应该是K!.故取4个的排列数应是:70;

例: a1,a2...a7为7个有区别的球,将它们放入4个有标志的盒子,要求第1,2两个盒子必须含偶数个数,第3个盒子含有奇数个数。 有多少放法

可理解为从1,2,3,4这4个数字中取7个作允许重复的排列————元素重复的排列

例:求1,3,5,7,9 这5个数字组成的n位数的个数,要求其中3和7出现的次数为偶数,其他数字出现的次数无限制。

时间: 2024-09-29 20:08:04

计算机算法基础 ——数学(排列组合函数)的相关文章

算法基础:排列组合问题(Golang实现)

[排列组合问题] 一共N辆火车(0<N<10),每辆火车以数字1-9编号,要求以字典序排序输出火车出站的序列号. 输入: 包括N个正整数(0<N<10),范围为1到9,数字之间用空格分割,字符串首位不包含空格. 输出: 输出以字典序排序的火车出站序列号,每个编号以空格隔开,每个输出序列换行. 样例输入: 1 2 3 样例输出: 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 代码实现: package huawei import ( "fmt&qu

高中数学排列组合

一.特殊元素和特殊位置优先策略 例1.由0,1,2,3,4,5可以组成多少个没有重复数字五位奇数. 解:由于末位和首位有特殊要求,应该优先安排,以免不合要求的元素占了这两个位置. 先排末位共有 然后排首位共有 最后排其它位置共有 由分步计数原理得 二.相邻元素捆绑策略 例2. 7人站成一排 ,其中甲乙相邻且丙丁相邻, 共有多少种不同的排法. 解:可先将甲乙两元素捆绑成整体并看成一个复合元素,同时丙丁也看成一个复合元素,再与其它元素进行排列,同时对相邻元素内部进行自排.由分步计数原理可得共有种不同

算法练习:排列组合之子集合

问题描述 输入一个含有不同数字的序列,输出其所有子集合(含空集).要求:1)集合里元素有序排列:2)输出结果不含有重复集合 举例 输入序列{3,1,2} 输出:{},{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3} 问题分析 可以使用排列组合问题求解的第一种方法:分期摊还.初始化时,结果集合里含有一个空集.当扫描数列时,保留原有集合,同时将当前元素插入现有的所在集合中,从而形成新的集合.详见后面代码的GetSubSetsAmortized函数. 也可以使用第二种方法:f

算法:C++排列组合

题目:给定1-n数字,排列组合. 解法:递归.第一个数字有n种选择,第二个数字有n-1种选择,依次递归排列输出.用数组表示n个数字,用过的数字置0. 实现语言:C++ #include <iostream> using namespace std; /************************************************************************/ /* num : 需要排列的数组 count : 数组总数 numC: 已经排列的数组 iUse:

算法练习:排列组合之全排列

问题描述 输入一个不含相同数字的序列,输出所有可能的排列. 问题分析 与之前的"求解子集合"类似,使用递归方法:典型的在for循环内调用递归函数.不同的是,必须等到所有的数字均在集合里才能输出.为了记录每个数字的使用情况,还需一个辅助数组记录每个数字的使用情况.详见代码部分的FullPermutation函数. 扩展问题 如果数列中含有重复的数字,并且输出的结果不含重复组合,那么怎么处理?比如,输入{1,1,2},输出{1,1,2}, {1,2,2}, {2, 1, 1}.我们在挑选数

算法练习:排列组合之组合和

问题描述 给出一组不同的正整数序列和一个目标值,求出所有可能的组合,使得组合里所有元素和为目标值.要求: 1)每个组合里的元素按照升序排列. 2)输出组合里不含有重复的组合. 3)输入序列中的整数可以多次使用. 举例: 输入{2,3,4,7},目标值为7 输出{7},{2,2,3},{3,4} 问题分析 为了让输出元素按升序排列,可对输入序列进行排序.同这里我们使用递归的方法来解决这个组合问题,即典型的for语句内调用递归函数.需要注意以下几点: 1)记录剩余目标值和,只有当该值为0时,组合才是

算法思维方式—— 由排列组合想到的

最近算法题也刷了不少,小有感悟. 我觉得刷题时一般的思维方式是迭代思维.就是我们老是想着通过循环,通过顺序解决下一个来迭代解决整个问题. 典型事例有:2Sum, 3Sum, 排序问题,以及用双指针或快慢指针法解决的问题. 迭代思维是一种很直接的思维方式,但绝不简单,因为找到正确的循环方式并不是一件容易的事情. 但有些问题用迭代思维方式是很难解决的,或者说这些问题本身就不适合用循环来解. 比如求组合数问题.C(n, 2)还能用2层循环来解,但C(n, m)呢?用迭代就很难求解了,不自然.这是用递归

第一阶段 PHP基础.数学、字符函数库与循环

一位初学php的随堂笔记,记录自己的成长! 一.数学函数库 1.安装:数学函数库是PHPCORE的组成部分 2. (1) floor: 向下取整 (2) ceil: 向上取整 (3)round: 四舍五入 int round(number $var[,int $percision]) (4)pow :求次幂 (5)sqrt:求开平方 (6)max :求最大值 (7)min :求最小值 (8)rand :求整数随机数 (9)mt_rand:求整数更好随机数 二.流程控制语句--循环 1.什么时候用

matlab 排列组合函数的用法

1.nchoosek(n,m) 含义:从n个元素中取出m个元素的所有组合. matlab代码: <span style="font-size:18px;">>> a=rand(1,4) a = 0.4456 0.6463 0.7094 0.7547 </span><pre name="code" class="plain"> >> a_nchoosek=nchoosek(a,2); 2.