2个阵列的交叉点和每个阵列的操作

时间:2018-06-09 13:19:42

标签: swift algorithm collections

下面的代码成功获取了收藏夹名称列表,并将其与较小的名称列表相匹配,并且在每次匹配或不匹配时,它会创建一个新的数据结构,指示它是否有利。 (但这似乎是(N ^ 2)复杂性)

listOfNames.forEach {
    var faved = false
    if namesFavorited.contains($0) {
        faved = true
    }
    let model = DetailNameModel(name: $0, favorited: faved)
    detailNameModelArray.append(model)
}

有没有更好的方法来做到这一点,可以SCALE到成千上万的人说N或NLogN?

1 个答案:

答案 0 :(得分:1)

您可以使用Set集合。它提供了与集合交互的有效方法。更多细节here

更新代码:

let listOfNames: Set = ["name1", "name2", "name3", "name4", "name5", "name6", "name7", "name8"]
let namesFavorited: Set = ["name2", "name3", "name5", "name6", "name8", "name9", "name10", "name11"]

let nonFav = listOfNames.subtracting(namesFavorited) // O(m*n)
let fav = listOfNames.intersection(namesFavorited) // O(m*n)

var detailNameModelArray: [DetailNameModel] = []

let nonFavDetailNames = nonFav.map { // O(nonFav.count)
    DetailNameModel(name: $0, favorited: false)
}
detailNameModelArray.append(contentsOf: nonFavDetailNames)

let favDetailNames = fav.map { // O(fav.count)
    DetailNameModel(name: $0, favorited: true)
}
detailNameModelArray.append(contentsOf: favDetailNames)

print(detailNameModelArray) // O(fav.count)

您可以生成大量数据并比较我的方法和您的方法。我认为我的方法会赢。