Наиболее эффективный метод, использующий нотацию Big O, чтобы избежать нескольких циклов forEach - PullRequest
0 голосов
/ 01 мая 2020

Я создал эти два объекта:

struct Person {
    let name: String
    let genderId: Int

}

struct Gender {
    let id: Int
    let sex: String
}

и создал эти массивы:

let persons = [
    Person(name: "Steve", genderId: 1),
    Person(name: "Kate", genderId: 2),
    Person(name: "Mark", genderId: 1),
    Person(name: "Pam", genderId: 2)

]

let genders = [
    Gender(id: 1, sex: "girl"),
    Gender(id: 2, sex: "boy"),
]

Какой должен быть наиболее эффективный алгоритм, использующий нотацию большого О для создания массив объектов, основанный на этом новом объекте:

struct PersonWithGenderString {
    let name: String
    let genderString: String
}

Я уже написал этот метод, используя два цикла forEach, но я ищу способ, который выполняет итерацию как можно меньше времени:

persons.forEach { (person) in
    genders.forEach { (gender) in
        if person.genderId == gender.id {
            let personWithGenderString = PersonWithGenderString(name: person.name, genderString: gender.sex)
            print(personWithGenderString)
        }

    }
}

1 Ответ

0 голосов
/ 01 мая 2020

Если вы храните объекты Gender по порядку Gender.id в массиве genders, что, как вам кажется, вы делаете, вы можете получить к ним доступ напрямую, вместо использования внутреннего l oop:

persons.forEach { (person) in
    let genderIndex = person.genderId - 1
    if genderIndex < 0 || genderIndex > genders.size {
       // handle this error (array out of bounds)
    }
    let personWithGenderString = PersonWithGenderString(name: person.name, genderString: genders[genderIndex].sex)
    print(personWithGenderString)
}

Это будет O (1) для преобразования любого конкретного Person в PersonWithGenderString и O (n) для преобразования n Person s в n PersonWithGenderString s

...