Пересечение 2-х массивов и выполнение операции на каждом - PullRequest
0 голосов
/ 09 июня 2018

Приведенный ниже код успешно берет список имен избранных и сопоставляет его с меньшим списком имен, и при каждом совпадении или несовпадении создается новая структура данных, указывающая, был ли он предпочтительным.(Однако это кажется (N ^ 2) сложностью)

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

Есть ли лучший способ сделать это, который может масштабировать до 10 с тысяч, скажем, до N или NLogN?

1 Ответ

0 голосов
/ 10 июня 2018

Вы можете использовать Set коллекцию.Он предоставляет эффективные способы взаимодействия с коллекциями.Подробнее здесь .

Обновленный код:

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)

Вы можете сгенерировать много данных и сравнить мой метод и ваш.Я думаю, что мой метод победит.

...