排列组合学习要点
?
一、語言習慣的問題
排列和組合的差別是,排列的元素與位置有關,而組合的元素對位置無要求。我們的日常問題絕對不會出現這樣的問法:某組元素的排列數是什么?
不管是排列還是組合,日常用語都會用“組合”這個詞,因此我們要分析一個問題是排列還是組合,要基于問題的前提,分析元素的位置是不是問題需要考慮的因素,如果元素位置不是問題所關心的,那么這個就是組合,否則就是排列。
為了顧及語言上的誤導性,一般專業的數學題都不會在涉及排列的時候出現“組合”二字,因為“排列”或者“組合”都是經過數學嚴格定義的術語。這造成學生只能針對數學問題做解答,而對于沒有用語暗示的現實問題,往往就缺乏分析能力。
?
二、 排列的兩種方法
分類法:根據不同情況分析每一種情況的種類個數,然后累加所有情況,自然就是問題的解。每一種情況必須是獨立的,不相互涵蓋的,所有分類的總和必須是問題的全部情況。
分步法:分步法基于分類法的思想,分析每一種情況,但是每一種情況由幾個獨立部分相繼組成。
假設一種情況有兩步,第一步有三種選擇,第二步有兩種選擇,那么總共的可能路線就有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.
這種問題本質上也是基礎問題,只是需要做思維轉換。
(七)
?
轉載于:https://www.cnblogs.com/Nobel/archive/2012/02/25/2367650.html
總結
- 上一篇: php调用matlab
- 下一篇: 【转】Asp.NET大文件上传开发总结(