Учебник по информатике и математике
Темы
Похожие темы
Бинарный поиск
Оглавление:
Представь, что тебе нужно найти слово в толковом словаре. Ты открываешь книгу посередине и смотришь: твоё слово стоит левее или правее? Дальше повторяешь то же самое с оставшейся половиной. Это и есть бинарный поиск.
Алгоритм работает только с отсортированным массивом — это ключевое условие. Каждый шаг вдвое уменьшает зону поиска, поэтому для массива из миллиона элементов потребуется не более 20 сравнений.
Идея алгоритма
Ключевая идея: на каждой итерации мы смотрим на средний элемент и выбрасываем половину, которая не может содержать ответ.
Алгоритм работает только с отсортированным массивом — это ключевое условие. Каждый шаг вдвое уменьшает зону поиска, поэтому для массива из миллиона элементов потребуется не более 20 сравнений.
Ключевая идея: на каждой итерации мы смотрим на средний элемент и выбрасываем половину, которая не может содержать ответ.
Алгоритм шаг за шагом
<span class="line"></span>
<span class="line"><span style="color: #F97583">#include</span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF"><iostream></span></span>
<span class="line"></span>
<span class="line"><span style="color: #F97583">int</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">main</span><span style="color: #E1E4E8">() {</span></span>
<span class="line"><span style="color: #E1E4E8"> </span><span style="color: #F97583">int</span><span style="color: #E1E4E8"> firstNumber;</span></span>
<span class="line"><span style="color: #E1E4E8"> </span><span style="color: #F97583">int</span><span style="color: #E1E4E8"> secondNumber;</span></span>
<span class="line"><span style="color: #E1E4E8"> </span></span>
<span class="line"><span style="color: #6A737D"> // Prompt and capture input</span></span>
<span class="line"><span style="color: #E1E4E8"> </span><span style="color: #B392F0">std</span><span style="color: #E1E4E8">::cout </span><span style="color: #F97583"><<</span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">"Enter first number: "</span><span style="color: #E1E4E8">;</span></span>
<span class="line"><span style="color: #E1E4E8"> </span><span style="color: #B392F0">std</span><span style="color: #E1E4E8">::cin </span><span style="color: #F97583">>></span><span style="color: #E1E4E8"> firstNumber;</span></span>
<span class="line"><span style="color: #E1E4E8"> </span></span>
<span class="line"><span style="color: #E1E4E8"> </span><span style="color: #B392F0">std</span><span style="color: #E1E4E8">::cout </span><span style="color: #F97583"><<</span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">"Enter second number: "</span><span style="color: #E1E4E8">;</span></span>
<span class="line"><span style="color: #E1E4E8"> </span><span style="color: #B392F0">std</span><span style="color: #E1E4E8">::cin </span><span style="color: #F97583">>></span><span style="color: #E1E4E8"> secondNumber;</span></span>
<span class="line"><span style="color: #E1E4E8"> </span></span>
<span class="line"><span style="color: #6A737D"> // Calculate total</span></span>
<span class="line"><span style="color: #E1E4E8"> </span><span style="color: #F97583">int</span><span style="color: #E1E4E8"> sum </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> firstNumber </span><span style="color: #F97583">+</span><span style="color: #E1E4E8"> secondNumber;</span></span>
<span class="line"><span style="color: #E1E4E8"> </span><span style="color: #B392F0">std</span><span style="color: #E1E4E8">::cout </span><span style="color: #F97583"><<</span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">"The sum is: "</span><span style="color: #E1E4E8"> </span><span style="color: #F97583"><<</span><span style="color: #E1E4E8"> sum </span><span style="color: #F97583"><<</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">std</span><span style="color: #E1E4E8">::endl;</span></span>
<span class="line"><span style="color: #E1E4E8"> </span></span>
<span class="line"><span style="color: #6A737D"> // Conditional logic</span></span>
<span class="line"><span style="color: #E1E4E8"> </span><span style="color: #F97583">if</span><span style="color: #E1E4E8"> (sum </span><span style="color: #F97583">></span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">0</span><span style="color: #E1E4E8">) {</span></span>
<span class="line"><span style="color: #E1E4E8"> </span><span style="color: #B392F0">std</span><span style="color: #E1E4E8">::cout </span><span style="color: #F97583"><<</span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">"The sum is a positive number."</span><span style="color: #E1E4E8"> </span><span style="color: #F97583"><<</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">std</span><span style="color: #E1E4E8">::endl;</span></span>
<span class="line"><span style="color: #E1E4E8"> } </span><span style="color: #F97583">else</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">if</span><span style="color: #E1E4E8"> (sum </span><span style="color: #F97583"><</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">0</span><span style="color: #E1E4E8">) {</span></span>
<span class="line"><span style="color: #E1E4E8"> </span><span style="color: #B392F0">std</span><span style="color: #E1E4E8">::cout </span><span style="color: #F97583"><<</span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">"The sum is a negative number."</span><span style="color: #E1E4E8"> </span><span style="color: #F97583"><<</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">std</span><span style="color: #E1E4E8">::endl;</span></span>
<span class="line"><span style="color: #E1E4E8"> } </span><span style="color: #F97583">else</span><span style="color: #E1E4E8"> {</span></span>
<span class="line"><span style="color: #E1E4E8"> </span><span style="color: #B392F0">std</span><span style="color: #E1E4E8">::cout </span><span style="color: #F97583"><<</span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">"The sum is exactly zero."</span><span style="color: #E1E4E8"> </span><span style="color: #F97583"><<</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">std</span><span style="color: #E1E4E8">::endl;</span></span>
<span class="line"><span style="color: #E1E4E8"> }</span></span>
<span class="line"><span style="color: #E1E4E8"> </span></span>
<span class="line"><span style="color: #E1E4E8"> </span><span style="color: #F97583">return</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">0</span><span style="color: #E1E4E8">;</span></span>
<span class="line"><span style="color: #E1E4E8">}</span></span>
<span class="line"></span>
Для массива из 1 000 000 элементов бинарный поиск сделает не более 20 сравнений (log₂ 1 000 000 ≈ 19.9). Линейный поиск в худшем случае — миллион.
Сложность алгоритма
Представь, что тебе нужно найти слово в толковом словаре. Ты открываешь книгу посередине и смотришь: твоё слово стоит левее или правее? Дальше повторяешь то же самое с оставшейся половиной. Это и есть бинарный поиск.
Представь, что тебе нужно найти слово в толковом словаре. Ты открываешь книгу посередине и смотришь: твоё слово стоит левее или правее? Дальше повторяешь то же самое с оставшейся половиной. Это и есть бинарный поиск.
Совет: в C++ вместо ручной реализации можно использовать lower_bound и upper_bound из <algorithm>. Они работают за O(log n) и возвращают итераторы.
Представь, что тебе нужно найти слово в толковом словаре. Ты открываешь книгу посередине и смотришь: твоё слово стоит левее или правее? Дальше повторяешь то же самое с оставшейся половиной. Это и есть бинарный поиск.
Представь, что тебе нужно найти слово в толковом словаре. Ты открываешь книгу посередине и смотришь: твоё слово стоит левее или правее? Дальше повторяешь то же самое с оставшейся половиной. Это и есть бинарный поиск.
Проверь себя
Разновидность управляющей конструкции в высокоуровневых языках программирования, предназначенная для организации многократного исполнения набора инструкций.
Сколько сравнений потребует бинарный поиск для массива из 1024 элементов в худшем случае?
Сопоставьте карточки
Вариант 1
Ответ 2
Вариант 2
Ответ 3
Вариант 3
Ответ 1
Сопоставьте карточки
Вариант В
Вариант Б
Вариант А
Ответ А
Ответ Б
Ответ В