作者:枕边书来源:https://zhenbianshu.github.io/2019/01/charming_alg_permutation_and_combination.html
需求
最近工作中碰到一个需求:我们的数据表有多个维度,任意多个维度组合后进行 group by 可能会产生一些”奇妙”的反应,由于不确定怎么组合,就需要将所有的组合都列出来进行尝试。
抽象一下就是从一个集合中取出任意元素,形成唯一的组合。如 [a,b,c] 可组合为 [a]、[b]、[c]、[ab]、[bc]、[ac]、[abc]。
要求如下:
- 组合内的元素数大于 0 小于等于 数组大小;
- 组合内不能有重复元素,如 [aab] 是不符合要求的组合;
- 组合内元素的位置随意,即 [ab] 和 [ba] 视为同一种组合;
看到这里,就应该想到高中所学习的排列组合了,同样是从集合中取出元素形成一个另一个集合,如果集合内元素位置随意,就是组合,从 b 个元素中取 a 个元素的组合有 种。而如果要求元素顺序不同也视为不同集合的话,就是排列,从 m 个元素取 n 个元素的排列有 种。
我遇到的这个需求就是典型的组合,用公式来表示就是从元素个数为 n 的集合中列出 种组合。
文中算法用Java实现。
从排列到组合-穷举
对于这种需求,首先想到的当然是穷举。由于排列的要求较少,实现更