2017-08-11 5 views
2

並列プログラミングのためにcoursera scalaコースに参加しています。 Paranthesis Balancerを連続的にも並列的にも解決する課題があります。私は逐次関数を解いた。パラレル関数については、パラレルスレッド間で現在のパラントシスデータをどのように維持できるかについて疑問があります。ここで括弧バランサの並列処理を作成する

は私のシーケンシャル・ファンクションです:

def balance(chars: Array[Char]): Boolean = { 

    def helper(arr: Array[Char], acc: Int): Boolean = { 
     if (arr.isEmpty && acc ==0) 
     true 
     else if (arr.isEmpty || arr.head == ')' && acc <=0) 
     false 
     else if (arr.head == '(') 
     helper(arr.tail, acc +1) 
     else if (arr.head == ')') 
     helper(arr.tail, acc - 1) 
     else 
     helper(arr.tail, acc) 
    } 

    helper(chars, 0) 
    } 

今、私の全体のロジックは、ACC値に基づいています。これらを複数のスレッドに渡って実行する場合、私は何に焦点を当てるべきですか?パラレルメソッドには範囲の開始と終了のインデックスがあります。これまでに私が理解している唯一のことは、これらの操作のすべてがacc == 0であることです。

私にこの方向の指針を教えてください。原因コーセラルールに

おかげ

答えて

1

は、私はあなたの厳密解を与えるのではなく、いくつかの助言与えることはありません。

この割り当てが覚えているように、再帰結果に2つの値を使用することをお勧めします。通常、学生はこれが「(」と「数」)のカウントであると判断しますが、正しい解決策は別のものです。 - 現在のステップの

  • 最小「深さ」

    1. 現在のステップ= countOfのデルタ「(」countOf「)」:あなたは、各再帰段階上の2つの値を計算する必要があります。私。現在のチャンクで左から右へtravereseしようとすると、デルタの最小値。デルタ以下にすることができます。

    いくつかの例(これはいくつかの中間段階であると想像): "((())":= 0 デルタ= 0、minDepth ")))(":デルタ= -2、minDepth = -3

    次に、典型的な並列トラバースを行った後、あなたは正しくこれらの2つの値を削減する必要があります。これは、簡単に自分で推測します。

    バランス場合は、最終的には(0,0)を取得します。

    そして例の場合) ")("あなたに(0、-1)を与えるでしょう

  • +0

    ありがとうございます。私は、テストケースの90%に合格した他のコンセプトを使って解決したと思います。私はそれを再度提出できるかどうかは確かではありませんが、このアプローチを間違いなく試みます。 – kromastorm

    関連する問題