← Назад к вопросам

Что такое бинарный поиск?

1.0 Junior🔥 82 комментариев
#Коллекции и структуры данных

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое бинарный поиск?

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

Основные принципы работы

  1. Отсортированность данных — обязательное условие, так как алгоритм использует информацию о порядке элементов для принятия решения.
  2. Двоичное деление — на каждом шаге интервал поиска сокращается вдвое.
  3. Рекурсия или итерация — может быть реализован обоими способами.

Пошаговый алгоритм (на примере возрастающего массива)

  1. Определяем начальные границы поиска: low = 0, high = n - 1 (где n — длина массива).
  2. Пока low <= high:
    • Вычисляем средний индекс: mid = low + (high - low) / 2 (для избежания переполнения).
    • Если array[mid] == target, возвращаем mid (элемент найден).
    • Если array[mid] < target, сужаем поиск к правой половине: low = mid + 1.
    • Если array[mid] > target, сужаем поиск к левой половине: high = mid - 1.
  3. Если цикл завершился, элемент не найден (возвращаем -1 или nil).

Пример реализации на Swift

func binarySearch<T: Comparable>(_ array: [T], _ target: T) -> Int? {
    var low = 0
    var high = array.count - 1
    
    while low <= high {
        let mid = low + (high - low) / 2
        
        if array[mid] == target {
            return mid
        } else if array[mid] < target {
            low = mid + 1
        } else {
            high = mid - 1
        }
    }
    
    return nil
}

// Использование
let sortedNumbers = [1, 3, 5, 7, 9, 11, 13]
if let index = binarySearch(sortedNumbers, 7) {
    print("Элемент найден на индексе \(index)") // Вывод: Элемент найден на индексе 3
} else {
    print("Элемент не найден")
}

Вариации бинарного поиска

  • Поиск первого/последнего вхождения — модификации для работы с дубликатами.
  • Поиск в вращённом отсортированном массиве — адаптация для частично отсортированных данных.
  • Поиск ближайшего элемента — если точного совпадения нет.

Преимущества и недостатки

Преимущества:

  • Высокая эффективность для больших данных.
  • Простота реализации.
  • Широкий спектр применений (поиск в базах данных, файлах, играх).

Недостатки:

  • Требует отсортированных данных.
  • Неэффективен для маленьких массивов из-за накладных расходов.
  • Не подходит для часто изменяемых данных, так как поддержание сортировки требует ресурсов.

Применение в iOS-разработке

В контексте iOS-разработки бинарный поиск используется:

  • В UI-компонентах типа UITableView или UICollectionView для быстрого поиска данных.
  • При работе с отсортированными Core Data выборками.
  • В алгоритмах автодополнения поисковых запросов.
  • Для оптимизации обработки кэшированных данных (например, изображений).
// Пример поиска в отсортированном массиве пользователей
struct User: Comparable {
    let id: Int
    let name: String
    
    static func < (lhs: User, rhs: User) -> Bool {
        return lhs.id < rhs.id
    }
}

let users = [User(id: 1, name: "Анна"), User(id: 2, name: "Борис"), User(id: 3, name: "Виктор")]
let targetUser = User(id: 2, name: "Борис")
if let userIndex = binarySearch(users, targetUser) {
    print("Пользователь найден: \(users[userIndex].name)")
}

Бинарный поиск является фундаментальным алгоритмом, который каждый разработчик должен понимать и уметь применять. Его знание часто проверяется на технических собеседованиях, так как оно демонстрирует понимание алгоритмической эффективности и умение работать с структурами данных.

Что такое бинарный поиск? | PrepBro