Каковы преимущества множества (Set) над массивом (Array) в Swift?

«Каковы преимущества множества (Set) над массивом (Array) в Swift?» — вопрос из категории Алгоритмы и структуры данных, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Множество (Set<Element>) предоставляет существенные преимущества перед массивом (Array<Element>) для определенных операций благодаря своей реализации на основе хэш-таблицы.

Основные преимущества Set:

  1. Гарантированная уникальность элементов: Автоматическое удаление дубликатов при вставке.

    let arrayWithDuplicates = [1, 2, 2, 3, 3, 3]
    let uniqueSet = Set(arrayWithDuplicates) // [1, 2, 3] (порядок может быть любым)
  2. Сверхбыстрый поиск (O(1) в среднем): Проверка наличия элемента (contains) выполняется за константное время.

    let largeSet = Set(1...1000000)
    largeSet.contains(999999) // ~O(1) - очень быстро
    
    let largeArray = Array(1...1000000)
    largeArray.contains(999999) // O(n) - линейный поиск, медленно
  3. Эффективные операции теории множеств:

    let a: Set = [1, 2, 3, 4]
    let b: Set = [3, 4, 5, 6]
    
    a.union(b)        // [1, 2, 3, 4, 5, 6] - объединение
    a.intersection(b) // [3, 4]           - пересечение
    a.subtracting(b)  // [1, 2]           - разность
    a.symmetricDifference(b) // [1, 2, 5, 6] - симметрическая разность
  4. Быстрая вставка и удаление: В среднем O(1) против O(n) для массива (если не в конец).

Когда использовать Array:

  • Порядок элементов важен.
  • Нужны частые обращения по индексу.
  • Допустимы или требуются дубликаты.
  • Частое добавление/удаление в конец коллекции.

Пример выбора структуры:

// Поиск уникальных тегов у статьи
let articleTags = ["swift", "ios", "xcode", "swift", "concurrency"]
let uniqueTags = Set(articleTags) // Убираем дубликаты

// Проверка, есть ли у пользователя доступ к фиче
let allowedUserIDs: Set<Int> = [101, 205, 308, 412]
if allowedUserIDs.contains(currentUserID) {
    grantAccess()
}

// Если порядок тегов важен для отображения, используем Array
let orderedUniqueTags = Array(uniqueTags).sorted()