java - 我如何并行化这个 DFS?
问题描述
我有一棵二叉树,其中每个节点的值为 0 或 1,从root
叶节点到叶节点的每条路径都代表一个一定长度的二进制字符串。该程序的目的是找到所有可能的二进制文件(即从到叶子String
的所有可能路径)。root
现在我想将它并行化,以便它可以使用多个内核。我假设我需要以某种方式拆分分支节点上的工作负载,但我不知道从哪里开始。我正在查看ForkJoin
功能,但我不知道如何拆分工作然后将其组合起来。
public class Tree{
Node root;
int levels;
Tree(int v){
root = new Node(v);
levels = 1;
}
Tree(){
root = null;
levels = 0;
}
public static void main(String[] args){
Tree tree = new Tree(0);
populate(tree, tree.root, tree.levels);
tree.printPaths(tree.root);
}
public static void populate(Tree t, Node n, int levels){
levels++;
if(levels >6){
n.left = null;
n.right = null;
}
else{
t.levels = levels;
n.left = new Node(0);
n.right = new Node(1);
populate(t, n.left, levels);
populate(t, n.right, levels);
}
}
void printPaths(Node node)
{
int path[] = new int[1000];
printPathsRecur(node, path, 0);
}
void printPathsRecur(Node node, int path[], int pathLen)
{
if (node == null)
return;
/* append this node to the path array */
path[pathLen] = node.value;
pathLen++;
/* it's a leaf, so print the path that led to here */
if (node.left == null && node.right == null)
printArray(path, pathLen);
else
{
/* otherwise try both subtrees */
printPathsRecur(node.left, path, pathLen);
printPathsRecur(node.right, path, pathLen);
}
}
/* Utility function that prints out an array on a line. */
void printArray(int ints[], int len)
{
int i;
for (i = 0; i < len; i++)
{
System.out.print(ints[i] + " ");
}
System.out.println("");
}
}
解决方案
您可以使用线程池在单独的线程之间有效地分配负载。
一种可能的方法:
ExecutorService service = Executors.newFixedThreadPool(8);
Runnable recursiveRunnable = new Runnable() {
@Override
public void run() {
//your recursive code goes here (for every new branch you have a runnable (recommended to have a custom class implementing Runnable))
}
};
service.execute(recursiveRunnable);
但是,这种方法不再是第一次深度搜索,因为您在搜索第一个之前列出了您职位的子分支。据我了解,DFS 是一种严格的线性方法,因此不能完全并行化(尽管请在评论中纠正我)。
推荐阅读
- keycloak - 我们如何在本地 keycloak 中使用电子邮件模板中的图像
- javascript - PayPal Express Checkout 按钮,在 onClick 上进行验证
- scripting - 如何通过另一个脚本调用一个 tcl 脚本并传递参数?
- javascript - SyntaxError:JSON.parse:JSON 数据的第 1 行第 1 列出现意外字符,同时将第二个参数添加到 Fetch 函数
- python - 在树莓派上使用 pip 安装时间很慢
- reactjs - 带有reactjs的范围滑块 - 值改变但滑块不移动
- html - 如何在闪亮的上下文中使用 HTML 代码加粗或可能增加 sprintf 的字体大小
- dynamic - Power Query:具有聚合列动态列表的 Table.Group
- discord.py - ctx 是缺少的必需参数
- javascript - D3 无法读取未定义的属性“alphaTarget”