Что такое алгоритм бинарного поиска?

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

Ответ

Бинарный поиск — это алгоритм поиска элемента в отсортированном массиве с временной сложностью O(log n). Он работает по принципу «разделяй и властвуй», постоянно уменьшая область поиска вдвое.

Ключевые принципы:

  1. Требование: Массив должен быть отсортирован.
  2. Процесс: Алгоритм сравнивает искомый элемент со средним элементом текущего диапазона.
  3. Результат: Если элементы равны — поиск завершен. Если искомый элемент меньше — поиск продолжается в левой половине, если больше — в правой.

Пример реализации на Swift (итеративный подход):

func binarySearch<T: Comparable>(_ array: [T], for key: T) -> Int? {
    var low = 0
    var high = array.count - 1

    while low <= high {
        let mid = low + (high - low) / 2 // Предотвращает потенциальное переполнение
        if array[mid] == key {
            return mid // Элемент найден
        } else if array[mid] < key {
            low = mid + 1 // Искать в правой половине
        } else {
            high = mid - 1 // Искать в левой половине
        }
    }
    return nil // Элемент не найден
}

// Использование
let sortedNumbers = [1, 3, 5, 7, 9, 11]
let index = binarySearch(sortedNumbers, for: 7) // Вернет 3

Почему O(log n)? На каждом шаге алгоритм отбрасывает половину оставшихся элементов. Для массива из n элементов максимальное число сравнений равно log₂(n).

Применение: Поиск в отсортированных коллекциях, нахождение границ, реализация в стандартных библиотеках (например, Array.firstIndex(of:) для RandomAccessCollection).