Рубрики
Без рубрики

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

В этой статье мы посмотрим на один из самых популярных алгоритмов поиска – бинарный поиск в JavaScript. Мы пройдем, как это работает, реализация, и что делает его таким эффективным.

Автор оригинала: Abhilash Kakumanu.

Вступление

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

В этой статье мы посмотрим на идею Бинарный поиск И как реализовать его в JavaScript.

Бинарный поиск – очень простой, интуитивно понятный, но эффективный алгоритм поиска. Единственное предостережение состоит в том, что он работает только отсортированные массивы, поэтому некоторые предварительно обработка наших данных, чтобы разобраться, может быть необходимо.

Понимание бинарного поиска

Бинарный поиск – это Разделить и-побеждать Алгоритм, который разделяет массив примерно в половину каждый раз, когда он проверяет, является ли элемент массива, который мы ищем.

Другими словами, мы разделим проблему в более простые проблемы, пока не станет достаточно простым, чтобы решить их напрямую. Предположим, у нас есть сортированный массив (в порядке возрастания) и посмотрите на шаги двоичного поиска:

  1. Найдите средний элемент данного массива.
  2. Сравните средний элемент со значением, которое мы ищем (называется ключ ).

    • Если ключ меньше среднего элемента, поиск в левой половине.
    • Если ключ больше, чем средний элемент, поиск в правой половине.
    • Если ключ равен среднему элементу, верните индекс среднего элемента.
  3. Продолжайте движение с шагами 1, 2, пока мы не останетесь с одним элементом.
  4. Если ключ до сих пор не найден, return -1.

Чтобы понять это лучше, давайте посмотрим на пример того, почему мы можем просто отказаться от половины текущего диапазона поиска каждый раз, когда мы проверяем элемент:

Бинарный поиск Пример

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

Бинарный поиск Пример

В этом случае мы оказались только одним возможным кандидатом на ключ, и оказалось, что соответствует элементу, который мы искали.

Как видно в примере, потребовалось от нас относительно мало сравнений, чтобы найти нужный элемент. А именно, нам нужно только сделать четыре сравнения, чтобы найти элемент в массиве из 11 элементов. Мы возьмем еще посмотрите на эффективность бинарного поиска позже, но он уже должен быть понятным, что он покидает простые алгоритмы поиска, как линейный поиск.

Реализация двоичного поиска в JavaScript

Теперь, когда мы прошли через логику позади двоичного поиска, давайте внедрем его в JavaScript:

function binarySearch(sortedArray, key){
    let start = 0;
    let end = sortedArray.length - 1;

    while (start <= end) {
        let middle = Math.floor((start + end) / 2);

        if (sortedArray[middle] === key) {
            // found the key
            return middle;
        } else if (sortedArray[middle] < key) {
            // continue searching to the right
            start = middle + 1;
        } else {
            // search searching to the left
            end = middle - 1;
        }
    }
	// key wasn't found
    return -1;
}

Здесь мы используем две переменные, чтобы отслеживать Начать и конец текущей подложки мы ищем. Мы находим средний элемент, а затем проверять, равно ли он меньше, чем или больше, чем ключ Отказ

Как объяснили ранее, учитывая, что у нас есть сортированный массив, мы можем отказаться от половины элементов в массиве. Мы достигаем этого в коде, изменив Начать или конец Переменная, в зависимости от того, где мы продолжаем наш поиск. Если текущий элемент, на котором мы смотрим, меньше ключа, мы меняемся Начать к Средний + 1 и эффективно отбрасывать текущий элемент и все элементы меньше, чем это.

Эффективность бинарного поиска

Сложность времени двоичного поиска – O (log 2 n) , где N это количество элементов в массиве. Это намного лучше по сравнению с линейным поиском, который имеет временную сложность O (n) Отказ Как и многие другие алгоритмы поиска, двоичный поиск – это на месте алгоритм. Это означает, что он работает непосредственно на оригинальном массиве, не делая никаких копий.

Мы должны иметь в виду, однако, что двоичные поиски работают только на отсортированных массивах. Сам шаг сортировки, если использование эффективного алгоритма сортировки, имеет сложность O (nlogn) Отказ Это означает, что в большинстве случаев, если массив маленький, или если нам нужно поиск только один раз, A Brute-Force (например, линейный поиск) алгоритм может быть лучше.

Учитывая это, двоичный поиск действительно сияет, когда нам нужно сделать повторные поиски на больших массивах. Как уже упоминалось ранее, нам нужно только 4 сравнения (сравнения, являющиеся самыми интенсивными задачами всех алгоритмов поиска), для массива из 11 элементов. Тем не менее, если у нас был массив из 10 000 000 элементов, нам нужно было бы только проверить 24 Элементы, то есть 0,0002% всего массива.

Заключение

В этой статье мы посмотрели на двоичный поиск. Это простая, интуитивно понятная и эффективная логика и реализация делает его очень популярным алгоритмом для демонстрации Разделить и-побеждать Стратегия.