Двоичный поиск: различия между версиями
Материал из Поле цифровой дидактики
Patarakin (обсуждение | вклад) м (1 версия импортирована) |
Patarakin (обсуждение | вклад) |
||
(не показано 5 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
'''Двоичный (бинарный) поиск''' (также известен как '''метод деления пополам''' или '''[[дихотомия]]''') — классический [[алгоритм]] поиска элемента в отсортированном массиве (векторе), использующий дробление массива на половины. Используется в [[информатика|информатике]], [[вычислительная математика|вычислительной математике]] и [[математическое программирование|математическом программировании]]. | '''Двоичный (бинарный) поиск''' (также известен как '''метод деления пополам''' или '''[[дихотомия]]''') — классический [[алгоритм]] поиска элемента в отсортированном массиве (векторе), использующий дробление массива на половины. Используется в [[информатика|информатике]], [[вычислительная математика|вычислительной математике]] и [[математическое программирование|математическом программировании]]. | ||
== Поиск элемента в отсортированном массиве == | |||
# Определение значения элемента в середине структуры данных. Полученное значение сравнивается с ключом. | # Определение значения элемента в середине структуры данных. Полученное значение сравнивается с ключом. | ||
# Если ключ меньше значения середины, то поиск осуществляется в первой половине элементов, иначе — во второй. | # Если ключ меньше значения середины, то поиск осуществляется в первой половине элементов, иначе — во второй. | ||
Строка 11: | Строка 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 == | ||
Строка 49: | Строка 70: | ||
* Метод используется для нахождения [[экстремум]]а [[целевая функция|целевой функции]] и в этом случае является [[оптимизация (математика)|методом условной одномерной оптимизации]]. Когда функция имеет вещественный аргумент, найти решение с точностью до <math>\varepsilon</math> можно за время <math>\log_2 1 / \varepsilon</math>. Когда аргумент дискретен, и изначально лежит на отрезке длины ''N'', поиск решения займёт <math>1 + \log_2N</math> времени. Наконец, для поиска экстремума, скажем, для определённости [[Экстремум|минимума]], на очередном шаге отбрасывается тот из концов рассматриваемого отрезка, значение в котором максимально. | * Метод используется для нахождения [[экстремум]]а [[целевая функция|целевой функции]] и в этом случае является [[оптимизация (математика)|методом условной одномерной оптимизации]]. Когда функция имеет вещественный аргумент, найти решение с точностью до <math>\varepsilon</math> можно за время <math>\log_2 1 / \varepsilon</math>. Когда аргумент дискретен, и изначально лежит на отрезке длины ''N'', поиск решения займёт <math>1 + \log_2N</math> времени. Наконец, для поиска экстремума, скажем, для определённости [[Экстремум|минимума]], на очередном шаге отбрасывается тот из концов рассматриваемого отрезка, значение в котором максимально. | ||
[[Категория:Алгоритмы поиска]] | [[Категория:Алгоритмы поиска]] |
Текущая версия на 16:03, 9 ноября 2023
Двоичный (бинарный) поиск (также известен как метод деления пополам или дихотомия) — классический алгоритм поиска элемента в отсортированном массиве (векторе), использующий дробление массива на половины. Используется в информатике, вычислительной математике и математическом программировании.
Поиск элемента в отсортированном массиве
- Определение значения элемента в середине структуры данных. Полученное значение сравнивается с ключом.
- Если ключ меньше значения середины, то поиск осуществляется в первой половине элементов, иначе — во второй.
- Поиск сводится к тому, что вновь определяется значение серединного элемента в выбранной половине и сравнивается с ключом.
- Процесс продолжается до тех пор, пока не будет найден элемент со значением ключа или не станет пустым интервал для поиска.
Диаграмма бинарного поиска
Алгоритм бинарного поиска в интервале 1 - 12
- Binary search (diagram) - варианты с определением месяцев в Graphviz
Пример реализации на 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] времени. Наконец, для поиска экстремума, скажем, для определённости минимума, на очередном шаге отбрасывается тот из концов рассматриваемого отрезка, значение в котором максимально.