Итак, вы узнали немного питона. Вы создали классное маленькое приложение Todo и несколько покупок. Но теперь пришло время предпринять следующие шаги в мир информатики, верно?
Big-O может выглядеть как сложная вещь, которую можно схватить, но так же было программированием для всех, кто впервые начал. Давайте посмотрим, что такое Big-O, прежде чем мы его разбили.
Изображение предоставлено Бигочеатшисты
Объясните Big-O, как мне пять
В прямом до места Биг-О рассказывает нам, как долго требуется алгоритм. Теперь я не имею в виду за секунды или миллисекунд. Я говорю о том, сколько итераций или операций это требуется. Что я имею в виду под этим? Давайте посмотрим на несколько примеров.
Здесь у нас есть метод печати, который в Big-O был бы O (1)
def hello_world(): print("Hello World!") hello_world()
Вы можете видеть в простом методе печати, у нас потребовалась одна операция для печати Hello World. Если вы видите диаграмму выше, вы можете увидеть O (1)
находится внизу, представляя его как самый быстрый метод в соответствии с сложностью Big-O. Это хорошо, верно? Абсолютно. Конечно, никто не заплатит нам разработчики, чтобы сделать печатные заявления весь день.
Вот еще один пример O (1)
def print_index_three(lists): print(lists[2]) # No matter how big our list, were still always calling index 3 print_index_three([1,2,3,4,5,6,7,8,9,10])
А как насчет следующего примера? Были на графике, вы догадаете, это подходит?
my_list = ["Apple", "Mango", "Pear", "Cherry", "Grape", "Orange", "Blue Berry", "Papaya", "Melon", "Kiwi", "Banana"] def find_fruit(lst, name) for fruit in lst: if fruit == name: return True find_fruit(my_list, "Orange")
Наш find_fruit
Функция содержит для
петля и Если
утверждение. Возможно, вы думаете, что это две операции, но на самом деле это все еще одна операция. Который в Big-O, это O (1)
Представляем для
Loop – это то, где наши операции начинают расти. Как мы можем видеть my_list
имеет 11 фруктов. Таким образом, наша функция поиска передаст каждый элемент в списке 6 раз, чтобы найти Orange. Операции * 6
Анкет или в Big-O: На)
Что если элемент, который мы искали, был первым элементом в списке? Подумай об этом, было бы O (1)
? или На)
Все еще? Это было бы O (1), потому что это была единственная операция, чтобы найти первый элемент. Это называется Лучший сценарий в Big-O.
Как насчет худший вариант развития событий Вам может быть интересно? Ну, это был бы последний элемент в мой список
Как это потребует Большинство операции для завершения нашей функции поиска. Большая часть того, что делает теории Big-O, основана на Худший сценарий Анкет При работе с данными чаще, тогда не ваши программные конструкции должны будут иметь в виду масштаб. Всегда задайте себе этот вопрос, когда это возможно.
” Какой сценарий худшего случая? “
Более эффективный алгоритм поиска
Наша функция поиска будет отлично подойдет с несколькими элементами списка, но когда мы получим список из 100 000 предметов. Мы никогда не знаем, что были в списке нашего целевого элемента. Чтобы решить это, общий алгоритм – это Бинарный поиск
.
def binary_search(lst, x): low = 0 high = len(lst) - 1 mid = 0 while low <= high: mid = (high + low) // 2 # Check if x is present at mid if lst[mid] < x: low = mid + 1 # If x is greater, ignore left half elif lst[mid] > x: high = mid - 1 # If x is smaller, ignore right half else: return mid # If we reach here, then the element was not present return -1 ordered_list = [1, 8, 13, 22, 31, 76, 79, 84, 92, 99] # ^ # middle split # Lets search for 79 print(binary_search(ordered_list, 79))
Не очень часто инженеры программного обеспечения могут играть с отсортированными данными, но если вы знаете, что это будет, двоичный поиск – лучший выбор для вопроса, Какой сценарий наихудшего случая?
Бинарный поиск подпадает под O (log n)
на диаграмме сложности Big-O. Если вы уже знаете, что такое логарифмы, то я уверен, что вы понимаете, почему. Бинарный поиск примет наибольший индекс списка и разделил его прямо в середине. Затем запустите O (1)
Операция, где он проверяет, является ли элемент, который вы ищете, меньше, чем текущий средний индекс. Если это не проигнорирует левую половину, найдите новый средний индекс, а затем повторите процесс, пока не найдет наш индекс элементов.
Из примера примера кода наша цель 79. Сколько раз наш алгоритм будет повторяться над разделением списка? Это займет 3 операции. Давая нам наши журнал n
Если вы решите использовать бинарный поиск в ближайшем будущем, имейте в виду, что его эффективность повышается, больше индексов в списке.
Давайте посмотрим на более сложный пример
Теперь, если вы со мной до сих пор можете увидеть различные сложности Big-O ( o (n)
, o (1)
, o (log n))
Не так уж плохо, чтобы понять. Существуют простые математические идеи, представляющие, насколько сложны алгоритм или функция.
Давайте посмотрим на фактический алгоритм в действии и шоу, который он принадлежит.
Один из первых алгоритмов вида вида, который вы узнаете, – это Merge-Sort
Анкет Короче говоря, он разбивает список пополам, а затем неоднократно расщепляет эти списки, вызывая себя рекурсивно, а затем сравнивает их, когда он объединяет список обратно. Смотрите Здесь или это видео Больше подробностей. Если вы еще не уверены, что такое рекурсия, см. Здесь Анкет
def merge_sort(lst): if len(lst) >1: mid = len(lst) // 2 # The Middle of the list Left = lst[:mid] Right = lst[mid:] # As each list splits, you split those lists again. (Recursion) merge_sort(Left) merge_sort(Right) i = 0 j = 0 k = 0 while i < len(Left) and j < len(Right): if Left[i] < Right[j]: lst[k] = Left[i] i += 1 else: lst[k] = Right[j] j += 1 k += 1 # Check if any element was left. while i < len(Left): lst[k] = Left[i] i += 1 k += 1 while j < len(Right): lst[k] = Right[j] j += 1 k += 1 my_list = [156, 42, 3, 78, 45, 22, 98, 100] merge_sort(my_list) print(my_list)
Если вы впервые увидите слияние, это может показаться немного сложным, но на самом деле это не так. В Big-O слияние падает под O (n log n)
который в значительной степени находится в середине времени, как долго алгоритм может занять алгоритм.
Что делает это O (n log n)
? Если мы разбиваем это выражение в математических терминах, оно довольно легко понять. Операции * (elements log (элементы))))
В приведенном выше примере у нас есть 8 элементов в списке. Что означает, что список разделился в половину 3 раза. Это наш log (n)
. После разделения 3 раза мы получим 8 отдельных элементов для сравнения. Это наш не
После того, как все элементы находятся на их базе (список единичных элементов), затем они отсортируют обратно в 2 сортированных списка (слева и справа). Теперь это становится O (n)
часть нашего O (n log n)
, Помните наш пример выше, используя На)
? То же самое происходит здесь, за исключением того, что сравнивали, какое число является самым низким. Затем добавьте его в основной отсортированный список, который мы возвращаем.
Другая половина спектра
Там гораздо больше, чем я упомянул здесь. У тебя O (n^2)
, O (2^n)
и даже На!)
. Но я хотел сохранить это краткое изложение. В будущем я буду преодолевать гораздо большие сложности, так как это первый из многих постов о Big-O. Знаете ли вы, что у всех уравнений Big-O также есть и их сложность? Вы можете узнать, насколько эффективна память, ваши алгоритмы тоже! Если вы заинтересованы в алгоритмах и структурах данных, я тоже буду публиковать об этом.
Дополнительные ресурсы, которые стоит проверить: https://www.bigocheatsheet.com/
Свяжитесь со мной! LinkedIn Twitter GitHub
Оригинал: “https://dev.to/syriiadvent/let-s-learn-the-big-o-h9e”