freeCodeCamp/guide/russian/algorithms/algorithm-performance/index.md

10 KiB
Raw Blame History

title localeTitle
Algorithm Performance Эффективность алгоритма

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

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

В математике обозначение Big-O является символом, используемым для описания и сравнения предельного поведения функции.

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

Короче говоря, обозначение Big-O используется для описания роста или снижения функции, как правило, в отношении другой функции.

ПРИМЕЧАНИЕ: x ^ 2 эквивалентно x * x или 'x-squared']

Например, мы говорим, что x = O (x ^ 2) для всех x> 1, или, другими словами, x ^ 2 является верхней границей по x и, следовательно, растет быстрее.
Символ утверждения типа x = O (x ^ 2) для всех x> n можно заменить x <= x ^ 2 для всех x> n, где n - минимальное число, удовлетворяющее требованию, в этом случае 1.

Эффективно мы говорим, что функция f (x), то есть O (g (x)), растет медленнее, чем g (x).

Сравнительно, в информатике и разработке программного обеспечения мы можем использовать примечание «большой О», чтобы описать эффективность алгоритмов с помощью его временной и пространственной сложности.

Космическая сложность алгоритма относится к его размеру памяти относительно размера ввода.

В частности, при использовании записи с большим О мы описываем эффективность алгоритма по отношению к входу: n , обычно по мере приближения n к бесконечности.
При изучении алгоритмов мы обычно хотим снизить сложность времени и пространства. Сложность времени o (1) указывает на постоянное время.

Благодаря сравнению и анализу алгоритмов мы можем создавать более эффективные приложения.

Для производительности алгоритма мы имеем два основных фактора:

  • Время : нам нужно знать, сколько времени требуется для запуска алгоритма для наших данных и как он будет расти по размеру данных (или в некоторых случаях других факторов, таких как количество цифр и т. Д.).

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

Следующие 3 обозначения в основном используются для представления временной сложности алгоритмов:

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

    Θ (g (n)) = {f (n): существуют положительные константы c1, c2 и n0 такие, что 0 <= c1 g (n) <= f (n) <= c2 g (n) для всех n> = n0}

  2. Big O Notation : нотация Big O определяет верхнюю границу алгоритма. Например, Insertion Sort принимает линейное время в лучшем случае и квадратичное время в худшем случае. Мы можем с уверенностью сказать, что временная сложность сортировки Insertion равна O ( n ^ 2 ).

    O (g (n)) = {f (n): существуют положительные константы c и n0 такие, что 0 <= f (n) <= cg (n) для всех n> = n0}

  3. Ω Обозначение : нотация Ω обеспечивает нижнюю границу алгоритма. он показывает самый быстрый ответ для этого алгоритма. > Ω (g (n)) = {f (n): существуют положительные константы c и n0 такие, что 0 <= cg (n) <= f (n) для всех n> = n0}.

Примеры

В качестве примера мы можем рассмотреть временную сложность алгоритма [пузырьковой сортировки] и выразить его с помощью записи с большими нотами.

Bubble Сортировать:

    // Function to implement bubble sort 
    void bubble_sort(int array<a href='http://bigocheatsheet.com/' target='_blank' rel='nofollow'>], int n) 
    { 
        // Here n is the number of elements in array 
        int temp; 
        for(int i = 0; i < n-1; i++) 
        { 
            // Last i elements are already in place 
            for(int j = 0; j < ni-1; j++) 
            { 
                if (array[j] > array[j+1]) 
                { 
                    // swap elements at index j and j+1 
                    temp = array[j]; 
                    array[j] = array[j+1]; 
                    array[j+1] = temp; 
                } 
            } 
        } 
    } 

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

Изучая сценарий наихудшего случая, когда массив находится в обратном порядке, первая итерация будет производить n сравнений, в то время как следующий должен будет сделать n - 1 сравнений и т. Д., Пока не будет сделано только одно сравнение.
Таким образом, для этого случая обозначение Big-O имеет вид n * [( n - 1) / 2], которое = 0,5 n ^ 2 - 0,5 n = O ( n ^ 2), поскольку n ^ 2 член доминирует над функцией, которая позволяет нам игнорировать другой член функции.

Мы можем подтвердить этот анализ с помощью [этого удобного листа cheat Big-O, который отличается сложностью во времени большого количества часто используемых структур данных и алгоритмов

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

Для получения дополнительной информации о том, почему важная нотация и анализ алгоритма важны, посетите этот видеоролик !