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

Двоичный алгоритм поиска в Python

Challenge: Как найти данное значение в отсортированном списке? Пример: скажем, у вас есть отсортированный список: [1, 4, 10, 42, 99, 102, 103, 999] Ваша цель – найти индекс элемента 103 в списке. Вы должны проверить все элементы, чтобы сделать это? Ну, только если вы использовали … Двоичный алгоритм поиска в Python Подробнее »

Автор оригинала: Chris.

Испытание : Как найти данную ценность в Сортированный список ?

Пример : Скажем, у вас есть сортированный список:

[1, 4, 10, 42, 99, 102, 103, 999]

Ваша цель – найти индекс элемента 103 в списке. Вы должны проверить все элементы, чтобы сделать это?

Ну, только если вы использовали …

Наивный список поисковых лиц

А Наивный алгоритм будет Сравните каждый элемент В Список против обысканного значения.

Например, рассмотрим список 1024 элементы. Наивный алгоритм выполняет в порядке 1024 Сравнение в худшем случае Отказ 😱.

(В случае, если вам интересно, это реально плохое проверку любого элемента в отсортированном списке, чтобы найти определенный элемент – это туповая вещь!)

2 2
1024 1024
42000000 42000000
n n

В информатике в худшем случае сложность выполнения может быть выражена через Обозначение Big-O Отказ Мы говорим, для N Элементы в списке, наивный алгоритм нуждаются в O (n) сравнения. О-функция определяет асимптотический худший рост.

К счастью, есть лучший и быстрый способ найти элемент в отсортированном списке!

Двоичный алгоритм поиска в Python

Функция Bsearch является более эффективным способом найти значение в отсортировано список. Для N Элементы в списке, ему необходимо выполнить только O (log (n)) сравнения.

Вот код:

def bsearch(l, value):
    # search only in index interval (lo:hi)
    lo, hi = 0, len(l)-1
    
    while lo <= hi:
        mid = (lo + hi) // 2
        if l[mid] < value:
            # Mid element is smaller
            # --> skip all left elements
            lo = mid + 1
        elif l[mid] > value:
            # Mid element is larger
            # --> skip all right elements
            hi = mid - 1
        else:
            # We've found the value!
            return mid
    return -1

Упражнение : Возьмите предположение – какой вывод этого кода фрагмент при прохождении следующих трех вызовов функций?

l = [0, 1, 2, 3, 4, 5, 6]

x = 6
print(bsearch(l,x))

x = 0
print(bsearch(l,x))

x = 3
print(bsearch(l,x))

Если вы догадались следующие три значения, вы догадались правильно!

6
0
3

Применяется к списку 1024 элементов, Bsearch требует только до Журнал (1024) = 10 сравнения. Следовательно, Bsearch намного быстрее, чем наивный алгоритм сравнения!

В информатике в худшем случае сложность выполнения может быть выражена через Обозначение Big-O Отказ Мы говорим, для N Элементы в списке, наивный алгоритм нуждаются в O (n) сравнения. О-функция определяет асимптотический худший рост.

Да, это около 25 сравнений для списка с 42 000 000 элементов !!

🤨 <- ты

Почему BSSearch так быстро?

Наивный алгоритм сравнивает все элементы с помощью поиска.

Вместо этого Bsearch Использует свойство, в котором список сортируется восходящим образом.

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

Эта процедура повторяется до тех пор, пока мы не найдем поисковое значение, либо не осталось никаких значений. В каждом петля Итерация, мы Уменьшите пространство поиска , то есть число элементов между lo и привет вдвое.

Интерактивная оболочка бинарный поиск Python

Вы можете попробовать Bsearch Функция в следующей интерактивной оболочке в вашем браузере:

Упражнение : Угадайте вывод и запустите оболочку, чтобы сравнить его против реального выхода!

Код головоломки двоичного поиска алгоритм

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

Упражнение : Вы мастер-кодер? Проверьте свои навыки сейчас! Нажмите на изображение головоломки и попробуйте решить его в нашей интерактивной приложении головоломки!

Связанные видео Бинарный поиск

Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.

Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python One-listers (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.

Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.