Двоичный поиск
Двоичный (бинарный) поиск (также известен как метод деления пополам или дихотомия) — классический алгоритм поиска элемента в отсортированном массиве (векторе), использующий дробление массива на половины. Используется в информатике, вычислительной математике и математическом программировании.
| Двоичный поиск | |
|---|---|
![]() Визуализация алгоритма, где 7 — целевое значение | |
| Предназначение | |
| Структура данных | Массив |
| Худшее время | O(log n) |
| Лучшее время | O(1) |
| Среднее время | O(log n) |
| Затраты памяти | O(1) |

Частным случаем двоичного поиска является метод бисекции, который применяется для поиска корней заданной непрерывной функции на заданном отрезке.
Поиск элемента в отсортированном массиве
- Определение значения элемента в середине структуры данных. Полученное значение сравнивается с ключом.
- Если ключ меньше значения середины, то поиск осуществляется в первой половине элементов, иначе — во второй.
- Поиск сводится к тому, что вновь определяется значение серединного элемента в выбранной половине и сравнивается с ключом.
- Процесс продолжается до тех пор, пока не будет найден элемент со значением ключа или не станет пустым интервал для поиска.
Несмотря на то, что код достаточно прост, в нём есть несколько ловушек.
- Код
(first + last) / 2ошибочен, еслиfirstиlastпо отдельности умещаются в свой тип, аfirst+last— нет. Если теоретически возможны массивы столь большого размера, приходится идти на ухищрения:- Использовать код
first + (last - first) / 2, который точно не приведёт к переполнениям, если имеем дело с неотрицательными целыми числами и first<last.- Если
firstиlast— указатели или итераторы, такой код единственно правильный, поскольку не нарушает абстракцию (уже операция «указатель + указатель» некорректна). Разумеется, чтобы сохранялась сложность алгоритма, нужны быстрые операции «указатель+число → указатель», «указатель−указатель → число».
- Если
- Если
firstиlast— типы со знаком, провести расчёт в беззнаковом типе:((unsigned)first + (unsigned)last) / 2. В Java сработает такой код:(first + last) >>> 1(знаковое двоичное сложение совпадает с беззнаковым, Java гарантирует такое поведение даже при переполнении, и вся эта формула оперирует знаковыми числами как беззнаковыми). - Написать расчёт на ассемблере, с использованием флага переноса. Что-то наподобие
add eax, b; rcr eax, 1. А вот длинные типы использовать нецелесообразно,first + (last - first) / 2быстрее.
- Использовать код
- В двоичном поиске часты ошибки на единицу, и каждая такая ошибка превращается в зацикливание, пропуск или выход за пределы массива. Поэтому важно протестировать такие случаи: пустой массив (
n=0), один элемент (n=1), ищем отсутствующее значение (слишком большое, слишком маленькое и где-то в середине), ищем первый и последний элемент. - Иногда требуется, чтобы, если
xв цепочке существует в нескольких экземплярах, находило не любой, а обязательно первый (как вариант: последний; либо вообще неx, а следующий за ним элемент). Например, функцияstd::lower_boundиз C++ находит первый из равных, аstd::upper_bound— элемент, следующий за x. Если не найдено — оба возвращают место, куда вставить.
Учёный утверждает, что 90 % студентов, разрабатывая двоичный поиск, забывают учесть какое-либо из этих требований. И даже в код, написанный самим Йоном и ходивший из книги в книгу, вкралась ошибка: код не стоек к переполнениям.
Приложения
Практические приложения метода двоичного поиска разнообразны:
- Широкое распространение в информатике применительно к поиску в структурах данных. Например, поиск в массивах данных осуществляется по ключу, присвоенному каждому из элементов массива (в простейшем случае сам элемент является ключом).
- Также его применяют в качестве численного метода для нахождения приближённого решения уравнений (см. Метод бисекции).
- Метод используется для нахождения экстремума целевой функции и в этом случае является методом условной одномерной оптимизации. Когда функция имеет вещественный аргумент, найти решение с точностью до
можно за время
. Когда аргумент дискретен, и изначально лежит на отрезке длины N, поиск решения займёт
времени. Наконец, для поиска экстремума, скажем, для определённости минимума, на очередном шаге отбрасывается тот из концов рассматриваемого отрезка, значение в котором максимально.
См. также
- Линейный поиск
- Метод бисекции
- Метод дихотомии
- Метод Ньютона
- Метод золотого сечения
- Троичный поиск
Примечания
- Extra, Extra — Read All About It: Nearly All Binary Searches and Mergesorts are Broken Архивная копия от 2 декабря 2013 на Wayback Machine // Joshua Bloch, Google Research; перевод — Почти во всех реализациях двоичного поиска и сортировки слиянием есть ошибка Архивная копия от 24 ноября 2013 на Wayback Machine
- В C++
std::lower_boundнаходит первое вхождениеx, аstd::upper_bound— элемент, следующий заx.
Литература
- Левитин А. В. Глава 4. Метод декомпозиции: Бинарный поиск // Алгоритмы. Введение в разработку и анализ — М.: Вильямс, 2006. — С. 180—183. — 576 с. — ISBN 978-5-8459-0987-9
- Амосов А. А., Дубинский Ю. А., Копченова Н. П. Вычислительные методы для инженеров. — М.: Мир, 1998.
- Бахвалов Н. С., Жидков Н. П., Кобельков Г. Г. Численные методы. — 8-е изд. — М.: Лаборатория Базовых Знаний, 2000.
- Вирт Н. Алгоритмы + структуры данных = программы. — М.: «Мир», 1985. — С. 28.
- Волков Е. А. Численные методы. — М.: Физматлит, 2003.
- Гилл Ф., Мюррей У., Райт М. Практическая оптимизация. Пер. с англ. — М.: Мир, 1985.
- Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. Алгоритмы: построение и анализ = Introduction to Algorithms / Под ред. И. В. Красикова. — 2-е изд. — М.: Вильямс, 2005. — 1296 с. — ISBN 5-8459-0857-4.
- Корн Г., Корн Т. Справочник по математике для научных работников и инженеров. — М.: Наука, 1970. — С. 575—576.
- Коршунов Ю. М., Коршунов Ю. М. Математические основы кибернетики. — Энергоатомиздат, 1972.
- Максимов Ю. А., Филлиповская Е. А. Алгоритмы решения задач нелинейного программирования. — М.: МИФИ, 1982.
- Роберт Седжвик. Фундаментальные алгоритмы на C. Анализ/Структуры данных/Сортировка/Поиск = Algorithms in C. Fundamentals/Data Structures/Sorting/Searching. — СПб.: ДиаСофтЮП, 2003. — С. 672. — ISBN 5-93772-081-4.
Ссылки
- Материал на сайте algolist
- Пошаговый разбор алгоритма, коды программ
- Как же всё-таки правильно написать двоичный поиск?
Википедия, чтение, книга, библиотека, поиск, нажмите, истории, книги, статьи, wikipedia, учить, информация, история, скачать, скачать бесплатно, mp3, видео, mp4, 3gp, jpg, jpeg, gif, png, картинка, музыка, песня, фильм, игра, игры, мобильный, телефон, Android, iOS, apple, мобильный телефон, Samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Сеть, компьютер, Информация о Двоичный поиск, Что такое Двоичный поиск? Что означает Двоичный поиск?
Dvoichnyj binarnyj poisk takzhe izvesten kak metod deleniya popolam ili dihotomiya klassicheskij algoritm poiska elementa v otsortirovannom massive vektore ispolzuyushij droblenie massiva na poloviny Ispolzuetsya v informatike vychislitelnoj matematike i matematicheskom programmirovanii Dvoichnyj poiskVizualizaciya algoritma gde 7 celevoe znacheniePrednaznachenieStruktura dannyh MassivHudshee vremya O log n Luchshee vremya O 1 Srednee vremya O log n Zatraty pamyati O 1 Mediafajly na VikiskladeVizualizaciya binarnogo poiska po massivu Iskomoe chislo 7 Chastnym sluchaem dvoichnogo poiska yavlyaetsya metod bisekcii kotoryj primenyaetsya dlya poiska kornej zadannoj nepreryvnoj funkcii na zadannom otrezke Poisk elementa v otsortirovannom massiveImeetsya vikiuchebnik po teme Realizacii algoritmov Dvoichnyj poisk Opredelenie znacheniya elementa v seredine struktury dannyh Poluchennoe znachenie sravnivaetsya s klyuchom Esli klyuch menshe znacheniya serediny to poisk osushestvlyaetsya v pervoj polovine elementov inache vo vtoroj Poisk svoditsya k tomu chto vnov opredelyaetsya znachenie seredinnogo elementa v vybrannoj polovine i sravnivaetsya s klyuchom Process prodolzhaetsya do teh por poka ne budet najden element so znacheniem klyucha ili ne stanet pustym interval dlya poiska Nesmotrya na to chto kod dostatochno prost v nyom est neskolko lovushek Kod first last 2 oshibochen esli first i last po otdelnosti umeshayutsya v svoj tip a first last net Esli teoreticheski vozmozhny massivy stol bolshogo razmera prihoditsya idti na uhishreniya Ispolzovat kod first last first 2 kotoryj tochno ne privedyot k perepolneniyam esli imeem delo s neotricatelnymi celymi chislami i first lt last Esli first i last ukazateli ili iteratory takoj kod edinstvenno pravilnyj poskolku ne narushaet abstrakciyu uzhe operaciya ukazatel ukazatel nekorrektna Razumeetsya chtoby sohranyalas slozhnost algoritma nuzhny bystrye operacii ukazatel chislo ukazatel ukazatel ukazatel chislo Esli first i last tipy so znakom provesti raschyot v bezznakovom tipe unsigned first unsigned last 2 V Java srabotaet takoj kod first last gt gt gt 1 znakovoe dvoichnoe slozhenie sovpadaet s bezznakovym Java garantiruet takoe povedenie dazhe pri perepolnenii i vsya eta formula operiruet znakovymi chislami kak bezznakovymi Napisat raschyot na assemblere s ispolzovaniem flaga perenosa Chto to napodobie add eax b rcr eax 1 A vot dlinnye tipy ispolzovat necelesoobrazno first last first 2 bystree V dvoichnom poiske chasty oshibki na edinicu i kazhdaya takaya oshibka prevrashaetsya v zaciklivanie propusk ili vyhod za predely massiva Poetomu vazhno protestirovat takie sluchai pustoj massiv n 0 odin element n 1 ishem otsutstvuyushee znachenie slishkom bolshoe slishkom malenkoe i gde to v seredine ishem pervyj i poslednij element Inogda trebuetsya chtoby esli x v cepochke sushestvuet v neskolkih ekzemplyarah nahodilo ne lyuboj a obyazatelno pervyj kak variant poslednij libo voobshe ne x a sleduyushij za nim element Naprimer funkciya span class n std span span class o span span class n lower bound span iz C nahodit pervyj iz ravnyh a span class n std span span class o span span class n upper bound span element sleduyushij za x Esli ne najdeno oba vozvrashayut mesto kuda vstavit Uchyonyj utverzhdaet chto 90 studentov razrabatyvaya dvoichnyj poisk zabyvayut uchest kakoe libo iz etih trebovanij I dazhe v kod napisannyj samim Jonom i hodivshij iz knigi v knigu vkralas oshibka kod ne stoek k perepolneniyam PrilozheniyaPrakticheskie prilozheniya metoda dvoichnogo poiska raznoobrazny Shirokoe rasprostranenie v informatike primenitelno k poisku v strukturah dannyh Naprimer poisk v massivah dannyh osushestvlyaetsya po klyuchu prisvoennomu kazhdomu iz elementov massiva v prostejshem sluchae sam element yavlyaetsya klyuchom Takzhe ego primenyayut v kachestve chislennogo metoda dlya nahozhdeniya priblizhyonnogo resheniya uravnenij sm Metod bisekcii Metod ispolzuetsya dlya nahozhdeniya ekstremuma celevoj funkcii i v etom sluchae yavlyaetsya metodom uslovnoj odnomernoj optimizacii Kogda funkciya imeet veshestvennyj argument najti reshenie s tochnostyu do e displaystyle varepsilon mozhno za vremya log2 1 e displaystyle log 2 1 varepsilon Kogda argument diskreten i iznachalno lezhit na otrezke dliny N poisk resheniya zajmyot 1 log2 N displaystyle 1 log 2 N vremeni Nakonec dlya poiska ekstremuma skazhem dlya opredelyonnosti minimuma na ocherednom shage otbrasyvaetsya tot iz koncov rassmatrivaemogo otrezka znachenie v kotorom maksimalno Sm takzheV rodstvennyh proektahKnigi v VikiuchebnikeMediafajly na Vikisklade Linejnyj poisk Metod bisekcii Metod dihotomii Metod Nyutona Metod zolotogo secheniya Troichnyj poiskPrimechaniyaExtra Extra Read All About It Nearly All Binary Searches and Mergesorts are Broken Arhivnaya kopiya ot 2 dekabrya 2013 na Wayback Machine Joshua Bloch Google Research perevod Pochti vo vseh realizaciyah dvoichnogo poiska i sortirovki sliyaniem est oshibka Arhivnaya kopiya ot 24 noyabrya 2013 na Wayback Machine V C std lower bound nahodit pervoe vhozhdenie x a std upper bound element sleduyushij za x LiteraturaLevitin A V Glava 4 Metod dekompozicii Binarnyj poisk Algoritmy Vvedenie v razrabotku i analiz M Vilyams 2006 S 180 183 576 s ISBN 978 5 8459 0987 9 Amosov A A Dubinskij Yu A Kopchenova N P Vychislitelnye metody dlya inzhenerov M Mir 1998 Bahvalov N S Zhidkov N P Kobelkov G G Chislennye metody 8 e izd M Laboratoriya Bazovyh Znanij 2000 Virt N Algoritmy struktury dannyh programmy M Mir 1985 S 28 Volkov E A Chislennye metody M Fizmatlit 2003 Gill F Myurrej U Rajt M Prakticheskaya optimizaciya Per s angl M Mir 1985 Kormen T Lejzerson Ch Rivest R Shtajn K Algoritmy postroenie i analiz Introduction to Algorithms Pod red I V Krasikova 2 e izd M Vilyams 2005 1296 s ISBN 5 8459 0857 4 Korn G Korn T Spravochnik po matematike dlya nauchnyh rabotnikov i inzhenerov M Nauka 1970 S 575 576 Korshunov Yu M Korshunov Yu M Matematicheskie osnovy kibernetiki Energoatomizdat 1972 Maksimov Yu A Fillipovskaya E A Algoritmy resheniya zadach nelinejnogo programmirovaniya M MIFI 1982 Robert Sedzhvik Fundamentalnye algoritmy na C Analiz Struktury dannyh Sortirovka Poisk Algorithms in C Fundamentals Data Structures Sorting Searching SPb DiaSoftYuP 2003 S 672 ISBN 5 93772 081 4 SsylkiMaterial na sajte algolist Poshagovyj razbor algoritma kody programm Kak zhe vsyo taki pravilno napisat dvoichnyj poisk



