fbpx

Каталог статей

Каталог статей для размещения статей информационного характера

Как выучить

Шпаргалка по нотации Big O

Шпаргалка по нотации Big O

Big O Notation – это метрика для определения эффективности алгоритма. Проще говоря, она дает оценку того, сколько времени потребуется вашему коду для выполнения различных наборов входных данных. Вы также можете рассматривать ее как способ измерения того, насколько эффективно масштабируется ваш код при увеличении размера входных данных.

Временная сложность и пространственная сложность – это два конкретных метода измерения эффективности.

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

Для быстрого ознакомления с нотацией Big O продолжайте читать эту шпаргалку!

БАЗОВЫЙ УРОВЕНЬ

Что такое Big O?

Big O также известен как верхняя граница алгоритма, поскольку он анализирует наихудшую ситуацию.

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

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

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

Как измерить эффективность алгоритма?

Эффективность измеряется двумя способами: временная сложность и пространственная сложность.

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

Большая нотация O, O(g(n)), представляет собой набор функций. Функция f(n) является членом этой коллекции только в том случае, если она удовлетворяет следующим критериям:

Таким образом, когда алгоритм выполняет вычисления над каждым элементом массива размера n, он затрачивает O(n) времени и выполняет O(1) работы над каждым элементом.

Но зачем нам нужно большое O?

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

Поэтому программисты должны тщательно проверять и оценивать свой код. Эта шпаргалка по Big O Notation (шпаргалка по временной сложности структур данных) поможет вам разобраться в ряде сложностей.

Что такое временная сложность?

Временная сложность, вычислительная сложность или временная сложность

Общий объем памяти или пространства, используемый алгоритмом/программой, включая пространство входных значений для выполнения, называется пространственной сложностью. Чтобы определить сложность пространства, просто вычислите, сколько места занимают переменные в алгоритме/программе.

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

Пространственная сложность = вспомогательное пространство + пространство, используемое входными значениями.

Лучшие алгоритмы/программы должны иметь наименьшую пространственную сложность. Чем меньше пространства используется, тем быстрее она выполняется.

В идеале, пространственная и временная сложность зависит от различных факторов, таких как базовое оборудование, ОС, ЦП, процессор и т.д. Но для простоты мы обычно не учитываем эти факторы при анализе производительности алгоритма.

Ниже перечислены основные временные и пространственные сложности:

Постоянная: O(1)

  • Линейное время: O(n)
  • Логарифмическое время: O(n log n)
  • Квадратичное время: O(n^2)
  • Экспоненциальное время: 2 ^(n)
  • Факториальное время: O(n!)
  • ПРОМЕЖУТОЧНЫЙ УРОВЕНЬ

Диаграмма Big O

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

При написании нотации Big O мы ищем самый быстрорастущий член по мере того, как входные данные становятся все больше и больше. Мы можем упростить уравнение, удалив все недоминирующие члены и константы.

O(2n) упрощается до O(n), и

  • O(n^2 + n + 1000) упрощается до O(n^2).
  • Ниже приводится подробное объяснение различных типов сложности с примерами:

Постоянное время: O(1)

Когда нет зависимости от размера входа n, говорят, что алгоритм имеет постоянное время порядка O(1).

Пример

Приведенная выше функция потребует только одного шага выполнения независимо от того, содержит ли массив 1, 100 или 1000 элементов. В результате функция имеет постоянное время с временной сложностью O(1).

Линейное время: O(n)

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

Пример

Приведенная выше функция потребует только одного шага выполнения независимо от того, содержит ли массив 1, 100 или 1000 элементов. В результате функция имеет постоянное время с временной сложностью O(1).

Примечание: Даже если вы выполните итерацию над половиной массива, время выполнения все равно зависит от размера входных данных, поэтому оно будет считаться O(n).

Логарифмическое время: O(log n)

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

Чтобы лучше понять log n, давайте подумаем о поиске слова в словаре. Если вы хотите найти слово с буквой “p”, вы можете пройтись по всем алфавитам и попытаться найти это слово, что занимает линейное время O(n). Другой путь – открыть книгу точно на центральной странице. Если слово на центральной странице находится перед буквой “p”, вы ищете его в правой половине. В противном случае ищите в левой половине. В этом примере вы каждый раз уменьшаете размер входных данных в два раза, поэтому количество операций, которые вам нужно будет выполнить, значительно уменьшается по сравнению с перебором каждой буквы. Таким образом, временная сложность будет равна O(log (n)).

Пример

Приведенная выше функция потребует только одного шага выполнения независимо от того, содержит ли массив 1, 100 или 1000 элементов. В результате функция имеет постоянное время с временной сложностью O(1).

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

Метод бинарного поиска берет отсортированный список элементов и ищет в нем элемент x. Вот как работает алгоритм:

Найдите середину списка.

  1. Сравните цель с серединой.
  2. Мы нашли нашу цель, если наше значение и цель совпадают.
  3. Если наше значение меньше, чем цель, мы сосредоточимся на списке со значениями от среднего плюс один до самого высокого.
  4. Если наше значение больше, чем цель, мы фокусируемся на списке, начиная с наименьшего значения и заканчивая серединой минус один.
  5. Продолжаем, пока не найдем цель или пока не достигнем последнего элемента, что указывает на отсутствие элемента в списке.
  6. С каждой итерацией размер нашего поискового списка уменьшается вдвое. Поэтому обход и поиск элемента в списке занимает O(log(n)) времени.

Квадратичное время: O(n^2)

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

Пример

Приведенная выше функция потребует только одного шага выполнения независимо от того, содержит ли массив 1, 100 или 1000 элементов. В результате функция имеет постоянное время с временной сложностью O(1).

Экспоненциальное время: O(2^n)

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

Пример

Приведенная выше функция потребует только одного шага выполнения независимо от того, содержит ли массив 1, 100 или 1000 элементов. В результате функция имеет постоянное время с временной сложностью O(1).

Структура данных

Сложность алгоритма – это метрика, определяющая порядок счета операций алгоритма как функцию размера входных данных.

Когда мы говорим о сложности, мы имеем в виду порядок счета операций, а не точное общее количество операций. Проще говоря, сложность оценивает приблизительное количество шагов/операций, необходимых для завершения алгоритма. Вот некоторые важные сложности известных алгоритмов, которые вам необходимо знать: Алгоритмы поиска
Алгоритмы поиска Пространственная сложность Временная сложность Наилучший случай
Средний случай Худший случай Линейный поиск Худший случай Худший случай Худший случай
O(n) Худший случай Худший случай Худший случай Линейный поиск Линейный поиск
Алгоритмы сортировки Худший случай Худший случай Худший случай Линейный поиск Линейный поиск
Худший случай Худший случай Худший случай Худший случай Линейный поиск Линейный поиск
Сортировка вставки Худший случай Худший случай Худший случай Линейный поиск Линейный поиск
O(1) Худший случай N/A Линейный поиск Линейный поиск Линейный поиск
O(log n) Худший случай O(n log n) O(n log n) O(n log n) O(n log n)

O(n)

O(n log n)

O(n log n)

Сортировка кучи

O(1)

O(1) Вот некоторые важные сложности известных алгоритмов, которые вам необходимо знать: O(n log n)
ПРОДВИНУТЫЙ УРОВЕНЬ Вычисление сложности Чтобы определить временную сложность нашего кода, мы должны изучить его строка за строкой, обращая внимание на следующие факторы:
Присваивания, биты и математические операторы – все это базовые операции. Линейный поиск Линейный поиск Худший случай Худший случай
Это O(2n), которое упрощается до просто O(n). Линейный поиск Линейный поиск O(n log n) O(n log n)

При анализе сложности Big-O не имеет значения, каково основание логарифма; они асимптотически одинаковы или отличаются лишь постоянным коэффициентом.

При анализе сложности Big-O не имеет значения, каково основание логарифма; они асимптотически одинаковы или отличаются лишь постоянным коэффициентом. Вот некоторые важные сложности известных алгоритмов, которые вам необходимо знать: O(n log n)
ПРОДВИНУТЫЙ УРОВЕНЬ Вычисление сложности Чтобы определить временную сложность нашего кода, мы должны изучить его строка за строкой, обращая внимание на следующие факторы:
Сложность среднего времени выполнения Линейный поиск Поиск Поиск Поиск
Пропуск списка Линейный поиск Худший случай Поиск Поиск
O(log n) Линейный поиск Худший случай Поиск Поиск
O(log n) O(n log n) O(n log n) O(log n) O(log n)
O(log n) Худший случай Худший случай O(log n) O(log n)
O(log n) Линейный поиск Линейный поиск O(log n) O(log n)

O(log n)

O(log n)

O(log n)

  • Дерево AVL
  • O(n)
  • O(log n)

O(log n)

O(log n)

O(log n)

Дерево KD

O(n)

O(log n)

O(log n)

O(log n)

O(log n)

Подведение итогов

Вот и все для этой шпаргалки по Big O! Мы рассмотрели множество тем, связанных с нотацией Big O, а также сложностью структур данных и алгоритмов.

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

Когда мы говорим о сложности, мы имеем в виду порядок счета операций, а не точное общее количество операций. Проще говоря, сложность оценивает приблизительное количество шагов/операций, необходимых для завершения алгоритма. Вот некоторые важные сложности известных алгоритмов, которые вам необходимо знать: Алгоритмы поиска
Алгоритмы поиска Пространственная сложность Временная сложность Наилучший случай
O(log n) O(n log n) O(n log n) O(n log n) O(n log n)
Худший случай N/A O(n log n) O(n log n) O(n log n)
Худший случай O(n log n) O(n log n) O(n log n) O(n log n)
Худший случай O(n log n) O(n log n) O(n log n) O(n log n)
Худший случай N/A O(n log n) O(n log n) O(n log n)
Худший случай O(n log n) O(n log n) O(n log n) O(n log n)
Худший случай O(n log n) O(n log n) O(n log n) O(n log n)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *