推薦《程式員的數學》中排列組合一章,講的太好了!
計數就是不重複,不遺漏的去將對象和整數對應起來。我們平時會簡單的數數,但是如果在計數對象多的不能直接數時,就需要找到計數對象與整數之間的“對應規則”了。為此必須理解計數對象具有怎麼樣的特性和結構。
一個例子,記憶體中排列著要處理的100個資料。從第一個開始依次編號為0號,1號。。。那麼最後1個資料的編號是多少呢?
答案:99。
程式員朋友肯定很少會答錯這道題。只要找到了“對應規則”--從0開始編號,最後一個資料的號是n-1.
只要掌握了普遍規則,那麼數字有多大都不會出錯,這點很重要。因此在計數問題中,最重要的是使用變數n將問題抽象出來。
置換
手中有三張牌A,B,C。現在問總共有多少張排法?--這種問題稱之為置換(substitution).
解法:
選取第一張牌時有3種選擇,選取第二張牌時有2種選擇,選擇第三張牌時只剩下一種選擇了。因此應該是3*2*1=6種排法。
由此可見此類問題是牌數的階乘n!(factorial),因乘數呈階梯狀而得名。0!=1而不是0.
這其實也是程式中我們常常說的“全排列”的問題,但是其實和數學中的“排列”不是一個哈。
為什麼這種排法稱為置換呢?因為相當於在所有牌中,讓兩張牌交換彼此的位置並得到所有的可能性。
排列
手中有5張牌A,B,C,D,E。現在問從5張牌中抽出3長,然後排列,有多少種排法?
解法也很簡單:
第一張牌有5種選擇,第二張牌有4中選擇,第三張牌有3種選擇。因此是5*4*3=60.
我們把從n長牌中抽出k張按一定順序排列的方法稱為排列(Permutation). 排列的總數記做
P kn = n!/(n-k)!
組合
手中有5張牌A,B,C,D,E。現在問從5張牌中抽出3張,不考慮順序,有多少種組合?
這種問題稱為組合(combination). 組合的計算方法可以首先計算出排列的總數,然後除以重複計算的部分(重複度)。
最後我們就得到了置換,排列和組合的關係:
以5張牌中取3張牌做排列為例,置換是“3張牌所有的排序可能”,組合是“從5張牌中抽出3張牌的所有可能”,排列是“5張牌中抽出3張牌,並做置換”。因此
“3張牌所有的排序可能” * “從5張牌中抽出3張牌的所有可能” = ”5張牌中抽出3張牌,並考慮順序做排列”
下面是兩道思考題
1, 現在要用顆粒狀的藥品調配一種新藥。藥品有A,B,C三種。調配規則如下:
從A,B,C中共取100粒; A,B,C這3種藥中至少有一種;不考慮藥品調配的順序。
問,新藥調劑有多少種組合?
2,現在有5張撲克牌,其中王2張,其他J,Q,K各一張。將5張牌列在一起,左端或右端至少有一張王牌的排列方法有多少種?