数学中有个经典的组合问题,即一个m元素组成结合C取其中n个元素 (0<n<=m ,n,m为整数),与多少种组合。在读高中时这个问题是数学的一大重点难点,笔者印象深刻。在大学研究算法时也碰到这种问题,当时试着按高中时的解决方案如:挡板法、归类法去遍历所有的组合情况时却发现没那么容易,用函数递归的编程方法,很容易就死循环了。当时学线性代数的矩阵时有种算法叫 “0|1置换法”跟排列组合的概念相符合,就尝试用这种方法来遍历组合问题。后来参加工作了,在某互联网婚恋网站负责一个情缘匹配的需求,里面会根据男女的身材、相貌、工作、收入、家庭、年龄、性格等多维因素做一个匹配,因为数据量大不能实时计算、要事先计算好结果,所以就要先计算出有多少种组合,每种组合人群归类,然后给红娘去定向推广。因为涉及公司业务,此处不举这个例子。今天整理文档,发现了这个算法,直接贴出算法和代码实现,供有兴趣者参考:
求一个组合C(m,n)
算法如下
1、开一个数组a[m],其下标表示1到m个数
2、数组元素的值为1表示其下标代表的元素被选中,为0则没选中。
3、首先初始化,将数组a[0]~a[n-1]个元素置1,a[n]~a[m-1]置0,由此得到第一个组合
4、从左到右扫描,找到a[i-1]=1,a[i]=0的组合 ,找到第一个这种组合后将其值对换,同时将其左边的所有“1”全部移动到数组的最左端
5、当第一个“1”移动到数组的m-n的位置,即n个“1”全部移动到最右端时,就得 到了最后一个组合。
比如组合 [A,B,C,D,E]中5取3的组合情况,按算法步骤如下:
1 1 1 0 0