Site icon AppTractor

Array или Set для 10 тыс. элементов в Swift — вопросы с собеседования

Я был на собеседовании по iOS. Всё шло хорошо — я ответил на вопрос об optional, рассказал об ARC и даже решил небольшую задачу с замыканиями.

Затем интервьюер откинулся назад и спросил:

Предположим, вам нужно загрузить 10,000 элементов в Swift. Что бы вы использовали: Array или Set?

Сначала я совсем растерялся. Массивы? Я использую их каждый день. Списки пользователей, модели продуктов, ответы API и источники данных табличных представлений — они повсюду в iOS.

Множества? Честно говоря, я использовал их только тогда, когда мне нужны были уникальные идентификаторы или когда я копировал что-то прямо со Stack Overflow.

Но вот в чём дело: это был вопрос не о синтаксисе. Вопрос был о том, как я думаю.

Почему интервьюеры это спрашивают

Это похоже на базовый вопрос о структурах данных, но это не так.

На самом деле, речь идёт о следующем:

Вот почему этот вопрос так популярен на собеседованиях. Он отличает людей, которые запоминают, от тех, кто умеет рассуждать.

Шаг 1: Не спешите с ответом

Вместо того, чтобы выпалить: «С множествами быстрее», я задал уточняющий вопрос:

«Что нам важнее — вставка, поиск или просто цикл по элементам?»

Интервьюер улыбнулся и сказал: «Хороший вопрос. Допустим, нас интересуют поиск».

Это дало мне нужную подсказку.

Шаг 2: Массивы в Swift

Массивы — это как любимая еда в Swift. Они просты, они повсюду, и вы уже знаете, как ими пользоваться.

Ключевые моменты:

Пример:

var numbers: [Int] = []

for i in 0..<10000 {
    numbers.append(i)
}
let exists = numbers.contains(5000) // O(n)
print("Contains 5000? \(exists)")

Массивы отлично подходят, когда:

Шаг 3: Множества в Swift

Множества кажутся менее привычными, но на самом деле они очень мощные.

Ключевые моменты:

Пример:

var numbers: Set<Int> = []

for i in 0..<10000 {
    numbers.insert(i)
}
let exists = numbers.contains(5000) // O(1) average
print("Contains 5000? \(exists)")

Наборы отлично подходят, когда:

Шаг 4: Бенчмарки в Swift

Я решил показать интервьюеру, как я буду это тестировать. Вот быстрый тест на Swift:

import Foundation

let array = Array(0..<10000)
let set = Set(0..<10000)
// Array lookup
var start = CFAbsoluteTimeGetCurrent()
for _ in 0..<10000 {
    _ = array.contains(9999)
}
var diff = CFAbsoluteTimeGetCurrent() - start
print("Array lookup: \(diff) seconds")
// Set lookup
start = CFAbsoluteTimeGetCurrent()
for _ in 0..<10000 {
    _ = set.contains(9999)
}
diff = CFAbsoluteTimeGetCurrent() - start
print("Set lookup: \(diff) seconds")

Что тут происходит:

Примерно для 10,000 элементов оба варианта всё ещё быстры. Но если увеличить до 1 миллиона, множества полностью разгромят массивы.

Шаг 5: Реальные примеры для iOS

Вот где вы набираете очки на собеседованиях: свяжите теорию с разработкой для iOS.

Где я бы использовал массив в iOS:

Где я бы использовал набор:

Это сделает ваш ответ реалистичным, а не просто теоретическим.

Шаг 6: Мой окончательный ответ

Вот как я это подытожил:

«Если мне нужен быстрый поиск и уникальность, я бы использовал Set — .contains — это O(1). Если мне нужен порядок или дубликаты, то я бы использовал Array. Для итерации по всем 10,000 элементов Array может быть даже немного быстрее, поскольку он меньше занимает памяти. Для 10,000 оба варианта работают нормально, но я бы подумал о масштабируемости по мере роста данных».

Интервьюер кивнул. Это был сигнал, что я на правильном пути.

Шаг 7: Ловушка повторения

Он не закончил. Он спросил:

«Но 10 000 — это не так уж много. Разве это имеет значение?»

В этом и был весь трюк.

Я мог бы сказать: «Нет, это неважно», но это звучит лениво.

Вместо этого я сказал:

«Вы правы — для 10 тысяч элементов оба варианта хороши. Но я бы всё равно выбрал, исходя из будущих потребностей. Если массив вырастет до 10 миллионов, поиск по массиву станет очень медленным, но набор по-прежнему будет работать хорошо. Так что дело не только в сегодняшнем объёме».

Вот это и был настоящий успех.

Выводы

Для разработчиков на Swift вот краткое резюме:

Заключение

Это интервью меня кое-чему научило. На самом деле, речь идёт не о том, что лучше: Array или Set. Главное — показать, что вы умеете рассуждать, объяснять компромиссы и применять это на практике.

В следующий раз, когда услышите этот вопрос, не паникуйте. Просто объясните ход своих мыслей, при необходимости напишите небольшой пример и свяжите его с реальной разработкой для iOS.

Вот так простой вопрос о структуре данных превращается в ключевой ответ для трудоустройства.

Источник

Другие вопросы с собеседований

Exit mobile version