Двоичный поиск: различия между версиями

Материал из Поле цифровой дидактики
 
(не показаны 3 промежуточные версии этого же участника)
Строка 8: Строка 8:
# Процесс продолжается до тех пор, пока не будет найден элемент со значением ключа или не станет пустым интервал для поиска.
# Процесс продолжается до тех пор, пока не будет найден элемент со значением ключа или не станет пустым интервал для поиска.


=== Диаграмма бинарного поиска ===
Алгоритм бинарного поиска в интервале 1 - 12
{{#mermaid:graph TB
A[1-6] --> |Да| B[1-3]
A --> |Нет| C[7-9]
B --> |Да| D[1-2]
B --> |Нет| E[4-5]
D --> |Да| 1
D --> |Нет| 3
1 -->  |Нет| 2
E --> |Нет| 6
E --> |Да| 4
4 -->  |Нет| 5
C -->|Да| F[7-8] 
C -->|Нет| G[10-11] 
F --> |Да| 7
7 --> |Нет| 8
F --> |Нет| 9
G --> | Да | 10
10 --> | Нет| 11
G --> | Нет| 12
}}
*  [[Binary search (diagram)]] - варианты с определением месяцев в [[Graphviz]]


== Пример реализации на Java ==
== Пример реализации на Java ==

Текущая версия на 16:03, 9 ноября 2023

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

Поиск элемента в отсортированном массиве

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

Диаграмма бинарного поиска

Алгоритм бинарного поиска в интервале 1 - 12

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

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

    while (low <= high) {
        int mid = (low + high) >>> 1;
        int midVal = arr[mid];

        if (midVal < key)
            low = mid + 1;
        else if (midVal > key)
            high = mid - 1;
        else
            return mid; // key found
    }
    return -(low + 1);  // key not found.
}

Приложения

Практические приложения метода двоичного поиска разнообразны:

  • Широкое распространение в информатике применительно к поиску в структурах данных. Например, поиск в массивах данных осуществляется по ключу, присвоенному каждому из элементов массива (в простейшем случае сам элемент является ключом).
  • Также его применяют в качестве численного метода для нахождения приближённого решения уравнений (см. Метод бисекции).
  • Метод используется для нахождения экстремума целевой функции и в этом случае является методом условной одномерной оптимизации. Когда функция имеет вещественный аргумент, найти решение с точностью до [math]\displaystyle{ \varepsilon }[/math] можно за время [math]\displaystyle{ \log_2 1 / \varepsilon }[/math]. Когда аргумент дискретен, и изначально лежит на отрезке длины N, поиск решения займёт [math]\displaystyle{ 1 + \log_2N }[/math] времени. Наконец, для поиска экстремума, скажем, для определённости минимума, на очередном шаге отбрасывается тот из концов рассматриваемого отрезка, значение в котором максимально.