算法之组合数学及其算法篇(一) ----- 排列与组合
组合数学及其算法篇
- 前言
- 排列与组合
- 无重集的排列与组合
- 无重集的排列
- 应用例子
- 无重集的组合
- 应用例子
- 重集的排列和组合
- 重集的排列
- 重集的组合
前言
组合数学研究的对象是组态。所谓组态就是指若干个对象按照某些约束条件组成的各种状态。
排列与组合
在组合数学中,集合分为无重集和重集。
\lbrace表达式\rbrace
- 无重集即集合中的不同元素只出现一次,指在选取过程中每个元素不可重复选取,也就是至多选取一次。记作, S={a1,a2,⋯,ak}S=\lbrace a_1,a_2,⋯,a_k\rbraceS={a1,a2,⋯,ak}
- 重集即集合中的不同元素可出现多次,指在选取过程中每个元素可重复选取。有限重集就是第i个元素a,至多选取n;次。
记作, ={n1⋅a1,n2⋅a2,⋯,nk⋅ak}=\lbrace n1⋅a1,n2⋅a2,⋯,nk⋅ak \rbrace={n1⋅a1,n2⋅a2,⋯,nk⋅ak} 其中n,称作a,的重数。
无限重集指每个不同元素可以任意选取若干次。记作,
S={ω⋅a1,ω⋅a2,⋯,ω0⋅ak}
无重集的排列与组合
无重集的排列
定义:若集合含有n个不同的元素,从中任选r个的有序编排,则称为排列或r排列。其不同的排列的个数,简称排列数,记作p(n,r)p(n,r)p(n,r)
定理1:对于r<=n,p(n,r)=n!(n−r)!对于r <= n ,p(n,r) = \frac{n!}{(n-r)!}对于r<=n,p(n,r)=(n−r)!n! 。
定理2: 从n个元素的集合中任取r个的圆排列个数为:p(n,r)r\frac{p(n,r)}{r}rp(n,r)。证:由前面的定理,从n个不同元素中任取r个的排列个数。为p(n,r),这种排列又称线排列。将这些排列分成组,每组有r个线排列且产生相同的r圆排列,所以r圆排列的个数为p(n,r)/r。
特别地,n个元素的圆排列个数为(n-1)!。
我们举一个例子:
对于一个圆排列abcde , 我们从5个空隙中断开,那么会产生5个线排列。也就是说这5个线排列对应的圆排列是一样的。
应用例子
若男女混座,问6位男士和6位女士围圆桌就座有多少种方式?
解:我们先安排6位男士就座,6位男士的圆排列数为5!,6位男士就座后,每相邻两人之间有一个空位,共6个。刚好安排6位女士,6位女士的全排列数为6!。所以按乘法原理就是 5! * 6!.
无重集的组合
定义:从n个元素的集合S中,任取r个元素且不考虑次序,则称为组合或r组合。其不同的组合个数,简称组合数,记作C(n,r)C(n,r)C(n,r)
- 定理 , 对于r<=n,C(n,r)=p(n,r)r!对于r<=n,C(n,r) = \frac{p(n,r)}{r!}对于r<=n,C(n,r)=r!p(n,r)
例子 :求1~300的整数中,有多少种方法选出三个整数来使得它们的和被3整除?
解1,2,…,300这300个整数可以分成三组:被3整除者为一组,除以3余1者为一组,除以3余2者为一组,显然,每一组有100个整数。如果三个整数都选自同一组,其和必能被3整除;如果每组选取一个整数,其和也必能被3整除。因此,选择三个整数其和能被3整除的方法总数为
C(100,3)+C(100,3) +C(100,3)+1003=1485100。
为什么每一组有100个数呢:我们以余1的为例,对于集合中每一个数我们可以表示成3x+13x+13x+1,对于个数我们将99代入< 300 ,代入100>300 , 那么我们x的取值为0 - 99 一共100个数。
应用例子
- 若一个凸多边形无三条对角线在其内部交于一点,问这些对角线被它们的交点分成多少短:
凸多边形对角线条数为C(n,2)−nC(n,2)-nC(n,2)−n,由于每四个点有一个交点,凸多边形交点数为C(n,4)C(n,4)C(n,4)。每一个对角线上的K个交点将其分为K+1的线段,那么应该是(K1+1+...+Kn+1)=(K1+...+Kn)+n(K_1+1+...+K_n+1) =(K_1+...+K_n)+n(K1+1+...+Kn+1)=(K1+...+Kn)+n,其中n为对角线条数,由于一个交点位于两条对角线上,所以总数为 (C(n,2)−n)+2∗C(n,4)(C(n,2)-n)+2*C(n,4)(C(n,2)−n)+2∗C(n,4) - 1000!后边有多少个0?
1到1000中2的个数远多于5的个数,2*5可得到一个0。
所以求得1到1000中有多少个5就可以求得1000!的末尾有几个0.
分析
5的1次幂5的倍数增加1个0 (5,10,15,20,25,30,…)
5的2次幂25的倍数增加2个0(必然是5的倍数)(25,50,75,100,125…)
5的3次幂125的倍数增加3个0(必然是25的倍数)(125,250,375,500…)
5的4次幂625的倍数增加4个0(必然是125的倍数)(625,1250,1875,2500…)
…
所以先求出5的倍数
加上25的倍数(2个0,其中1个已记入5的倍数)
加上125的倍数(3个0,其中1个已记入5的倍数1个已记入25的倍数)
加上625的倍数(4个0,其中…)
1000/5=200 (1000里面含有200个5的倍数,但同时也包含了25倍数,125的倍数,625的倍数各一次)
1000/25=40(1000里面含有40个25的倍数,同时也含有125的倍数,625的倍数各一次)
1000/125=8(1000里面含有8个125的倍数,同时也含有625的倍数)
1000/625=1(1000里含有1个625的倍数)
所以1000!里面含 有0的个数为200+40+8+1=249个
重集的排列和组合
重集的排列
- 定理1 : 若S是含有K个不同元素而每一个元素具有无限重复的重集,则S的r排列的个数是krk^rkr 。因为是无限重复的,那么对于每一个元素我们都有K种选法,选r个,因此就是krk^rkr
- 定理2:设重集S有k个不同元素a1,a2,…,aka_1,a_2,…,a_ka1,a2,…,ak,其有限重复数分别为n1,n2,⋯,nkn_1,n_2,⋯,n_kn1,n2,⋯,nk,且n=n1+n2+⋯+nkn=n_1+n_2+⋯+n_kn=n1+n2+⋯+nk,则S的排列个数(指的是所有元素的排列)等于:n!n1!∗n2!...∗nk!\frac{n!}{n_1! * n_2!...*n_k!}n1!∗n2!...∗nk!n!
重集的组合
- 若S是重集,则S的r组合是不考虑次序地从S中选择r个元素,因此,S的r组合通常是一个子重集。如果S有n个元素,则只存在一个S的n组合。
- 定理1 :设S是有K个不同元素的重集,且每个元素的重复次数无限,则S的r组合个数等于 C(k−1+r,r)C(k-1+r,r)C(k−1+r,r) . 证明: 设S的不同元素是 a1,a2,…,aka_1,a_2,…,a_ka1,a2,…,ak,因而 S={∞∗a1,∞∗a2,....,∞⋅ak}S=\lbrace \infty *a_1,\infty *a_2,....,\infty⋅a_k \rbraceS={∞∗a1,∞∗a2,....,∞⋅ak}. S的任何r组合形如 {x1∗a1,x2∗a2,⋯,xk∗ak}\lbrace x_1*a_1,x_2*a2,⋯,x_k *a_k \rbrace{x1∗a1,x2∗a2,⋯,xk∗ak},其中x1,x2,…,xk是非负整数且x1+x2+⋯+xk=rx_1,x_2,…,x_k是非负整数且 x_1+x_2+⋯+x_k=rx1,x2,…,xk是非负整数且x1+x2+⋯+xk=r 反之,任何满足x1+x2+⋯+xk=r的非负整数序列x1,x2,...,xk对应S的一个r组合x_1+x_2+⋯+x_k=r 的非负整数序列x_1,x_2,...,x_k对应S的一个r组合x1+x2+⋯+xk=r的非负整数序列x1,x2,...,xk对应S的一个r组合。于是S的r组合个数等于方程x1+x2+⋯+xk=r的非负整数解的个数于是S的r组合个数等于方程 x_1+x_2+⋯+x_k=r 的非负整数解的个数于是S的r组合个数等于方程x1+x2+⋯+xk=r的非负整数解的个数。
可以证明这些解的个数等于重集T={(k−1)∗0,r∗1)}T = \lbrace (k-1) *0 , r * 1) \rbraceT={(k−1)∗0,r∗1)}的排列个数。给定T的一个排列,这(k-1)个0把r个1分成k组。令x1x_1x1个1在第一个0的左边,x2x_2x2个1在第一个0和第二个0之间,…,xkx_kxk个1在最后一个0的右边,而x1,x2,...,xk是非负整数且x1+x2+…+xk=r而x_1,x_2,...,x_k是非负整数且x_1+x_2+…+ x_k=r而x1,x2,...,xk是非负整数且x1+x2+…+xk=r。 反之,给定非负整数x1,x2,…,xk,且x1+x2+⋯+xk=r,x_1,x_2,…,x_k,且 x_1+x_2+⋯+x_k=r,x1,x2,…,xk,且x1+x2+⋯+xk=r,可按相反步骤构造T的一个排列。于是:重集S的r组合个数等于重集T-{(k-1)·0,r·1}的排列个数。而重集T的排列个数就是有限重复集的排列个数,由上面公式,T的排列个数等于
(k−1+r)!(k−1)!∗r!=C(k−1+r,r)\frac{(k−1+r)!}{(k−1)!*r!}=C(k−1+r,r)(k−1)!∗r!(k−1+r)!=C(k−1+r,r) 证毕。
对于上面的结果和推导过程,对于重集T的由来,我么可以类比隔板法,(由方程我们可以将r看成r个1)我们有r个一样的球,我们将其放入k个盒子,可以允许有空盒的方案数。我们用隔板法得到的结果是一样的。
那么由这个我们就可以求出 x1+x2+...+xk=rx_1 + x_2+...+x_k = rx1+x2+...+xk=r的非负整数解的个数就是C(k−1+r,r)C(k−1+r,r)C(k−1+r,r) , 而这就是 (x1+...+xk)r的项数( x_1 + ...+x_k)^r的项数(x1+...+xk)r的项数
- 定理2 : 设重集S有K个不同元素a1,a2,...,aka_1,a_2,...,a_ka1,a2,...,ak的重集,且每个元素有无限重复次 。若要求S的每个元素至少在r组合出现一次,则S的这种r组合个数等于C(r−1,k−1),r>=kC(r-1,k-1),r>=kC(r−1,k−1),r>=k ,这就是隔板法的理论依据。也就是方程x1+...,+xk=r,xi>=ix_1 +...,+x_k = r, x_i >=ix1+...,+xk=r,xi>=i的正整数的解的个数。
- 定理2的推论: 将r个相同的元素放入n个不同的盒子而使每个盒子至少含有q个元素的分配方法的个数为 C(n−nq+r−1,n−1)C(n-nq+r-1,n-1)C(n−nq+r−1,n−1)
算法之组合数学及其算法篇(一) ----- 排列与组合相关推荐
- 算法之组合数学及其算法篇(二) ----- 鸽巢原理
鸽巢原理 前言 鸽巢原理 运用1 运用二 运用三 鸽巢原理的推广 推论 运用一 运用二 鸽巢原理在几何上的作用 鸽巢原理对于数学的证明 前言 鸽巢原理又称抽屉原理或鞋盒原理,这个原理最早是由狄利克雷( ...
- 算法之组合数学及其算法篇(三) ----- 容斥原理应用以及几个典型的递归关系
容斥原理应用和典型的递归关系 容斥原理应用 前言 错位排列 棋阵多项式 禁位排列 递归关系 Hanoi塔问题 平面分割问题 容斥原理应用 前言 容斥原理是组合数学中的一个重要原理,它在计数研究中占有重 ...
- 组合数学(四)生成排列和组合
文章目录 全排列的生成 序数法 字典序法 回溯法 插入法 JohnsonTrott算法(换位法) 全排列的生成 利用LeetCode46题全排列来验证一下是否正确 序数法 这个方法把n!个排列与0n! ...
- 【算法】组合数学——排列数生成算法详解(一)
组合数学中的全排列深成算法历来是组合数学考试的重要考察点,因此在这里我简单的介绍一下6种全排列生成算法的详细过程,并借此比较它们之间的优劣之处. 不论是哪种全排列生成算法,都遵循着"原排列& ...
- 【离散数学中的数据结构与算法】六 排列与组合二
接着上一篇学习:[离散数学中的数据结构与算法]五 排列与组合一 上一篇文章主要学习了可重复选取的可重排列和不可重复选取的排列.他们都是在n个不同的对象中选取. 今天我们俩学习的是,当这个n个对象中有相 ...
- 数据结构-排序算法(c语言实现篇)
数据结构-排序算法(c语言实现篇) 排序算法是非常常用的算法,从介绍排序的基本概念,到介绍各种排序算法的思想.实现方式以及效率分析.最后比较各种算法的优劣性和稳定性. 1 排序的概念及应用 1.1 排 ...
- 【机器学习】机器学习算法优缺点对比(汇总篇)
作者 | 杜博亚 来源 | 阿泽的学习笔记 「本文的目的,是务实.简洁地盘点一番当前机器学习算法」.文中内容结合了个人在查阅资料过程中收集到的前人总结,同时添加了部分自身总结,在这里,依据实际使用中的 ...
- 「机器学习」机器学习算法优缺点对比(汇总篇)
作者 | 杜博亚 来源 | 阿泽的学习笔记 「本文的目的,是务实.简洁地盘点一番当前机器学习算法」.文中内容结合了个人在查阅资料过程中收集到的前人总结,同时添加了部分自身总结,在这里,依据实际使用中的 ...
- 算法之排列与组合算法
1. 前言 本文介绍了常用的排列组合算法,包括全排列算法,全组合算法,m个数选n个组合算法等. 2. 排列算法 常见的排列算法有: (A)字典序法 (B)递增进位制数法 (C)递减进位制数法 (D)邻 ...
最新文章
- ubuntu下修改文件权限
- C/C++函数名修饰约定
- PHP 单元测试工具 SimpleTest
- Mysql Workbench中EER Diagram逆向生成表
- 一个iOS开发者的Flutter“历险记”
- quick-cocos2d-x 游戏开发——StateMachine 状态机
- Python基础函数学习笔记(二)
- c语言指针试题嵌入式,嵌入式面试C语言试题「」(2)
- 怎样给计算机做屏幕保护,电脑屏保软件如何制作屏保 及如何设置屏幕保护
- SPSS应用程序无法启动,因为应用程序的并行配置不正确。请参阅应用程序事件日志,或使用命令行sxstrace.exe工具。
- macd柱体和汇价的背离
- 一名女程序员的职业规划
- 【2016.11.10】百度云离线下载迅雷链接
- 二十一世纪计算|洪小文:帮助机器和人类共同学习
- Android控件详解之网格控件
- html制作钢铁侠心脏,钢铁侠的“心脏”并不是特效,得知如何制成的,网友:难以置信...
- maven本地有包但是引不进来 已解决
- linux glib,我该如何安装glib?
- 51单片机学习笔记之数码管1显示数字0以及使用蜂鸣器
- python爬微信公众号视频_python爬虫公众号所有信息,并批量下载公众号视频
热门文章
- source insight(SI)使用教程
- 如何更改jupyter notebook显示为中文?
- 为什么一次ajax调用会发送两次请求?
- 考研 考研爬虫大数据分析专业热度
- 获取表单内部元素的N种方法
- python图像处理实战 戴伊_这一套封面的程序员专业书籍你读过哪一本?
- springboot打包发布
- java excel导入去重_如何把日志导入到excel文档图文教程(含url去重)
- python如何读取excel的一个sheet_python pandas是如何读取excel表中的sheet的(四)
- nginx 配置静态文件目录_nginx缓存静态资源,只需几个配置提升10倍页面加载速度...