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

Реализация бинарного поиска в Python

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

Автор оригинала: Team Python Pool.

Реализация бинарного поиска в Python

Оптимизация вашего кода/программы очень важна. Это не только помогает ускорить выполнение задачи, но и помогает уменьшить объем памяти, необходимый программе. Это значительно помогает в распределении ресурсов, которые, как правило, очень ограничены. И чтобы оптимизировать наш код, мы должны знать, как использовать наиболее оптимизированные алгоритмы для конкретных целей. Одним из таких алгоритмов является алгоритм двоичного поиска в python. Как следует из названия, он используется для поиска элементов в массиве.

Когда мы хотим найти индекс определенного элемента, если он присутствует, мы обычно используем линейный поиск или двоичный поиск. В линейном поиске мы ищем элемент, перебирая весь список или массив. Для этого требуется временная сложность 0(n). Предположим, у вас есть массив из 1 миллиона чисел, итерация через 1 миллион чисел не будет правильным выбором. Вот тут-то и появляется бинарный поиск, и он занимает временную сложность всего лишь O(log(n)). Но есть ограничение с бинарным поиском. В этой статье мы узнаем, как реализовать бинарный поиск в python, его преимущества и ограничения.

Как работает бинарный поиск?

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

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

Давайте теперь посмотрим, как бинарный поиск выполняет поиск элемента в отсортированном списке на примере.

Давайте теперь посмотрим, как бинарный поиск выполняет поиск элемента в отсортированном списке на примере.

Элемент для поиска – 19

Всего элементов – 9 (индекс – от 0 до 8)

Всего элементов – 9 (индекс – от 0 до 8)

Шаги-

  1. Проверьте, является ли искомый элемент средним элементом массива. Если это правда, то верните индекс среднего элемента. В противном случае перейдите к шагу 2.

Здесь 19>14, поэтому мы перейдем к шагу 2.

Здесь 19>14, поэтому мы перейдем к шагу 2.
двоичный поиск python

2. Если элемент выше среднего элемента, найдите элемент во 2-й половине. Найдите средний элемент второй половины и снова запустите алгоритм. В противном случае перейдите к шагу 3.

Здесь 19>14, поэтому мы будем искать во второй половине. Средний элемент второй половины – 24.

19 < 24, перейдите к шагу-3.

3. Если элемент меньше среднего элемента, найдите элемент в 1-й половине. Найдите средний элемент первой половины и снова запустите алгоритм.

Здесь, как 19<24, мы будем искать элемент в новой 1-й половине. Здесь первая половина состоит только из одного элемента 19. Перейдите к шагу -1 и проверьте, является ли средний элемент тем элементом, который мы ищем. Если да, выведите индекс элемента. В противном случае выведите “Элемент Не найден”.

двоичный поиск python
двоичный поиск python

Реализация бинарного поиска в Python.

В python мы можем реализовать алгоритм двоичного поиска двумя способами. Во-первых, с помощью рекурсии, а во-вторых, с помощью цикла. Мы увидим оба метода.

В python мы можем реализовать алгоритм двоичного поиска двумя способами. Во-первых, с помощью рекурсии, а во-вторых, с помощью цикла. Мы увидим оба метода.

Здесь мы будем продолжать вызывать функцию, используя половину части href=”https://en.wikipedia.org/wiki/Array”>array до тех пор, пока мы не найдем индекс элемента или не найдем его href=”https://en.wikipedia.org/wiki/Array”>array до тех пор, пока мы не найдем индекс элемента или не найдем его

# make a function that will return the index of the element we are #looking for.
def binary_search(arr,element,low,high):
    
    # If the lower index of the array exceeds the higher index,
    # that means that the element could not be found in the array.
    if:
        
        # find the middle index of the array 
        mid=(low+high)//2

        #If the middle element is the element we are looking for,
        # return the index of middle element
        if[mid]:
            print(mid)
        
        # if the element is greater than middle element,
        # search for the element in the second half
        elif element > arr[mid]:
            binary_search(arr,element,mid+1,high)
            
        # if the element is lesser than middle element,
        # search for the element in the first half
        else:
            binary_search(arr,element,low,mid-1) 
        
    else:
        print("Element not found")
arr=[3,7,9,11,14,19,24,29,39]

#At the start the as index of array starts from 0

#The last index will be the length of array-1(arr)-1

# Search for 29 in array
binary_search(arr,element,low,high)


# Search for 40 in array, which is not present
binary_search(arr,element,low,high)
7 
Element not found
# we can also use binary search algo on array full of characters
arr=['a','b','c','d','e','f','g'](arr)-1
binary_search(arr,element,low,high)
5

Здесь мы будем продолжать вызывать функцию, используя половину части href=”https://en.wikipedia.org/wiki/Array”>array до тех пор, пока мы не найдем индекс элемента или не обнаружим, что элемента нет в массиве. href=”https://en.wikipedia.org/wiki/Array”>array до тех пор, пока мы не найдем индекс элемента или не обнаружим, что элемента нет в массиве.

Вместо использования рекурсии мы также можем использовать цикл while.

def binary_search(arr,element):
    
   
   (arr)-1
    
    # initialize the 'if_found' variable with False.
   
    
    # run the loop until if_found becomes True and
    # lower index is greater and higher index.
    while( and not if_found):
        # find the index of middle element
        mid = (low + high)//2
        
        #If the middle element is the element we are looking for,
        # return the index of middle element  
        if arr[mid] :
           
        
        else:
        # if the element is less than the middle element,
        # look for the element in the first part.
            if element < arr[mid]:
              # search for the element in array from index 0 to 
              # index mid-1
                - 1
            
            # if the element is greater than the middle 
            # element,look for the element in second part.
            else:
            # search for the element in array from index mid+1 to 
            # last index
                + 1
                
    # if the element is found, get out of the loop and print the 
    # index
   if:
        return("Element {} found at index".format(element),mid)
    # if element is not in the array, run the below code
    else:
        return("Element {} Not found".format(element))
    
arr=[2,4,5,7,8,9,10]
print(binary_search(arr,element))
print(binary_search(arr,element))

Вместо использования рекурсии мы также можем использовать цикл while.

('Element 7 found at index', 3) 
Element 11 Not found

Пространственно-временная сложность бинарного поиска

Бинарный поиск-это высоко оптимизированный алгоритм поиска, который принимает O(1) временную сложность

Лучше всего будет, если искомый элемент будет средним элементом массива. В худшем случае элемент будет отсутствовать в массиве. Для среднего случая также временная сложность равна 0(log(n)).

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

Надо Читать:

  • Как преобразовать строку в нижний регистр в
  • Как вычислить Квадратный корень
  • Пользовательский ввод | Функция ввода () | Ввод с клавиатуры
  • Лучшая книга для изучения Python

Вывод

Двоичный поиск в Python в основном используется, когда у нас есть отсортированный список, и мы можем сравнивать элементы, если они меньше или больше друг друга. Мы изучили оба способа в python – рекурсию и итерацию. Рекурсия менее оптимизирована, а итерационный алгоритм более эффективен, поскольку рекурсия занимает пространственную сложность O(log(n)), в то время как итерационный алгоритм занимает пространственную сложность

Попробуйте запустить программы на вашей стороне и дайте нам знать, если

Счастливого кодирования!