Автор оригинала: FreeCodeCapm Team.
Джулия Гейст
Контекст
Я жил в здании, у которого была общая кухня более 100 учеников. Как вы можете себе представить, было почти всегда блюда, которые не были вымыты в раковине. Группа в моей школе разбила идею, чтобы поставить гнездо, чтобы поймать виновных виновников и позвонить им на нем, используя подачу гнезда CAM.
Чтобы проиллюстрировать мою точку зрения, скажем, вы нашли грязные блюда в 12:00, и вы не были на кухне на день.
Подумайте о том, как вы ищете человека, который покинул посуду. Вы бы смотрели все 24 часа кадров, с самого начала, пока вы не нашли виновника?
Возможно нет. Скорее всего, вы будете прыгать по кадрам, проверяя, если блюда в раковине, скажем, 12 часов назад – в 12 часов утра. Если бы они были, то вы знаете, что это произошло до 12 утра. Вы можете перевернуть назад до 10 вечера после этого. Если блюда не Там вы теперь сужались с 10 вечера до 12 утра – другими словами, вы исключили в любое время до 10 вечера. Вы продолжите этот процесс, пока вы не нашли виновника.
Что привело бы вас до 24 часов, если бы вы вообще просмотрели кадры, сейчас требуется всего несколько секунд.
Знал ли вы это или нет, конкретный процесс, который мы просто проходили, это двоичный поиск! Двоичный поиск – это Очень специфический Способ прыжки назад и вперед по кадрам.
А именно, отснятый материал расщепляется на его средней точке, чтобы каждый раз проверить посуду. Обратите внимание, как расстояние до середины точки появляется экспоненциально меньшим с каждым кликом.
Двоичные поиски используются для быстрого и эффективного поиска элементов. Улов, хотя это так Двоичные поиски работают только тогда, когда структура, которую вы просматриваете, это отсортировано Отказ
В примере гнезда камер, какая кадра отсортирована? Что мы ищем в этом отсортированном договоренности?
В этом случае данные, которые мы ищем отсортированы по времени. Время позволяет для линейного измерения. Следовательно, это позволяет нам выполнять двоичный поиск, чтобы найти кого-то, кто не моет свои блюда в течение нескольких секунд.
Нам также нужно что-то, что мы ищем. В этом случае это наличие немытых блюд в коммунальной раковине.
Двоичный поиск алгоритм
Хотя программирование, двоичный поиск можно использовать во множестве контекстов. Это Чрезвычайно Быстрый способ найти элементы в отсортированной структуре.
Двоичные поиски могут быть реализованы в итеративной или рекурсивной моде. Итеративная реализация использует в то время как
петля. Между тем, рекурсивная реализация будет называть себя в пределах своего тела.
В коде я буду выполнять бинарный поиск по сравнительно простому, отсортированному набору данных для выделения основной реализации двоичного поиска.
Учитывая массив отсортированных номеров, возврат Правда
Если 53 – это элемент.
[0, 3, 4, 5, 6, 15, 18, 22, 25, 27, 31, 33, 34, 35, 37, 42, 53, 60]
Итерационный
В итеративном подходе A пока не работает петля до тех пор, пока диапазон возможностей не равен нулю. Это делается путем изменения верхних и нижних границ от того, где мы смотрим и вычисляем средний индекс из этого диапазона.
Диапазон существует между нижними и верхними границами, включающими самими оценками.
До в то время как
Начинается петля, нижняя граница равна нулю, а верхняя граница – длина массива. Верхние связанные изменения, если число, которое мы ищем, находится в первой половине диапазона. Нижние связанные изменения, если число, которое мы ищем, представляют собой во второй половине диапазона.
Если в то время как
Контур отделки, что означает, что есть диапазон длины нуля, возврат Ложь
Отказ
def binarySearch(array, number): lowerBound = 0 upperBound = len(array)
while lowerBound < upperBound: middleIndex = int(math.floor(lowerBound + (upperBound — lowerBound) / 2)) if array[middleIndex] == number: return True elif array[middleIndex] < number: lowerBound += 1 elif array[middleIndex] > number: upperBound = middleIndex return False
Я хотел бы уточнить это уравнение:
int (math.floor (lownbound + (верхний конкт – строение)/2))
Длина из Диапазон рассчитывается, вычитая нижнюю границу с верхней границы. Однако, зная, как долго диапазон недостаточно.
На данный момент мы не знаем, какие указатели проверяют в массиве. Таким образом, мы сдвигаем массив нижней границей.
Затем мы разделим это двумя и раунд вниз, чтобы получить средний индекс диапазона. math.floor
Возвращает плавать
Так что мы также должны бросить результат к int
Отказ
Рекурсивный
В рекурсивном подходе функция позвонит себе из его тела.
Верхняя граница в этой функции длина массива, передаваемого в. Опять же, верхние связанные изменения, если число, которое мы ищем, находится в первой половине массива. Нижние связанные изменения, если число, которое мы ищем, – во второй половине массива.
def binarySearch(array, number): middleIndexOfArray = int(math.floor(len(array) / 2)) if middleIndexOfArray == 0: return False
if array[middleIndexOfArray] == number: return True elif array[middleIndexOfArray] > number: return binarySearch(array[:middleIndexOfArray], number) elif array[middleIndexOfArray] < number: return binarySearch(array[middleIndexOfArray:], number)
Функция затем вызывает саму собой, проходя в аргументе массива половины длины массива, который был его аргументом.
Если в массиве нулевые элементы, верните Ложь
Отказ
Код доступен на моем Алгоритмы и структуры данных Reppo – звезда, чтобы оставаться в курсе!
Следующие шаги
Я написал свой первый бинарный поиск, чтобы реализовать алгоритм стохастического отбора проб. Он генерирует предложение на основе частоты слов в корпусе текста.
Не стесняйтесь попробовать и построить аналогичный проект, который имеет довольно приготовление, прежде чем вы сможете реализовать двоичный поиск. Или думать о своих собственных проектах и поделиться им в комментариях!
Это второй пост моего алгоритма и серии структур данных. В каждом посте я представляю проблему, которая может быть лучше решена с помощью алгоритма или структуры данных, чтобы иллюстрировать саму алгоритму/структуру данных.
Звезда моя алгоритмы репо на Github и следуй за мной на Twitter Если вы хотели бы следовать!