Учебник по информатике и математике
Темы
Алгоритмы
C++
Основы языка
Python
Бинарный поиск
Оглавление:
Представь, что тебе нужно найти слово в толковом словаре. Ты открываешь книгу посередине и смотришь: твоё слово стоит левее или правее? Дальше повторяешь то же самое с оставшейся половиной. Это и есть бинарный поиск.
Алгоритм работает только с отсортированным массивом — это ключевое условие. Каждый шаг вдвое уменьшает зону поиска, поэтому для массива из миллиона элементов потребуется не более 20 сравнений.
Идея алгоритма
Ключевая идея: на каждой итерации мы смотрим на средний элемент и выбрасываем половину, которая не может содержать ответ.
Алгоритм работает только с отсортированным массивом — это ключевое условие. Каждый шаг вдвое уменьшает зону поиска, поэтому для массива из миллиона элементов потребуется не более 20 сравнений.
Ключевая идея: на каждой итерации мы смотрим на средний элемент и выбрасываем половину, которая не может содержать ответ.
Алгоритм шаг за шагом
#include <iostream> // Required for printing and reading text
#include <string> // Required to use the std::string data type
// 1. Defining a basic function
// This function takes two integers and returns their sum
int addNumbers(int a, int b) {
return a + b;
}
// 2. The main function where execution always begins
int main() {
// ---- VARIABLES & OUTPUT ----
std::string greeting = "Welcome to C++!";
std::cout << greeting << std::endl; // Prints the string and moves to a new line
// ---- USER INPUT & CALCULATIONS ----
int num1 = 0;
int num2 = 0;
std::cout << "Enter the first number: ";
std::cin >> num1; // Reads user input and stores it in num1
std::cout << "Enter the second number: ";
std::cin >> num2; // Reads user input and stores it in num2
// Calling our custom function and storing the result
int sum = addNumbers(num1, num2);
std::cout << "The sum of your numbers is: " << sum << std::endl;
// ---- CONDITIONAL STATEMENTS (IF / ELSE) ----
if (sum > 100) {
std::cout << "That is a large number!" << std::endl;
} else {
std::cout << "That is a small or moderate number." << std::endl;
}
// ---- FOR LOOP ----
std::cout << "Counting down from 3:" << std::endl;
for (int i = 3; i > 0; i--) {
std::cout << i << "... " << std::endl;
}
std::cout << "Blast off!" << std::endl;
// Return 0 to indicate the program executed successfully
return 0;
}
Для массива из 1 000 000 элементов бинарный поиск сделает не более 20 сравнений (log₂ 1 000 000 ≈ 19.9). Линейный поиск в худшем случае — миллион.
Сложность алгоритма
Представь, что тебе нужно найти слово в толковом словаре. Ты открываешь книгу посередине и смотришь: твоё слово стоит левее или правее? Дальше повторяешь то же самое с оставшейся половиной. Это и есть бинарный поиск.
Представь, что тебе нужно найти слово в толковом словаре. Ты открываешь книгу посередине и смотришь: твоё слово стоит левее или правее? Дальше повторяешь то же самое с оставшейся половиной. Это и есть бинарный поиск.
Совет: в C++ вместо ручной реализации можно использовать lower_bound и upper_bound из <algorithm>. Они работают за O(log n) и возвращают итераторы.
Представь, что тебе нужно найти слово в толковом словаре. Ты открываешь книгу посередине и смотришь: твоё слово стоит левее или правее? Дальше повторяешь то же самое с оставшейся половиной. Это и есть бинарный поиск.
Представь, что тебе нужно найти слово в толковом словаре. Ты открываешь книгу посередине и смотришь: твоё слово стоит левее или правее? Дальше повторяешь то же самое с оставшейся половиной. Это и есть бинарный поиск.
Проверь себя
Разновидность управляющей конструкции в высокоуровневых языках программирования, предназначенная для организации многократного исполнения набора инструкций.
Сколько сравнений потребует бинарный поиск для массива из 1024 элементов в худшем случае?
Сопоставьте карточки
Вариант 1
Ответ 1
Вариант 2
Ответ 3
Вариант 3
Ответ 2
Сопоставьте карточки
Вариант В
Вариант А
Вариант Б
Ответ А
Ответ Б
Ответ В