Бінарний пошук
Відкрити окрему відповідьКоротка відповідь
middleБінарний пошук — це алгоритм, що шукає елемент у відсортованому масиві, порівнюючи його з середнім. Якщо елемент менший, шукаємо ліворуч; якщо більший — праворуч. Працює лише з упорядкованими даними.
Повне пояснення
Коротке пояснення
Бінарний пошук швидко знаходить позицію заданого елемента у відсортованому масиві, розділяючи його на половини. Кожен крок зменшує область пошуку вдвічі, поки не знайде елемент або не доведеться повернути «не знайдено».
Аналогія
Уявіть, що ви шукаєте слово у словнику: відкриваєте книгу посередині, читаєте перше слово і вирішуєте, чи слід шукати ліворуч (перші букви) або праворуч (далі в алфавіті).
Коли застосовувати
- Масив або список вже відсортований за зростанням/спаданням.
- Потрібна швидка точкова пошукова операція (O(log n)).
- Кількість запитів великі, а час на сортування не критичний.
- Пошук елемента в масиві, де індекси важливі (наприклад, у базах даних).
Кроки алгоритму
- Визначити межі пошуку: low = 0, high = n‑1.
- Якщо low > high – елемент не знайдено, завершити.
- Обчислити середній індекс mid = Math.floor((low + high) / 2).
- Якщо arr[mid] === target – повернути mid.
- Якщо arr[mid] > target, встановити high = mid - 1 і повернутися до кроку 2.
- Якщо arr[mid] < target, встановити low = mid + 1 і повернутися до кроку 2.
Візуальна інтуїція (текстова)
Масив: [1, 3, 5, 7, 9, 11]
Target: 7
1. low=0, high=5 → mid=2 (arr[2]=5) < 7 → low=3
2. low=3, high=5 → mid=4 (arr[4]=9) > 7 → high=3
3. low=3, high=3 → mid=3 (arr[3]=7) == 7 → знайдено
Складність
Часова складність: O(log n) у найкращому, середньому й гіршому випадках. Пам’ятна складність: O(1), бо використовуються лише кілька змінних.
Код (js)
// Бінарний пошук у відсортованому масиві
function binarySearch(arr, target) {
// ініціалізуємо межі пошуку
let low = 0;
let high = arr.length - 1;
// поки область пошуку не порожня
while (low <= high) {
// обчислюємо середній індекс
const mid = Math.floor((low + high) / 2);
// якщо знайдено, повертаємо індекс
if (arr[mid] === target) {
return mid;
}
// якщо елемент у середньому більший за ціль, шукаємо ліворуч
if (arr[mid] > target) {
high = mid - 1;
} else { // інакше шукаємо праворуч
low = mid + 1;
}
}
// елемент не знайдено
return null;
}
// Тестовий приклад
console.log(binarySearch([1, 3, 5, 7, 9], 7)); // очікуваний результат: 3
console.log(binarySearch([1, 3, 5, 7, 9], 2)); // очікуваний результат: null
Типові помилки і поради
- Не сортувати масив: алгоритм працює лише з упорядкованими даними. Переконайтеся, що масив відсортований.
- Використання
mid = (low + high) / 2без округлення: у великих масивах може виникнути переповнення. Завжди використовуйтеMath.floor. - Забудьте про інкремент/декремент: після зміни
lowабоhighпотрібно повернутися до циклу, інакше цикл може застрягти. - Повернення
-1замістьnull: це залежить від контексту, алеnullчітко сигналізує про «не знайдено». - Оптимізація: для дуже великих масивів можна використовувати рекурсію, але це збільшує використання стеку.
Перевір себе
- Яка складність бінарного пошуку у найгіршому випадку?
- Чому важливо, щоб масив був відсортований перед пошуком?