«O» большое и «o» малое

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

Большая нотация O часто используется для определения того, насколько сложна проблема, также известная как класс сложности проблемы. Математик Пауль Бахман (1837-1920) первым использовал эту нотацию во втором издании своей книги "Analytische Zahlentheorie", в 1896 году. Эдмунд Ландау (1877-1938 гг.) сделал эту нотацию популярной. По этой причине, когда люди говорят о символах Ландау, они ссылаются на эту нотацию.

Большая Нотация О названа в честь термина "порядок функции", который относится к росту функций. Big O Notation используется для нахождения верхней границы (максимально возможного количества) скорости роста функции, т.е. она работает дольше всего времени, которое потребуется, чтобы превратить входной сигнал в выходной. Это означает, что алгоритм можно сгруппировать по тому, сколько времени он может занять в худшем случае, когда каждый раз будет использоваться самый длинный маршрут.

Большой О - это выражение, которое находит наихудший сценарий выполнения, показывая, насколько эффективен алгоритм без необходимости запуска программы на компьютере. Это также полезно, поскольку разные компьютеры могут иметь разное аппаратное обеспечение, и поэтому для его выполнения требуется разное количество времени. Поскольку Big O всегда предполагает наихудший сценарий, он может показать последовательное измерение скорости: независимо от вашей аппаратуры, O ( 1 ) {\displaystyle O(1)}{\displaystyle O(1)} всегда будет выполняться быстрее, чем O ( n ! ) {\displaystyle O(n!)}{\displaystyle O(n!)}, потому что у них разные уровни эффективности.

Примеры

Во всех следующих примерах используется код, написанный на языке Python. Обратите внимание, что это не полный список типов Big O.

Постоянный

O ( 1 ) {\displaystyle O(1)}{\displaystyle O(1)} . Всегда занимает одинаковое количество времени независимо от ввода. Например, возьмем функцию, которая принимает целое число (вызывается x) и возвращает двойное значение:

def double(x): return x * 2 #Return the value of x times 2

После принятия входа эта функция всегда будет выполнять один шаг для возврата выхода. Она является постоянной, потому что всегда будет занимать один и тот же промежуток времени, так что это O ( 1 ) {\displaystyle O(1)}{\displaystyle O(1)} .

Линейный

O ( n ) {\displaystyle O(n)}{\displaystyle O(n)} . Увеличивается в соответствии с размером входного сигнала, представленного n {\displaystyle n}n . Предположим, что функция принимает n и возвращает каждое число от 1 до n:

def count(n): i = 1 #Создать счетчик, называемый "i" со значением 1, а i <= n: #Хотя i меньше или равно n print(i) #Выводите значение i i = i + 1 #Переопределите i как "значение i + 1".

Если бы мы вводили значение 5, то это вывело бы 1,2,3,4,5 {\displaystyle 1,2,3,4,5}. {\displaystyle 1,2,3,4,5}требующий 5 петель для завершения. Аналогично, если мы введем 100, то получим 1,2,3...98,99,100 {\displaystyle 1,2,3...98,99,100}{\displaystyle 1,2,3...98,99,100} , для завершения которых требуется 100 петель. Если вход n {\displaystyle n}n, то время выполнения алгоритма каждый раз ровно n {\displaystyle n}n циклов, поэтому это O ( n ) {\displaystyle O(n)}{\displaystyle O(n)} .

Факториал

O ( n ! ) {\displaystyle O(n!)}{\displaystyle O(n!)} . Увеличивает факториальные величины, т.е. время, затрачиваемое на ввод, значительно увеличивается. Например, скажем, мы хотим посетить пять городов по всему миру и хотим увидеть все возможные порядки (перестановки). Алгоритм, который мы могли бы написать, используя библиотеку Python's itertools, следующий:

import itertools #Import the itertools library cities = ['London', 'Paris', 'Berlin', 'Amsterdam', 'Rome'] #В массиве выбранных нами городов def permutations(cities): #Введите массив городов в качестве input: для i в itertools. permutations(cities):: #Для каждой перестановки наших элементов (присвоенных переменной "i") вывод(i) #Output i

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

("Лондон", "Париж", "Берлин", "Амстердам", "Рим") ("Лондон", "Париж", "Берлин", "Рим", "Амстердам") ("Лондон", "Париж", "Амстердам", "Берлин", "Рим") ... ("Рим", "Амстердам", "Париж", "Берлин", "Лондон") ("Рим", "Амстердам", "Берлин", "Лондон", "Париж") ("Рим", "Амстердам", "Берлин", "Париж", "Лондон")

Здесь наш список входов состоит из 5 пунктов, а для каждого из них наши остальные пункты уменьшаются на 1. Другими словами, наши 5 входов выбирают 5 × 4 × 3 × 2 × 1 {\displaystyle 5\times 4\times 3\times 2\times 1}{\displaystyle 5\times 4\times 3\times 2\times 1} пунктов (или 5 ! {\displaystyle 5!}{\displaystyle 5!} ). Если наш вход n {\displaystyle n}n длинный город, то количество выходов n ! {\displaystyle n! }{\displaystyle n!} ; другими словами, предполагая, что мы пройдем через каждую перестановку, нам понадобится O ( n ! ) {\displaystyle O(n!)} {\displaystyle O(n!)}циклов для ее завершения.

Маленькая запись

Более строгая версия "Большой О" - маленькая. Разница между большим О и малым О заключается в том, что малый О - это строгая верхняя граница: если О ( n ) {\displaystyle O(n)} {\displaystyle O(n)}означает, что время завершения увеличится до этого максимума в зависимости от размера входного файла, то о ( n ) {\displaystyle o(n)}{\displaystyle o(n)} означает, что время завершения, как правило, будет меньше этого количества времени. Другими словами, Big O предполагает, что каждый цикл будет проходить по самому длинному пути и процесс займет как можно больше времени, в то время как little-o более реалистично относится к реальному времени выполнения; если количество циклов основано на бросании 6-тигранной кости, то Big O всегда будет считать, что брошена 6-тигранная кость, в то время как little-o будет учитывать одинаковую вероятность броска других чисел.

Вопросы и ответы

В: Что такое нотация Big O?


О: Нотация Big O - это способ сравнения темпов роста различных функций, часто используемый для сравнения эффективности различных алгоритмов путем подсчета того, сколько памяти и времени требуется для выполнения. Она также может быть использована для определения сложности проблемы.

В: Кто первым использовал эту нотацию?


О: Математик Пауль Бахман (1837-1920) был первым, кто использовал эту нотацию в своей книге "Analytische Zahlentheorie" в 1896 году.

В: Что означает "большое О"?


О: Big O означает "порядок функции", что относится к скорости роста функций.

В: Как используется Big O?


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

В: Что такое символы Ландау?


О: Символы Ландау относятся к нотации Big O, названной в честь Эдмунда Ландау (1877-1938), который сделал эту нотацию популярной.

В: Почему Big O полезна?



О: Big O позволяет нам измерять скорость без необходимости запускать программы на компьютерах, поскольку она всегда предполагает наихудшие сценарии, что делает ее последовательной независимо от аппаратных различий между компьютерами. Он также показывает, насколько эффективен алгоритм, без необходимости запускать его на компьютере.

AlegsaOnline.com - 2020 / 2023 - License CC3