2017-12-13 20 views
-1

私は小さなアルゴリズムを書いており、繰り返しのない配列のアイテムのすべての組み合わせを計算する必要があります。今まで私は以下のコードを使用しましたが、時間がかかりすぎるため、このプロセスをスピードアップする必要があります。 私はSwift(コードはMac上で動作します)と並行処理を実装しようとしましたが、残念ながら動作しません。Swiftを使用してマルチスレッドで配列されたアイテムの組み合わせ

私が使用しているアルゴリズムはhttp://www.geeksforgeeks.org/print-all-possible-combinations-of-r-elements-in-a-given-array-of-size-n/から取得され、その後CからSwiftに変換されました。 この問題を解決するために私を助けてください。

func printCombination(arr: [Int], r: Int) { 
    trips.removeAll() 
    var data: [Int] = [] 
    for _ in 1...r 
    { 
     data.append(Int()) 
    } 
    combinationUtil(arr: arr, r: r, index: 0, data: data, i: 0) 
} 

func combinationUtil(arr: [Int], r: Int, index: Int, data: [Int], i: Int) { 
    var data: [Int] = data 
    if (index == r) 
    { 
     for j in 0..<r { 
      array.append(data[j]) 

     } 
     return 
    } 

    if (i >= arr.count) { 
     return 
    } 

    data[index] = arr[i] 
    combinationUtil(arr: arr, r: r, index: index + 1, data: data, i: i + 1) 
    combinationUtil(arr: arr, r: r, index: index, data: data, i: i + 1) 
} 
    /* arr[] ---> Input Array 
    r  ---> Size of a combination to be printed 
    index ---> Current index in data[] 
    data[] ---> Temporary array to store current combination 
    i  ---> index of current element in arr[]  */ 
+2

"機能しません"というものを役に立つものにすることはできますか?何が起こりたいのですか?代わりに何が起こりますか? –

+0

あなたは実際にスイフトに精通していますか?そのコードは、Cから移植された行ごとだけだったようです。 –

+0

Phillip Millsについては、上記のコードはうまくいきます。並行処理を実装しようとしました。これは、文字通り何もしなかったため、コードはエラーを投げずに実行されました。 –

答えて

0

あなたはあなたの例では上記のコードは、「正常に動作します」と言うが、あなたは、このコードスニペット(tripsarray)にはないいくつかの変数を参照してあなただけの追加しているか、私は表示されませんより多くの整数はarrayになります。

個人的には、C++/Javaコードのこのリテラルな翻訳から抜け出し、この概念的アルゴリズムをSwiftでどのように実装するのが最善の方法であるかに焦点を当てます。考え方は、配列から値を取り出し、それをデータセットに追加し、選択された値を取り除いて再帰的にルーチンを呼び出すことです。

func printCombinations(with combinationThusFar: [Int] = [], from array: [Int], size: Int, startingAt: Int = 0) { 
    if size == 0 { 
     print(combinationThusFar) 
     return 
    } 

    for i in startingAt ... array.count - size { 
     var remaining = array 
     remaining.remove(at: i) 
     printCombinations(with: combinationThusFar + [array[i]], from: remaining, size: size - 1, startingAt: i) 
    } 
} 

そして:それは何か得

let array = [1, 2, 3, 4, 5] 
printCombinations(from: array, size: 3) 

注意を、私はまだ並行性を導入していないが、このようなアルゴリズムで、私はそこにあるとしてそれをする理由を見ませんここでは計算的に集中的なものはありません。パフォーマンスを向上させる並行性のためには、複数のスレッドを管理するオーバーヘッドを相殺するために、各スレッドで十分な作業が必要です。この実行コードを並列にすると、各ディスパッチコードで十分なコードが実行されていないと、実際には実行速度を遅くすることができます。

ルーチンに並行性を導入しようとしている場合、最も良い方法の1つはconcurrentPerformです。 (例としてはhttps://stackoverflow.com/a/39949292/1271826を参照してください)しかし、これはここでは難しいでしょう(非再帰的アルゴリズムには最適です)。しかも、私はここでそれをする必要はないと思う。

関連する問題