数学问题(1) — 组合问题的程序实现

本文介绍了如何使用01置换法解决数学中的组合问题,该问题涉及到从m个元素中选择n个进行组合。通过算法步骤解析和具体示例,展示了如何生成所有可能的组合。同时,给出了简单的Java代码实现,尽管可以进一步优化。
摘要由CSDN通过智能技术生成

        数学中有个经典的组合问题,即一个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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值