使用Swift将数组中的项与多线程进行组合

使用Swift将数组中的项与多线程进行组合,swift,multithreading,concurrency,combinations,combinatorics,Swift,Multithreading,Concurrency,Combinations,Combinatorics,我正在写一个小算法,我必须不重复地计算数组中所有项目的组合。到目前为止,我已经使用了下面的代码,但我现在需要加快这个过程,因为它需要太长的时间。 我曾尝试用Swift实现并发(代码将在Mac上运行),但不幸的是,它不起作用 我使用的算法是从C中提取出来的,然后从C转换成Swift。 你能帮我解决这个问题吗 func printCombination(arr: [Int], r: Int) { trips.removeAll() var data: [Int] = [] f

我正在写一个小算法,我必须不重复地计算数组中所有项目的组合。到目前为止,我已经使用了下面的代码,但我现在需要加快这个过程,因为它需要太长的时间。 我曾尝试用Swift实现并发(代码将在Mac上运行),但不幸的是,它不起作用

我使用的算法是从C中提取出来的,然后从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[]     */
func打印组合(arr:[Int],r:Int){
trips.removeAll()
变量数据:[Int]=[]
对于1…r中的uu
{
data.append(Int())
}
combinationUtil(arr:arr,r:r,索引:0,数据:data,i:0)
}
func combinationUtil(arr:[Int],r:Int,index:Int,data:[Int],i:Int){
变量数据:[Int]=数据
如果(索引==r)
{
对于0中的j..=arr.count){
返回
}
数据[索引]=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[]-->输入阵列
r--->要打印的组合的大小
索引--->数据中的当前索引[]
data[]-->用于存储当前组合的临时数组
i--->当前元素在arr[]中的索引*/

您说您的示例中的上述代码“运行良好”,但我不知道如何,因为您引用了一些不在此代码段中的变量(
trips
array
),而您只是在
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)
注意,我还没有引入任何并发性,但是对于这样的算法,我认为没有理由这样做,因为这里没有计算密集型。为了提高性能,需要在每个线程上进行足够的工作来抵消管理多个线程的开销。并行运行此代码实际上可以使其成为slo如果您没有足够的代码在每个已调度的代码段上运行,我们将拒绝


如果要在例程中引入并发性,最好的方法之一是使用
concurrentPerform
(参见示例)。但这将是一个棘手的问题(它最适合非递归算法)。此外,我不认为有必要在这里这样做。

你能转成“它不工作”吗变成有用的东西?你希望发生什么,而不是发生什么?你真的熟悉Swift吗?这段代码看起来就像是从C语言逐行移植过来的。而且,这段代码中没有并发代码……对于Phillip Mills来说,上面的代码工作得很好,我尝试实现并发是因为我希望它同时计算组合,它实际上没有做任何事情,代码运行时没有抛出错误。对于Dávid Pászor,我已经学习Swift大约一年了,但我从来没有编写过需要优化的算法,所以我没有太多经验。因为我必须在很短的时间内完成这段代码,所以我没有unately必须将代码逐行移植到Swift。我发布的代码是我正在使用的没有并发性的代码。我想向其添加并发性,或者编写一个完全不同的代码来使用并发性解决问题。“我尝试过实现并发性”如何实现?您发布的代码中没有并发性。