【发布时间】:2012-11-02 04:24:59
【问题描述】:
我不确定如何分发递归程序。现在它是递归的并作为单个程序运行,但我的目标是将该程序分发给仅生成数据子集的其他机器。
这是该计划的背景。我给它一个目标(在本例中为 10)和一个具有最小/最大权重的项目列表,它返回每个项目的组合。
所以有3个项目,并且
Low = 2, 2, 2
high = 6, 6, 6
Target = 10
结果是:
2 2 4
2 3 3
2 4 2
3 2 3
3 3 2
4 2 2
这是完成工作的方法:
void distribute (int i, int [] low, int [] high, final int rest, int [] sizes) {
// System.out.println (i + " " + rest + " " + sizes);
if (i == sizes.length - 1) {
if (rest < high [i]) {
sizes[i] = rest;
result.add (Arrays.copyOf (sizes, sizes.length));
}
}
else
for (int c = 0;
c <= java.lang.Math.min (high [i] - low [i], rest);
++c) {
sizes [i] = c;
distribute (i + 1, low, high, rest - c, sizes);
}
}
我想知道是否有人对如何分发输出有任何想法,所以在上面的示例中,如果我有 3 个服务器,每个服务器只生成 2 个唯一条目,而不必生成整个内容。比如说,我事先知道会有 6 个结果,并且希望将 2 个结果分发到每台机器上,我该怎么做。有可能吗?如果有,逻辑是什么?
如果有帮助,这是整个程序:http://pastebin.com/RikqPgKh
【问题讨论】:
-
你没有写出你想要达到的目标。程序是做什么的?
-
它有点特定于域,但目标是获得等于特定数字(在本例中为 10)同时有界(在本例中为 min-2 和 max-6)的不同数字组合.此输出提供给其他程序。
-
如果这是实际的问题陈述,那么通过分发它是否可以实现任何性能提升尚不清楚。您需要做的是在每个递归级别决定您是要生成新线程还是使用现有线程。您可以在每个级别生成,但创建和管理所有这些线程的开销将淹没您正在执行的实际处理。如果真正的问题要复杂得多并且涉及 I/O(线程必须等待大量时间),那么使用固定大小的线程池进行线程化可能会提高性能。
-
据我所知,这是子集总和,这是 NP 难的......并不是说它应该阻止你解决。不过,使用约束可能会更容易。