База знаний для подготовки к ОГЭ и ЕГЭ, проверенная Российской академией наук

Двоичный поиск в отсортированном массиве

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

undefined

Основные понятия

  • Отсортированный массив — упорядоченная последовательность элементов, в которой могут применяться методы эффективного поиска.
  • Ключ — значение, которое требуется найти в массиве.
  • Итерация — один шаг алгоритма, в котором диапазон поиска сокращается наполовину.

Алгоритм двоичного поиска

1. Инициализация границ поиска: устанавливаются начальные значения индексов — низший (low) и высший (high).

2. Определение среднего элемента: вычисляется средний индекс:

  

3. Сравнение со средним элементом:

  - Если значение по индексу mid равно ключу, то поиск завершается.
  - Если ключ меньше значения в mid, продолжаем поиск в левой половине массива.
  - Если ключ больше значения в mid, продолжаем поиск в правой половине массива.

4. Обновление границ и повтор: шаги 2-3 повторяются, пока низший индекс не превысит высший.

Важные аспекты реализации

  • Избежание переполнения: при вычислении среднего индекса рекомендуется использовать формулу mid = low + (high - low) // 2, чтобы предотвратить переполнение при больших размерах массива.
  • Корректная обработка границ: важно правильно определить условия цикла и обновление индексов, чтобы избежать зацикливания или выхода за пределы массива.
  • Работа с дубликатами: при наличии одинаковых элементов можно модифицировать алгоритм для нахождения первого или последнего вхождения ключа.

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

На Python

def binary_search(arr, key):
    low = 0
    high = len(arr) - 1

    while low <= high:
        mid = low + (high - low) // 2
        if arr[mid] == key:
            return mid  # Ключ найден
        elif arr[mid] < key:
            low = mid + 1
        else:
            high = mid - 1
    return -1  # Ключ не найден

На Java

int binarySearch(int[] arr, int key) {
    int low = 0;
    int high = arr.length - 1;

    while (low <= high) {
        int mid = low + (high - low) / 2;
        if (arr[mid] == key)
            return mid;  // Ключ найден
        else if (arr[mid] < key)
            low = mid + 1;
        else
            high = mid - 1;
    }
    return -1;  // Ключ не найден
}

Сложность алгоритма

  • Временная сложность: двоичный поиск выполняется за логарифмическое время — , где  — размер массива.
  • Пространственная сложность: алгоритм требует постоянной дополнительной памяти — .

Приложения

  • Поиск в структурах данных: эффективное нахождение элементов в больших отсортированных массивах и списках.
  • Численные методы: используется в методе бисекции для нахождения корней непрерывных функций.
  • Оптимизация: применяется для решения задач одномерной оптимизации и нахождения экстремумов функций.

Заключение

Двоичный поиск является фундаментальным алгоритмом с высокой эффективностью, обеспечивающей быстрое нахождение элементов в отсортированных структурах данных. Правильная реализация алгоритма с учётом деталей, таких как обработка границ и предотвращение переполнения, обеспечивает его надёжность и широкую применимость в различных областях информатики и математики.

Категории