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

Алгоритмы обучения – бинарный поиск

Привет, ребята, если вы знакомы с некоторыми структурами данных, сейчас пришло время изучать некоторые алгоритмы. V … Tagged Computerscience, алгоритмы, Python, BinarySearch.

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

Я могу код, не зная алгоритмы, почему я буду беспокоиться, чтобы узнать их?

Конечно, вы можете создать программное обеспечение, не используя технически алгоритмы, и не обязательно (полагаю, так). Тем не менее, когда вы решили проблему программного обеспечения, вы когда-нибудь договорились о себе «Могу ли я сделать лучше?». Именно здесь алгоритмы вступают в игру, и в конечном итоге, эта мысль приводит к тому, что вы стали лучшим программистом.

Позвольте мне объяснить, почему это важно.

Услуги, такие как Facebook, имеют более 2,7 миллиарда пользователей, что означает, что инженеры Facebook предположительно должны обрабатывать данные огромного количества пользователей. Есть программа А и Программа B обрабатывать эти данные. Программа A занимает 1 секунду для обработки данных каждого пользователя и 2 секунды для аналога. Что будет разница между двумя программами? Ну, вам даже не нужно их рассчитать, B занимает в два раза больше, чем Отказ

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

Мы не можем просто прыгнуть в двоичный поиск, не зная Линейный поиск Отказ Вы должны быть знакомы с этим алгоритмом, это метод нахождения элемента в массиве, используемом для петли, начиная от 0 до конца массива. Требуется N раз, когда он проверяет, находится ли цель в индексе каждая петля в этом случае от 0 до 5. Сложность времени линейного поиска – На)

Казалось бы, неплохо, но мы можем сделать лучше? Да, мы можем сделать это лучше, используя бинарный поиск .

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

Давайте посмотрим этот алгоритм в реальной жизни.

У вас есть словарь находить слово, вы ищете слово «славное». Во-первых, вы открываете словарь из Средний А теперь вы на М раздел. Во-вторых, потому что G Раздел находится в переднем конце книги, не нужно смотреть за рамки М раздел. В-третьих, поэтому вы снова открыли случайным образом между началом и М раздел и теперь вы находитесь на F раздел, что означает, что вам придется посмотреть между F раздел и М раздел, пока вы не найдете G раздел. Вы получаете идею.

Таким образом, в основном это сужает вашу область поиска, пока не найдет цель.

Давайте погрузимся глубже сейчас. Мы собираемся найти номер 43 Из этого массива [14, 3, 28, 64, 43, 90] . Держись, мы не можем использовать двоичный поиск, потому что это не в порядке, невозможно выяснить диапазоны поиска! Да … Мы можем сделать двоичный поиск, когда массив сортируется. Давайте сначала покончим.

шаг 1. Итак, левый и справа. Длина и mid = (левый + справа)/2 в этом случае.

Давайте проверим, является ли наша текущая средняя точка целью. Это 28 правда? Нет! Хорошо, что мы сейчас делаем? Потому что 28 меньше чем 43 мы двигаемся левый Указатель справа средней точки Отказ

шаг 2. Так как мы переместили левую указатель, середина Указатель снова будет в середине левой и правой, который сейчас (3 + 5)/((левый + справа)/2) Отказ Давайте еще раз проверим, нашли ли мы 43. Это 64 (середина) (цель) правда? Нет! Тогда это 64 больше или меньше, чем 43 ? 64 больше чем 43 Отказ Тогда нам нужно переместить правильный указатель к слева от средней точки .

шаг 3. Теперь средняя точка находится в индексе [3]. Итак, слева + так Средняя точка – это 6/ Отказ Но что если осталось + справа, это странные номер, что не делена ? Например, если оставить + справа, это 7 и делит их по 2 дает нам 3.5 , который не является целым числом, который мы можем использовать для индекса. Если вы на фоне Python, вам нужно будет использовать целое делитель, как так, левый + справа//2 , что удаляет десятичную точку, затем возвращает вас 3. Это 43 (середина) (цель) правда? Да, это так! Вернемся в середине указателя 3.

Сколько шагов вы взяли, чтобы найти 43?

Мы взяли 3 шага, если N – длина массива, мы примерно взяли N/2 Шаги, которые намного короче, чем линейный поиск, и это станет меньше относительный Размер N , в конечном итоге мы собираемся чрезвычайно, если размер N огромный. Таким образом, мы сделали половину руб. Работы, которая может быть выражена как 1/2 * 1/2 * 1/2 * 1/2 * (Давайте предположим, что журнал 2). Поэтому временная сложность – O (log2n)

Реализация

Есть два способа внедрения в двоичных поисках, итеративный и рекурсивный Отказ Чтобы удержать это просто, я дам итеративный пример реализации. В Python – как псевдо-код:

def binary_search(arr, target):
  left = 0
  right = arr.length - 1
  while left <= right:
    mid = (left + right) // 2
    # When found target
    if arr[mid] == target:
      return mid
    # When target is less than midpoint value
    elif target < arr[mid]:
      right = mid - 1  # move right pointer to left of mid
    # When target is greater than midpoint value
    else:
      left = mid + 1  # move left pointer to right of mid
  return -1

Я надеюсь, что вы найдете это полезно для вашего вычислительного мышления, я расскажу о большем количестве алгоритмов позже! Спасибо за чтение!

Оригинал: “https://dev.to/ji90/learning-algorithms-binary-search-3907”