Задать вопрос

Как правильно оценить сложность алгоритма O(n)?

Разбираюсь с алгоритмами и оценкой их сложности. В нескольких примерах заметил момент в связи, с которым и возник следующий вопрос. Приведу абстрактный пример.
Условно задача решается с помощью цикла:
function f2() {
    const array = Array(100).fill(null);

    return array.reduce((accumulator, currentValue) => {
        return accumulator;
    }, []);
}

Как я понимаю, это линейная сложность алгоритма O(n).

Если задача решается с помощью цикла и в него вложен ещё один цикл:
function f2() {
    const array = Array(100).fill(null);

    for (let i = 0; i < array.length; i++) {
        for (let j = i + 1; j < array.length; j++) {

        }
    }
}

То здесь сложность O(n2)

Вопрос насчёт третьего случая, если задача решается, например, с помощью циклов, которые идут друг за другом:
function f3() {
    const array = Array(100).fill(null);

    return array.reduce((accumulator, currentValue) => {
        return accumulator;
    }, []);
}

В примерах, это тоже это тоже линейная сложность алгоритма O(n).
Но это же не одно и тоже, что и в первом примере выше.
  • Вопрос задан
  • 608 просмотров
Подписаться 4 Простой 1 комментарий
Решение пользователя pogoreli К ответам на вопрос (4)
@pogoreli
Да, в первом и последнем случае будет O(n). Но это сокращённый формат, которым все пользуются.

Вообще они не одинаковые. В первом случае это будет O(1*n). В последнем O(3*n).

Но эти константы вообще не важны, потому что big O notation описывает форму функции, а не её конкретные параметры. А обе эти функции- линейные.

Коэффициентами можно принебречь.

Так что первый и последний алгоритм не одинаковые, но имеют одинаковое обозначение, потому что обе эти функции линейные.

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