【发布时间】:2015-09-19 10:44:33
【问题描述】:
我目前正在将这个问题作为个人项目来解决。
基本上:
- 给定一个元素数组,例如E = {1,2,a,b} 和
- 给定一个数字,K,例如K = 2
- 我想退回所有大小为K的E的Combinations(E选K)
- 例如{{1,1}, {1,2}, {1,a}, {1,b}, {2,1}, ... , {b,1}, {b,2}, {b, a}, {b,b}}
我已经使用以下函数递归地实现了这一点:
char[] pool = new char[]{'1', '2', '3'};
public void buildStringRec(char[] root, int pos, int length){
for(char c : pool){
char[] newRoot = root.clone();
newRoot[pos] = c;
if(pos+1 < length){
buildStringRec(newRoot, pos+1, length);
} else{
System.out.println(String.valueOf(root));
}
}
}
pool 是 E,length 是 K。
所以我们会调用:buildStringRec(new char[2], 0, 2); 并获取
11
12
13
21
22
23
31
32
33
这可以迭代完成吗?我一直在努力思考如何使用可变长度来做到这一点。
任何帮助将不胜感激!如果需要,我可以按原样发布我的代码,但由于我重试,它经常更改,以至于我一发布它就几乎没用了。
另外,我不想使用 Apache 或 String Builder 来执行此操作,因为我想了解如何执行此操作的概念。我不只是要求代码。伪代码只要解释清楚就好了。
谢谢!
编辑
我正在使用这个网站来测试提供给我的所有选项:https://ideone.com/k1WIa6
随意分叉并尝试一下!
【问题讨论】:
-
严格来说 {1,1} 不是 {1,2,3} 的子集(或者更确切地说,它与 {1} 是同一个集合,因为集合不能包含多个相同的元素次 - 那些将是多组)。因此,如果您实际上想要返回“大小为 K 的 E 的子集集”,则 {1,1} 不应成为输出的一部分。但是您似乎对结果很满意(打印出
E x E的所有元素),所以我想这只是术语的问题。 -
是的,这是我弄乱术语的错。我将尽我所能编辑,以更清楚地说明我想要什么。
-
@HW 这也不是真正的组合,因为可能的组合不包括 {1,1}...也许这更像是“递归交叉乘法”?所以对于长度 3,我将使用 ((ExE)xE) 来获取我的值?你怎么看?
-
是的,“递归交叉乘法”被称为笛卡尔积(或笛卡尔幂) - 参考en.wikipedia.org/wiki/Cartesian_product - 可以写成
E^K(或ExEfor K=2 )。
标签: algorithm iteration combinations permutation variable-length