05.01.181 Двоичный поиск - justjune/AiSD2026 GitHub Wiki

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

Как работает двоичный поиск?

Этот алгоритм позволяет быстро найти элемент q в отсортированном массиве S. Мы сравниваем q с серединным элементом массива S. Если q больше этого элемента, то дальше работаем только с правой частью массива (от середины и до конца), а левую отбрасываем. Если q меньше серединного элемента, то работаем только с левой частью массива( от начала и до середины), а правую отбрасываем. Рекурсивно повторяем эти действия и таким образом находим q.

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

Пример кода

// low - нижняя граница(она же левая) списка(массива или другого хранилища данных)
// high - верхняя граница( она же правая)
//key - искомый объект(число, строка и тд и тп)
int bin_search(item_type s[], item_type key, int low, int high) {
    int middle = (low + hight) / 2; //середина
    if (low > high) { // проверка корректности нижней и верхней границы
        return -1;
    }
    if (s[middle] == key) {//если середина и есть искомый объект
        return(middle);
    }
    if (s[middle] > key) {
        return(bin_search(s, key, low, middle - 1));// middle - 1 потому что середина уже учлась выше
    }
    else {
        return(bin_search(s, key, middle + 1, high));
    }
}

Примеры применения

Двоичный поиск идеально подходит для поиска корней уравнения f(x)=0. Взять два числа t и s для которых f(t) и f(s) будут иметь разные знаки. Для непрерывной функции корень будет находиться в интервале между t и s. Для поиска корня здесь отлично помогает двоичный поиск.

Литература

[ Скиена 2022 с. 181]