Сообщество Engee

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

Автор
avatar-maximsidorovmaximsidorov
Notebook

Алгоритм бинарного поиска

Пример реализации алгоритма бинарного поиска на языке программирования Julia, предназначенная для поиска заданного элемента в отсортированном массиве.

Введение

Бинарный поиск - это эффективный алгоритм поиска элемента в отсортированном массиве. Основная идея заключается в том, чтобы на каждом шаге делить массив пополам и сравнивать искомый элемент с элементом в середине. Это позволяет значительно сократить количество операций по сравнению с линейным поиском. Алгоритм имеет временную сложность , что делает его очень быстрым для больших массивов данных.

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

Основная часть

Определение функции и параметров

Функция binarysearch принимает отсортированный вектор lst и искомое значение val. Функция параметризована типом T, что позволяет работать с любыми типами данных

function binarysearch(lst::Vector{T}, val::T) where T
    # Инициализируем нижнюю границу поиска
    low = 1
    # Инициализируем верхнюю границу поиска (длина массива)
    high = length(lst)
    
    ## Основной цикл поиска
    
    # Продолжаем поиск пока нижняя граница не превысит верхнюю
    while low  high
        # Находим середину текущего диапазона
        # Оператор ÷ выполняет целочисленное деление
        mid = (low + high) ÷ 2
        
        # Сравниваем элемент в середине с искомым значением
        if lst[mid] > val
            # Если элемент в середине больше искомого,
            # сдвигаем верхнюю границу на позицию перед серединой
            high = mid - 1
        elseif lst[mid] < val
            # Если элемент в середине меньше искомого,
            # сдвигаем нижнюю границу на позицию после середины
            low = mid + 1
        else
            # Если элемент в середине равен искомому,
            # возвращаем индекс найденного элемента
            return mid
        end
    end

    ## Обработка случая, когда элемент не найден

    # Если мы вышли из цикла, значит элемент не найден
    # Возвращаем 0 как признак отсутствия элемента
    # (в Julia индексация начинается с 1, поэтому 0 не является допустимым индексом)
    return 0
end
binarysearch

Пример использования функции

Создаем отсортированный массив для тестирования

test_array = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19];
# Ищем существующий элемент
result1 = binarysearch(test_array, 7)
println("Поиск элемента 7: индекс = $result1")  # Должно вернуть 4

# Ищем несуществующий элемент
result2 = binarysearch(test_array, 6)
println("Поиск элемента 6: индекс = $result2")  # Должно вернуть 0

# Ищем первый элемент
result3 = binarysearch(test_array, 1)
println("Поиск элемента 1: индекс = $result3")  # Должно вернуть 1

# Ищем последний элемент
result4 = binarysearch(test_array, 19)
println("Поиск элемента 19: индекс = $result4")  # Должно вернуть 10
Поиск элемента 7: индекс = 4
Поиск элемента 6: индекс = 0
Поиск элемента 1: индекс = 1
Поиск элемента 19: индекс = 10

Заключение

В этом примере мы рассмотрели реализацию алгоритма бинарного поиска на языке Julia. Нам удалось создать эффективную функцию, которая может быстро находить элементы в отсортированных массивах. Алгоритм использует принцип "разделяй и властвуй", что позволяет достичь логарифмической временной сложности . Это особенно важно при работе с большими объемами данных, где линейный поиск был бы неэффективным. Реализация поддерживает дженерики (generics), что делает её гибкой для работы с различными типами данных при условии, что они поддерживают операции сравнения.

Пример разработан с использованием материалов Rosetta Code