【发布时间】:2017-09-13 22:20:27
【问题描述】:
我已经实现了一个算法,它在 Y 框中写出 X 项的所有可能组合(在组合学中,我相信它们被称为组合)。我使用递归函数编写了这个算法,因为它更容易跟踪我们正在放入项目的当前盒子以及剩余的项目数量。 这个算法给了我以下输出(4个盒子和3个项目):
[3, 0, 0, 0], [2, 1, 0, 0], [2, 0, 1, 0], [2, 0, 0, 1], [1, 2, 0, 0], [1, 1, 1, 0], ..., [0, 0, 1, 2], [0, 0, 0, 3]
您可以想象,对于较大的 X 和 Y,合成的数量会增加很多。由于我不关心输入的顺序,我想并行化进一步的计算,但我不能这样做在递归函数上(我尝试通过保存递归状态来做到这一点,但这相当混乱,尽管它可以工作,但它真的很慢)。
所以,我想知道是否可以迭代地重写相同的函数(使用for 循环),以便我可以并行化它。 (要记住的一点是,优化也很重要,因为我需要运行大 X 和 Y 的函数)我的递归函数写在下面:
public void charArrangements (int boxes, int items, String strBuild) {
if (boxes > 1) {
for (int i = 0; i <= items; i++) {
String ss = strBuild + (items - i) + ";";
charArrangements(boxes - 1, i, ss);
}
}
else {
String ss = strBuild + items;
List<Integer> charArrangement = new ArrayList<Integer>();
charArrangement = Stream.of(ss.split(";")).map(Integer::parseInt).collect(Collectors.toList());
doCalculations(charArrangement);
}
}
【问题讨论】:
-
假设 fw 是一个文件,你很可能会受到 IO 性能的限制,所以并行化可能没有多大帮助。
-
这不是重点。我正在通过写出来测试该功能。无论如何我都不应该把它写出来,因为对于大 X 和 Y,文件会变得非常庞大,而我没有足够的空间来写。实际上,在该 try/catch 块中会有计算。
-
很公平!虽然你不能在初始调用
charArrangements时并行化循环吗?即你说你有 11 个项目,这意味着你可以有 11 个线程,每个线程处理不同的初始值items。 -
这似乎类似于 zmbq 的答案,但我不完全确定如何去做。如果我像你说的那样在最初的电话中这样做,我会得到 [2, 0], [1, 1], [0, 2] for 2 box, 2 items, [1, 0], [0, 1 ] 表示 2 个框,1 项,[0, 0] 表示 2 框,0 项。如果我对 2 个盒子和 2 件商品感兴趣,那么 1 或 0 件商品对我来说无关紧要。这意味着,我需要以某种方式在较低级别上并行化它,但我不完全确定如何做到这一点。
-
您需要在输出中包含所有结果吗?或者你能用一个一次吐出一个的迭代器来解决吗?还是随机均匀地随机选择一个结果的东西?还是只是可能性的总数?
标签: java algorithm recursion iteration