2017-12-13 33 views
-1

작은 알고리즘을 작성 중이므로 반복하지 않고 배열의 항목 조합을 모두 계산해야합니다. 지금까지이 코드를 아래에서 사용했지만 지금은 너무 오래 걸리기 때문에이 프로세스의 속도를 높여야합니다. Swift (코드가 Mac에서 실행 됨)와 동시성을 구현하려고 시도했지만 불행히도 작동하지 않습니다.스위프트를 사용하여 멀티 스레딩 배열의 항목 조합

내가 사용하고있는 알고리즘은 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) 

주, 나는 아직 동시성을 도입하지 않은,하지만이 같은 알고리즘으로, 내가있는 한 그렇게 할 이유가없는 그 무언가 같이 산출 여기서 계산적으로 집중적 인 것은 없습니다. 성능을 향상시키기 위해 동시성을 유지하려면 여러 스레드를 관리하는 오버 헤드를 상쇄하기 위해 각 스레드에서 충분한 작업이 필요합니다. 이 실행 코드를 병렬로 작성하면 각 파견 코드에서 실행중인 코드가 충분하지 않으면 실제로 속도를 저하시킬 수 있습니다.

루틴에 동시성을 도입하려는 경우 가장 좋은 방법 중 하나는 concurrentPerform입니다. (예를 들어, https://stackoverflow.com/a/39949292/1271826을 참조하십시오.) 그러나 이것은 까다로울 것입니다 (비 재귀 알고리즘에 대해 최선을 다합니다). 게다가, 나는 여기에서 그것을 할 필요성을 보지 못했다.