排列组合学习要点
一、语言习惯的问题
排列和组合的差别是,排列的元素与位置有关,而组合的元素对位置无要求。我们的日常问题绝对不会出现这样的问法:某组元素的排列数是什么?
不管是排列还是组合,日常用语都会用“组合”这个词,因此我们要分析一个问题是排列还是组合,要基于问题的前提,分析元素的位置是不是问题需要考虑的因素,如果元素位置不是问题所关心的,那么这个就是组合,否则就是排列。
为了顾及语言上的误导性,一般专业的数学题都不会在涉及排列的时候出现“组合”二字,因为“排列”或者“组合”都是经过数学严格定义的术语。这造成学生只能针对数学问题做解答,而对于没有用语暗示的现实问题,往往就缺乏分析能力。
二、 排列的两种方法
分类法:根据不同情况分析每一种情况的种类个数,然后累加所有情况,自然就是问题的解。每一种情况必须是独立的,不相互涵盖的,所有分类的总和必须是问题的全部情况。
分步法:分步法基于分类法的思想,分析每一种情况,但是每一种情况由几个独立部分相继组成。
假设一种情况有两步,第一步有三种选择,第二步有两种选择,那么总共的可能路线就有3*2种。第二种情况有一步,第一步有五种选择,那么就是五种路线。结合一起就是3*2+5=11种。分类法是一个步骤的分步法,是特殊情况。分步法的每一步都是分类法,是分类问题多次组合。
分类法是研究一个分步种的分类情况,也就是一步中的所有情况都应该相互独立,并且总的分类应该是所有可能的情况。 简而言之的要求是独立而全面。
而分步法是研究一个完整的路线所需要的步骤,步骤之间应该独立,连续有次序,并是解决问题的一个情况的完整路线。简而言之就是要求连续而完整。
如果把一个问题的解集表述成一个表格,分类研究的是每一列的情况,而分步研究的是每一行的情况。当然,每一步的分类个数未必是相同的,每一分类的步骤数也未必是相同的。
三、元素
问题经常会罗列元素,但是会添加一定的条件约束。
元素的一般含义就是分类,即每一种类,每一情况。而条件约束实际上是要求你重新划分种类。 因此不能光被问题所罗列的元素迷惑了,根据条件约束用分类法重新定义元素的个数。
四、位置
问题经常会让你把元素按照位置排列,每一个位置其实就是一个步骤。每个步骤需要考虑的元素总数一般是不相同的。
位置比元素更有迷惑性,因为位置可能是隐含的,不会直接告诉你总共有几个位置,需要你自己分析出来。
五、局部和整体
分类的局部是累加为整体。
分步的局部是类乘为整体。
六、理解排列数和组合数
(一)基础
n个元素取m个元素
排列数:第一步取一个,可以有n个可选;第二步取一个,可以有n-1个可选(因为上一步取走了一个);总共有m步,那么就是A(m,n) = n(n-1)(n-2)(n-3)...= n!/(n-m)! 。 m是取的个数, n-m就是要去除的个数(用除法去除),如果m=n,那就是全排列。
组合数:在排列数的基础上,去除顺序相同的部分。顺序相同的部分怎么知道? A(m,n) 的结果就是取m组元素(每组个数不一样),然后进行全排列,也就是m!,那么我们想知道没有排列之前的情况,也就是无重复的组合数就是C(m,n) = A(m,n)/m! = n!/( (n-m)!*m! ).
排列数转化为组合数只需要除以m! ,反之组合数要转换为排列数就是乘以m!,可见m!就是排序因子,可以帮助我们随意转换。
(二)平均分堆问题:
n个元素,平均分m堆,每堆k个
每一堆为一步,而每一堆的每一个位置又是一小步。
从元素列表中取k个元素的m堆,也就是 A(m, X),其中X 未知,解法是:
首先第一堆是 A(k,n),而第二堆问题是 A(k,n-k) ,第二个问题可以选择的元素就要少k了,因此第m堆等于A(k,n-(m-1)k).
A(k,n)A(k,n-k)A(k,n-2k)...A(k,n-(m-1)k) 就是所有的排列数。
而平均分堆需要知道的是组合数,那么就是C(m,x) = A(m,x) /m!:
然后每一堆都要求得它对应的组合数。
第一堆的组合是C(k,n) = A(k,n)/k! ,第二堆 C(k,n-k) = A(k,n-k)/k!...C(K,n-(m-1)k) = A(k,n-(m-1)k)/k!
累乘之后就是C(k,n)...C(k,n-(m-1)k) 对应公式A(m,x) 部分;
最后套最终公式就是c(m,x) = A(m,x) /m! = ( C(k,n)...C(k,n-(m-1)k) ) / m! .
每一堆自身需要求对应的组合数,而所有堆的结果也要除以m! 取得对应的组合数。
组合数的公式都是基于排列数得到的,而排列数的公式是有逻辑基础,易于掌握的(也就是从n个元素取m个数的机械操作),因此应该首先找出对应的排列数,再根据公式推导得到对应的组合数。
有时候不知道元素个数也无所谓的,只需要知道取数个数,就能转换组合数和排列数。
有些问题需要得到平均分堆组合数后,又提出新的要求,那就是按顺序分配。这个等价于:组合数为元素个数n,取位置数m的排列数问题。
非平均分堆问题,而是按特定比例分配,如:2:2:3:3:5 这个比例分配,m! 的值应该如何取?
这个需要结合分类法,因为比例不同的分组总是不同的组合,而比例相等的组合有不同的排列(相同比例的元素可以相互替换,得到组成结构不变但是内部顺序变化的新排列)。
把元素组合分为3类,一类是2,一类是3,一类是5。其中类2的数目是2,也就是m1 = 2;以此类推,m2= 2,m3 = 1。
问题可以转化为,先求类2的情况:c (2,x) /m1, 然后求类3:c(3,x)/m2, 类5 : c(5,x)/m3.
综合: m! = m1! * m2! * m3!
(三)插空法:
插空法是首先建立一般队列,然后插入特殊元素的方法。首先是需要建立一个合理的分类,将一般和特殊元素进行分组。
如7个元素,5个无约束,2个不允许相邻。
5个元素可以自由排列,但是2个应该分开,第一步建立好任意排列的5个元素后,再插入2个元素,5个元素的队列可以选择插入6个位置,并且第一个插入和第二个插入的位置是相互独立的,相当于6个元素放在两个位置上,也就是A(2,6)。
总结: A(5,5) * A(2,6).
分组元素需要考虑完整性,把7个元素分成5个和2个两组,但是问题是求7个元素的排列,那么这两组的关系应该是“分步法”。第二是需要考虑元素的一般性,不要用特殊情况去分析一般性的元素排列,5个一般元素的组成的某一个特殊排列,都能代表这5个元素的一般性排列,因为两个特殊元素考虑的是双方的关系,和5个一般元素无关。如果把其中一个特殊元素并入5个一般元素去考虑,那么就无法插入第7个元素,因为任意一个位置上的数都可能就是特殊元素。通过建立合理的模型,就可以将两类元素进行正确的分步法。这也是独立性思想的一个例子,分类分组都必须要考虑到元素的独立性,建立一个不相互干涉的分类和分步。
(四)捆绑法
捆绑法是将特殊元素捆绑成一个独立元素,和一般元素进行排列。
如7个元素,5个无约束,2个必须相邻。
首先分成两组,5个无约束一组,2个特殊一组,第二组可以作为一个整体插入到五个元素的任意位置,也就是可以类似插空法那样 A(2,2)*A(1,6)*A(5,5) ;也可以把2个元素形成一个一般元素后,组成6个一般元素的解,A(2,2)*A(6*6) 。
(五)消序法
消序法一般是去除一部分的有序,因此先求的总体的排列数,然后除以局部的排列数,就可以得到最后要的结果。如果是整体消序就是排列数和组合数之间的转换。
如7个元素,5个无约束,剩下两个的甲必须在乙左边。
消序法是A(7,7) / A(2,2).
消序法的方式很简单,但是难以理解,需要结合组合数的基础知识。
消序法和分堆的思想有共通的地方,可以把需要消序的和不需要消序的分成两堆,然后得到C(2,7)*A(5*5).
(六)剪截法
如7个元素,任意分成3组,每组至少一个,有几种组合?
相当于7个元素的队列的间隔内(6个中间间隔),任意截断2次,即C(2,6) = 21.
这种问题本质上也是基础问题,只是需要做思维转换。
(七)