从 5 个元素中取 3 个元素是一个复杂问题,为了简化它,我们认为已经取出了一个元素,还要再从剩余的 4 个元素中取出 2 个,求解公式为: 。从 4 个元素中取出 2 个依旧不易解决,那我们再假设又取出了一个元素,接下来的问题是如何从 3 个元素中取一个,公式为。从 3 个元素中取 1 个已经是个简单问题了,有三种可能,再向上追溯,与四取一、五取一的可能性做乘,从而解决这个问题 。代码实现
用代码实现如下:
其实就是 递归 。
直击本质-位运算
从元素的全排列找全组合,比穷举略好,但还不是最好的方法,毕竟它”绕了一次道” 。
很多算法都能通过位运算巧秒地解决,其优势主要有两点:一者位运算在计算机中执行效率超高,再者由于位运算语义简单,算法大多直指本质 。
组合算法也能通过位运算实现 。
思想
再次考虑全组合的需求,从 M 个元素中取任意个元素形成组合,组合内元素不能重复、元素位置无关 。
之前的方法都是从结果组合是否满足要求来考虑问题,考虑组合是否有重复元素、是否已有同样的组合等条件 。如果换种思路,从待选元素上来考虑呢?
对于每个元素来说,它的状态就简单得多了,要么被放进组合,要么不放进组合 。每个元素都有这么两种状态 。如果从 5 个元素中任意取 N 个元素形成组合的话,用二进制位来表示每个元素是否被放到组合里,就是:
看到这里,应该就非常清楚了吧,每种组合都可以拆解为 N 个二进制位的表达形式,而每个二进制组合同时代表着一个十进制数字,所以每个十进制数字都就能代表着一种组合 。
十进制数字的数目我们很简单就能算出来,从00000… 到 11111… 一共有 种,排除掉全都不被放进组合这种可能,结果有种 。
- 《百家姓》的排列有规律吗
- 穿越火线等级军衔图标 穿越火线军衔排列
- 淘宝标题组合三大技巧是什么
- 北京国管组合贷放款时间 国管组合贷放款时间
- 天籁v61缸排气顺序 天籁v6气缸排列图
- 手指速算法到底好不好 手指速算法怎么记好
- 函数极限的运算法则 极限的运算法则
- 姓名笔画排列的基本规则
- 数字密码1到9的数字组合 数字密码”1
- 淘宝标题优化吸睛组合方式分享
特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
