O и o нотация: в чем разница и зачем это нужно?

Дата публикации: 10 апр 2024
Сегодня обсудим две нотации в алгоритмах: O (большое O) и o (малое o). Если ты слышал «этот алгоритм работает за O(n log n)», но не понимаешь, что это значит, этот пост для тебя.
Содержание

    Что такое O нотация

    O нотация (большое O) — это способ описать, как быстро растёт время работы алгоритма при увеличении объема данных.

    Например:

    O(n) — время работы растёт линейно с увеличением данных.

    O(n²) — время работы растёт квадратично (например, если данных в 2 раза больше, то времени нужно в 4 раза больше).

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

    А что такое о нотация

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

    Например:

    Если алгоритм работает за O(n), это значит, что его сложность не больше, чем линейная.

    Если алгоритм работает за o(n), это значит, что его сложность строго меньше линейной.

    Пример для понимания

    Представь, что у тебя есть два алгоритма:

    1. Алгоритм A работает за O(n). Это значит, что его сложность не превышает линейной, но может быть и меньше (например, константная O(1)).
    2. Алгоритм B работает за o(n). Это значит, что его сложность строго меньше линейной. Например, он может работать за O(log n).

    Зачем это нужно?

    O нотация помогает оценить, насколько алгоритм масштабируется. Например, если у тебя O(n²), то на больших данных он может тормозить.

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

    Пример из жизни

    Представь, что ты выбираешь алгоритм для сортировки данных:

    Сортировка пузырьком работает за O(n²). Это медленно, но просто в реализации.

    Быстрая сортировка (QuickSort) работает за O(n log n). Это намного быстрее, особенно на больших данных.

    Если бы QuickSort работал за o(n log n), это значило бы, что он еще быстрее, чем O(n log n), но на практике это не так.

    Поэтому для QuickSort используется O(n log n).

    Содержание