生成给定集合的所有可能子集,不包括空集。 (未排序)

问题描述 投票:0回答:1

我注意到这个操作对于代码来说是昂贵的(

2^set.size
)。 我正在寻找最佳实践和实现,更有可能重新工作此代码进入无限循环并冻结应用程序直到完成

func subsets(set: Set<String>) -> Set<Set<String>> {
    if set.count == 1 { return [set] }
    let first = set.map { item -> Set<String> in
        var clone = set
        clone.remove(item)
        return clone
    }
    let second = first.map(generateSubsets)
    var subSets = second.reduce(Set<Set<String>>()) { accumulator, elements in
        var clone = accumulator
        for element in elements {
            clone.insert(element)
        }
        return clone
    }
    subSets.insert(set)
    return subSets
}

示例

用于输入

["qual1", "qual2", 'qual3"]

组合可以是:

["qual1#qual2#qual3", "qual1#qual2", "qual1#qual3", "qual2#qual3", "qual1", "qual2", "qual3"]

arrays swift subset
1个回答
0
投票
func subsets(set: Set<String>) -> Set<Set<String>> {
    var allSubsets: Set<Set<String>> = []
    let elements = Array(set)
    generateSubsets(set: elements, index: 0, currentSubset: Set<String>(), allSubsets: &allSubsets)
    return allSubsets
}

func generateSubsets(set: [String], index: Int, currentSubset: Set<String>, allSubsets: inout Set<Set<String>>) {
    allSubsets.insert(currentSubset)
    if index == set.count {
        return
    }
    for i in index..<set.count {
        var newSubset = currentSubset
        newSubset.insert(set[i])
        generateSubsets(set: set, index: i + 1, currentSubset: newSubset, allSubsets: &allSubsets)
    }
}

像这样使用它:

    let inputSet: Set<String> = ["qual1", "qual2", "qual3"]
    let result = subsets(set: inputSet)
© www.soinside.com 2019 - 2024. All rights reserved.