Цель: реализовать эффективный алгоритм поиска, который работает за логарифмическое время O(log n).
Основная идея бинарного поиска — на каждом шаге делить область поиска пополам.
left
(указывает на начало массива, индекс 0
) и right
(указывает на конец, arr.length - 1
).left
не станет больше right
.middle = Math.floor((left + right) / 2)
.arr[middle]
равен искомому элементу (target
), вы нашли его! Возвращайте middle
.arr[middle]
меньше target
, значит, искомый элемент может быть только в правой половине массива. Сдвиньте левую границу: left = middle + 1
.arr[middle]
больше target
, искомый элемент — в левой половине. Сдвиньте правую границу: right = middle - 1
.-1
.const binarySearch = (arr, target) => {
// Инициализируем указатели на начало и конец массива.
let left = 0;
let right = arr.length - 1;
// Продолжаем цикл, пока левый указатель не окажется правее правого.
// Это условие означает, что область поиска еще не пуста.
while (left <= right) {
// Находим средний индекс.
// Math.floor используется для округления вниз, чтобы получить целый индекс.
const middle = Math.floor((left + right) / 2);
const guess = arr[middle];
// Сравниваем элемент в середине с искомым значением.
if (guess === target) {
// Элемент найден! Возвращаем его индекс.
return middle;
}
// Если центральный элемент меньше искомого,
// значит, target может находиться только в правой половине массива.
if (guess < target) {
// Сдвигаем левую границу поиска вправо от середины.
left = middle + 1;
} else {
// В противном случае (центральный элемент больше искомого),
// target может быть только в левой половине.
// Сдвигаем правую границу поиска влево от середины.
right = middle - 1;
}
}
// Если цикл завершился, а элемент так и не был найден,
// это означает, что его нет в массиве.
return -1;
};
Анализ решения:
Вам нужно реализовать функцию binarySearch
, которая принимает отсортированный массив чисел arr
и число target
. Функция должна найти target
в массиве и вернуть его индекс. Если элемент не найден, функция должна вернуть -1
.
Ключевое требование — алгоритм должен иметь логарифмическую временную сложность O(log n), что делает его намного эффективнее линейного поиска для больших наборов данных.
// Находит элемент в середине
binarySearch([1, 2, 3, 4, 5, 6], 4); // 3
// Находит элемент в массиве с отрицательными числами
binarySearch([-1, 0, 3, 5, 9, 12], 9); // 4
// Элемент отсутствует
binarySearch([1, 2, 3, 4, 5], 7); // -1
// Пустой массив
binarySearch([], 5); // -1
binarySearch
.-1
.Цель: реализовать эффективный алгоритм поиска, который работает за логарифмическое время O(log n).
Основная идея бинарного поиска — на каждом шаге делить область поиска пополам.
left
(указывает на начало массива, индекс 0
) и right
(указывает на конец, arr.length - 1
).left
не станет больше right
.middle = Math.floor((left + right) / 2)
.arr[middle]
равен искомому элементу (target
), вы нашли его! Возвращайте middle
.arr[middle]
меньше target
, значит, искомый элемент может быть только в правой половине массива. Сдвиньте левую границу: left = middle + 1
.arr[middle]
больше target
, искомый элемент — в левой половине. Сдвиньте правую границу: right = middle - 1
.-1
.const binarySearch = (arr, target) => {
// Инициализируем указатели на начало и конец массива.
let left = 0;
let right = arr.length - 1;
// Продолжаем цикл, пока левый указатель не окажется правее правого.
// Это условие означает, что область поиска еще не пуста.
while (left <= right) {
// Находим средний индекс.
// Math.floor используется для округления вниз, чтобы получить целый индекс.
const middle = Math.floor((left + right) / 2);
const guess = arr[middle];
// Сравниваем элемент в середине с искомым значением.
if (guess === target) {
// Элемент найден! Возвращаем его индекс.
return middle;
}
// Если центральный элемент меньше искомого,
// значит, target может находиться только в правой половине массива.
if (guess < target) {
// Сдвигаем левую границу поиска вправо от середины.
left = middle + 1;
} else {
// В противном случае (центральный элемент больше искомого),
// target может быть только в левой половине.
// Сдвигаем правую границу поиска влево от середины.
right = middle - 1;
}
}
// Если цикл завершился, а элемент так и не был найден,
// это означает, что его нет в массиве.
return -1;
};
Анализ решения:
Вам нужно реализовать функцию binarySearch
, которая принимает отсортированный массив чисел arr
и число target
. Функция должна найти target
в массиве и вернуть его индекс. Если элемент не найден, функция должна вернуть -1
.
Ключевое требование — алгоритм должен иметь логарифмическую временную сложность O(log n), что делает его намного эффективнее линейного поиска для больших наборов данных.
// Находит элемент в середине
binarySearch([1, 2, 3, 4, 5, 6], 4); // 3
// Находит элемент в массиве с отрицательными числами
binarySearch([-1, 0, 3, 5, 9, 12], 9); // 4
// Элемент отсутствует
binarySearch([1, 2, 3, 4, 5], 7); // -1
// Пустой массив
binarySearch([], 5); // -1
binarySearch
.-1
.Редактор кода намеренно скрыт на мобильном.
Поверь, так лучше: я оберегаю тебя от искушения писать код в неидеальных условиях. Маленький экран и виртуальная клавиатура — не лучшие помощники для программиста.
📖 Сейчас: Изучи задачу, продумай решение. Действуй как стратег.
💻 Потом: Сядь за компьютер, открой сайт и реализуй все идеи с комфортом. Действуй как код-джедай!