【问题标题】:Parallelize Convert Sorted Array to Binary Search Tree Function并行化将排序数组转换为二叉搜索树函数
【发布时间】:2016-08-14 23:16:28
【问题描述】:

我正在尝试在 Java 中并行化我的 Convert Sorted Array to BST 程序。因为我的函数以分而治之的方式运行,我相信它是可并行的,但一直坚持实现。如果你们能告诉我如何在这里应用 threads 将会非常有帮助。

提前致谢!

// Definition for a binary tree node.
public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

public class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        if (nums == null) {
            return null;
        }
        return sortedArrayToBST(nums, 0, nums.length - 1);
    }

    private TreeNode sortedArrayToBST(int[] nums, int start, int end) {
        if (start > end) {
            return null;
        }

        int mid = start + (end - start) / 2;
        TreeNode node = new TreeNode(nums[mid]);
        node.left = sortedArrayToBST(nums, start, mid - 1);
        node.right = sortedArrayToBST(nums, mid + 1, end);

        return node;
    }
}

【问题讨论】:

  • 一种选择是使用ForkJoinPool
  • @Andreas 酷!看起来分而治之是 ForkJoinPool 的完美用例。

标签: java arrays multithreading parallel-processing binary-search-tree


【解决方案1】:

正如 Andreas 在 cmets 中建议的那样,您可以使用 forkjoinpool 来并行化二叉树的创建

 class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

class Task extends RecursiveTask<TreeNode>
{
    int[] nums;
    int start,end;
    public Task(int[] nums,int start,int end)
    {
        this.nums =nums;
        this.start = start;
        this.end = end;
    }
    protected TreeNode compute()
    {
        if(start>end)
        {
            return null;
        }
        int mid = start + (end - start) / 2;
        TreeNode node = new TreeNode(nums[mid]);
        Task leftSubTask = new Task(nums,start,mid-1);
        Task rightSubTask = new Task(nums,mid+1,end);
        leftSubTask.fork();
        rightSubTask.fork();
        node.left = leftSubTask.join();
        node.right = rightSubTask.join();
        return node;

    }
}
class Main
{
    public static void main (String[] args) throws java.lang.Exception
    {
        // your code goes here
        int nums[] = {1,5,7,8,9};
        Task task = new Task(nums,0,nums.length-1);
        ForkJoinPool forkJoinPool = new ForkJoinPool(4);
        TreeNode root = forkJoinPool.invoke(task);
    }
}

【讨论】:

  • 感谢您的回答。我检查了ForkJoinPool API,发现这个例子可以完美地与 ForkJoinPool 一起工作。我想知道的一件事是,如果我们必须包含Threshold 来定义我们停止划分进一步任务的点?因为有些教程提到创建子任务太贵了?
  • 是的,由于开销,创建子任务很昂贵。如果树的深度很小,最好以非并行递归的方式创建它。在这种情况下,您可以根据当前迭代中的节点数定义阈值(对于 n 个节点,深度为 log(n) )。如果您想要精确的点,那么您必须使用实验找出。
猜你喜欢
  • 1970-01-01
  • 2020-12-28
  • 2018-11-05
  • 2013-11-13
  • 2013-04-17
  • 1970-01-01
  • 2014-12-29
  • 1970-01-01
  • 2017-12-05
相关资源
最近更新 更多