Мы всегда на связи

Пишите в любое удобное время:
whatsappvktelegramMAX
Или задайте вопрос через форму:

Учебник по информатике и математике

Структурированные пути обучения: от первых программ до олимпиад и вступительных в топ-школы.
Заниматься с наставником

Темы

Похожие темы

прочитали
3 задачи

Бинарный поиск

Оглавление:

Представь, что тебе нужно найти слово в толковом словаре. Ты открываешь книгу посередине и смотришь: твоё слово стоит левее или правее? Дальше повторяешь то же самое с оставшейся половиной. Это и есть бинарный поиск.

Алгоритм работает только с отсортированным массивом — это ключевое условие. Каждый шаг вдвое уменьшает зону поиска, поэтому для массива из миллиона элементов потребуется не более 20 сравнений.

Идея алгоритма

Ключевая идея: на каждой итерации мы смотрим на средний элемент и выбрасываем половину, которая не может содержать ответ.

Алгоритм работает только с отсортированным массивом — это ключевое условие. Каждый шаг вдвое уменьшает зону поиска, поэтому для массива из миллиона элементов потребуется не более 20 сравнений.

Ключевая идея: на каждой итерации мы смотрим на средний элемент и выбрасываем половину, которая не может содержать ответ.

Алгоритм шаг за шагом

C++

<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) и возвращают итераторы.

Представь, что тебе нужно найти слово в толковом словаре. Ты открываешь книгу посередине и смотришь: твоё слово стоит левее или правее? Дальше повторяешь то же самое с оставшейся половиной. Это и есть бинарный поиск.

Представь, что тебе нужно найти слово в толковом словаре. Ты открываешь книгу посередине и смотришь: твоё слово стоит левее или правее? Дальше повторяешь то же самое с оставшейся половиной. Это и есть бинарный поиск.

Проверь себя

1.

Разновидность управляющей конструкции в высокоуровневых языках программирования, предназначенная для организации многократного исполнения набора инструкций.

2.

Сколько сравнений потребует бинарный поиск для массива из 1024 элементов в худшем случае?

3.

Сопоставьте карточки

Вариант 1

Ответ 2

Вариант 2

Ответ 3

Вариант 3

Ответ 1

4.

Сопоставьте карточки

Вариант В

Вариант Б

Вариант А

Ответ А

Ответ Б

Ответ В