Connect with us

TechHype

Бинарный поиск — вопросы с собеседований

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

Фото аватара

Опубликовано

/

     
     

Бинарный поиск — это эффективный алгоритм поиска, который используется для нахождения элемента в отсортированном списке. Он работает на принципе деления пополам (или «двоичного деления») и значительно сокращает количество сравнений, необходимых для нахождения элемента, по сравнению с линейным поиском, который проверяет каждый элемент по очереди.

Процесс бинарного поиска следующий:

  1. Выбирается средний элемент в отсортированном списке.
  2. Сравнивается значение среднего элемента с искомым значением.
  3. Если средний элемент равен искомому, поиск завершается успешно.
  4. Если средний элемент меньше искомого, поиск продолжается в правой половине списка.
  5. Если средний элемент больше искомого, поиск продолжается в левой половине списка.
  6. Шаги с 1 по 5 повторяются для нового подсписка, пока не будет найден искомый элемент или подсписок не станет пустым (что означает, что элемент отсутствует в списке).

Бинарный поиск имеет временную сложность O(log n), где n — количество элементов в списке. Это делает его очень быстрым для больших списков, в отличие от линейного поиска, временная сложность которого составляет O(n).

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

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

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

Вот пример реализации бинарного поиска на языке программирования Swift. Этот код предполагает, что массив уже отсортирован, и ищет индекс элемента в массиве. Если элемент найден, возвращает его индекс, иначе возвращает nil.

func binarySearch<T: Comparable>(_ array: [T], key: T) -> Int? {
    var lowerBound = 0
    var upperBound = array.count
    
    while lowerBound < upperBound {
        let midIndex = lowerBound + (upperBound - lowerBound) / 2
        if array[midIndex] == key {
            return midIndex
        } else if array[midIndex] < key {
            lowerBound = midIndex + 1
        } else {
            upperBound = midIndex
        }
    }
    
    return nil
}

// Пример использования
let numbers = [1, 2, 4, 5, 7, 8, 9]
if let index = binarySearch(numbers, key: 5) {
    print("Найден элемент на индексе \(index).")
} else {
    print("Элемент не найден.")
}

Этот код определяет функцию binarySearch, которая принимает массив array и ключ key, который нужно найти. Функция использует две переменные (lowerBound и upperBound), чтобы отслеживать текущий интервал поиска в массиве. В каждой итерации цикла while он сужает область поиска, сравнивая key с элементом в середине текущего интервала. Если ключ равен элементу в середине, поиск успешно завершается. Если ключ меньше, поиск продолжается в левой половине интервала, если больше — в правой. Если интервал становится пустым (то есть lowerBound становится равным upperBound), элемент считается не найденным, и функция возвращает nil.

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

Вот другой пример реализации бинарного поиска — на языке программирования Kotlin.

fun <T : Comparable<T>> binarySearch(list: List<T>, key: T): Int? {
    var rangeStart = 0
    var rangeEnd = list.size - 1

    while (rangeStart <= rangeEnd) {
        val midIndex = rangeStart + (rangeEnd - rangeStart) / 2
        when {
            list[midIndex] == key -> return midIndex
            list[midIndex] < key -> rangeStart = midIndex + 1
            else -> rangeEnd = midIndex - 1
        }
    }

    return null
}

// Пример использования
val numbers = listOf(1, 2, 4, 5, 7, 8, 9)
val result = binarySearch(numbers, 5)

println(result?.let { "Элемент найден на индексе $it." } ?: "Элемент не найден.")

Работает он точно так же, как и на Swift.

Альтернативы бинарному поиску

Существует несколько альтернатив бинарному поиску, которые можно использовать в зависимости от конкретных условий и требований к поиску. Вот некоторые из них:

  • Линейный поиск: Простейший метод поиска, который последовательно проверяет каждый элемент в списке до нахождения целевого значения или до конца списка. Лучше всего использовать, когда список небольшой или не отсортирован.
  • Интерполяционный поиск: Улучшение бинарного поиска, которое выбирает позицию для проверки на основе расчета, где целевое значение может находиться, исходя из минимального и максимального значений в списке. Эффективен для равномерно распределенных данных.
  • Экспоненциальный поиск: Сначала быстро находит диапазон, в котором может находиться целевое значение, с помощью экспоненциальных прыжков, а затем применяет бинарный поиск в найденном диапазоне.
  • Поиск по дереву: Если данные хранятся в балансированном двоичном дереве поиска (например, AVL или красно-черное дерево), поиск может быть выполнен эффективно с временной сложностью O(log n).
  • Поиск с прыжками: Поиск с прыжками разбивает список на меньшие секции и «прыгает» через них в поисках блока, который может содержать целевой элемент, после чего выполняется линейный поиск внутри блока.
  • Фибоначчиев поиск: Похож на бинарный поиск, но вместо деления списка пополам использует числа Фибоначчи для определения новой точки поиска, что может быть полезно при поиске в внешних хранилищах данных, где доступ к элементам занимает разное время.
  • Тернарный поиск: Делит список на три части, используя два средних значения, и определяет, в какой из трех частей продолжить поиск. Может быть полезен для определенных типов функций при оптимизации.
  • Хеш-таблицы: Хотя это не метод поиска в традиционном смысле, хеш-таблицы предоставляют очень быстрый доступ к данным по ключу с помощью хеш-функции, обычно за O(1) в среднем случае.

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

Дополнительно

Если вы нашли опечатку - выделите ее и нажмите Ctrl + Enter! Для связи с нами вы можете использовать info@apptractor.ru.
Advertisement

Наши партнеры:

LEGALBET

Мобильные приложения для ставок на спорт
Telegram

Популярное

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: