Автор оригинала: Team Python Pool.
Реализация бинарного поиска в Python
Оптимизация вашего кода/программы очень важна. Это не только помогает ускорить выполнение задачи, но и помогает уменьшить объем памяти, необходимый программе. Это значительно помогает в распределении ресурсов, которые, как правило, очень ограничены. И чтобы оптимизировать наш код, мы должны знать, как использовать наиболее оптимизированные алгоритмы для конкретных целей. Одним из таких алгоритмов является алгоритм двоичного поиска в python. Как следует из названия, он используется для поиска элементов в массиве.
Когда мы хотим найти индекс определенного элемента, если он присутствует, мы обычно используем линейный поиск или двоичный поиск. В линейном поиске мы ищем элемент, перебирая весь список или массив. Для этого требуется временная сложность 0(n). Предположим, у вас есть массив из 1 миллиона чисел, итерация через 1 миллион чисел не будет правильным выбором. Вот тут-то и появляется бинарный поиск, и он занимает временную сложность всего лишь O(log(n)). Но есть ограничение с бинарным поиском. В этой статье мы узнаем, как реализовать бинарный поиск в python, его преимущества и ограничения.
Как работает бинарный поиск?
В алгоритме бинарного поиска нам дается элемент для поиска и сортированный список, из которого мы должны найти индекс данного элемента. То, что мы делаем, – это находим мы находим средний элемент и сравниваем наш элемент со средним элементом. Если наш элемент выше, чем средний элемент, мы ищем элемент в правой части массива и выполняем ту же процедуру. Если наш элемент меньше, чем средний элемент, мы ищем элемент в левой части массива и следуем тому же процессу деления и поиска. Мы должны иметь в виду, что бинарный поиск работает только для уже отсортированных списков.
В алгоритме бинарного поиска нам дается элемент для поиска и сортированный список, из которого мы должны найти индекс данного элемента. То, что мы делаем, – это находим мы находим средний элемент и сравниваем наш элемент со средним элементом. Если наш элемент выше, чем средний элемент, мы ищем элемент в правой части массива и выполняем ту же процедуру. Если наш элемент меньше, чем средний элемент, мы ищем элемент в левой части массива и следуем тому же процессу деления и поиска. Мы должны иметь в виду, что бинарный поиск работает только для уже отсортированных списков.
Давайте теперь посмотрим, как бинарный поиск выполняет поиск элемента в отсортированном списке на примере.
Давайте теперь посмотрим, как бинарный поиск выполняет поиск элемента в отсортированном списке на примере.
Элемент для поиска – 19
Всего элементов – 9 (индекс – от 0 до 8)
Всего элементов – 9 (индекс – от 0 до 8)
Шаги-
- Проверьте, является ли искомый элемент средним элементом массива. Если это правда, то верните индекс среднего элемента. В противном случае перейдите к шагу 2.
Здесь 19>14, поэтому мы перейдем к шагу 2.
2. Если элемент выше среднего элемента, найдите элемент во 2-й половине. Найдите средний элемент второй половины и снова запустите алгоритм. В противном случае перейдите к шагу 3.
Здесь 19>14, поэтому мы будем искать во второй половине. Средний элемент второй половины – 24.
19 < 24, перейдите к шагу-3.
3. Если элемент меньше среднего элемента, найдите элемент в 1-й половине. Найдите средний элемент первой половины и снова запустите алгоритм.
Здесь, как 19<24, мы будем искать элемент в новой 1-й половине. Здесь первая половина состоит только из одного элемента 19. Перейдите к шагу -1 и проверьте, является ли средний элемент тем элементом, который мы ищем. Если да, выведите индекс элемента. В противном случае выведите “Элемент Не найден”.
Реализация бинарного поиска в 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)), в то время как итерационный алгоритм занимает пространственную сложность
Попробуйте запустить программы на вашей стороне и дайте нам знать, если
Счастливого кодирования!