【发布时间】:2013-10-19 13:36:06
【问题描述】:
给定一组数字,从 1 到 n,我需要对所有可能对的所有集合进行建模。
换句话说,一个绘制集合由所有数字组成。数字是成对的。如果计数是奇数 - 一个数字的条目是允许的(实际上它是必需的)。集合需要是唯一的,即对 [1,2] 与 [2,1] 相同(编辑:和解决方案:[1,2] [3,4] 与 [3,4] [1, 2])。
例如,当 n 等于 5 时,可以创建以下集合:
[1,2] [3,4] [5]
[1,2] [3,5] [4]
[1,2] [4,5] [3]
[1,3] [2,4] [5]
[1,3] [2,5] [4]
[1,3] [4,5] [2]
....
我几乎可以对解决方案进行建模,但唯一性约束对我来说很难实现。
此外 - 我觉得我的解决方案缺乏性能。我现在问题空间很大,但对我来说,即使是 n=12 的计算也需要 5 分钟以上。
public void compute(HashSet<Number> numbers, ArrayList<Pair> pairs) {
if (numbers.size() <= 1) {
print(pairs);
} else {
for (Number number1 : numbers) {
for (Number number2 : numbers) {
if (number1 != number2) {
Set<Number> possibleNumbers = new HashSet<Number>(numbers);
List<Pair> allPairs = new ArrayList<Pair>(pairs);
possibleNumbers.remove(number1);
possibleNumbers.remove(number2);
allPairs.add(new Pair(number1, number2));
compute(possibleNumbers, allPairs);
}
}
}
}
}
compute(numbers, new ArrayList<Pair>());
对于 n=3,我得到双倍的解决方案:
[0 1] [2]
[0 2] [1]
[1 0] [2]
[1 2] [0]
[2 0] [1]
[2 1] [0]
那么:我应该如何解决这个问题以消除重复。如何改进实施以加快处理速度?
【问题讨论】:
-
您有实际问题吗?
-
问了。谢谢指点。
-
对的顺序重要吗?
[1 2] [3 4]和[3 4] [1 2]一样吗? -
没关系。两种解决方案都是一样的
-
“一组从 1 到 n 的数字”是指没有重复项吗?即 1 到 5 总是 1,2,3,4,5 而不是 1,1,3,4,5?
标签: java math combinations probability