1

我想將我的Convert Sorted Array轉換爲Java中的BST程序。因爲我的函數以分而治之的方式運行,所以我認爲它是可並行化的,但一直堅持實現。如果你們能告訴我如何在這裏申請線程,這將是非常有幫助的。並行化將分類數組轉換爲二進制搜索樹功能

在此先感謝!

// 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; 
    } 
} 
+0

一種選擇是使用['ForkJoinPool'(https://docs.oracle。 COM/JavaSE的/ 7 /文檔/ API/JAVA/util的/並行/ ForkJoinPool.html)。 – Andreas

+0

@Andreas酷!看起來Divide and Conquer是ForkJoinPool的完美用例。 – gyoho

回答

0

如安德烈亞斯在評論中建議,你可以使用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); 
    } 
} 
+0

感謝您的回答。我查看了[ForkJoinPool](https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ForkJoinPool.html)API,發現這個例子可以和ForkJoinPool完美配合。我想知道的一件事是,如果我們必須包含'Threshold'來定義我們停止劃分更多任務的點?因爲一些教程提到創建子任務非常昂貴? – gyoho

+0

是的,創建子任務是因爲開銷太大而造成的。如果樹的深度很小,最好用非並行遞歸方法創建它。在這種情況下,您可以根據當前迭代中節點的數量定義閾值(對於n個節點,深度爲log(n))。如果您需要精確點,則必須使用實驗找出結果。 –