推荐《程序员的数学》中排列组合一章,讲的太好了!
计数就是不重复,不遗漏的去将对象和整数对应起来。我们平时会简单的数数,但是如果在计数对象多的不能直接数时,就需要找到计数对象与整数之间的“对应规则”了。为此必须理解计数对象具有怎么样的特性和结构。
一个例子,内存中排列着要处理的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.
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张牌列在一起,左端或右端至少有一张王牌的排列方法有多少种?