Алгоритм JavaScript "Управление временем" Анализ временной и пространственной сложности

алгоритм структура данных
Алгоритм JavaScript "Управление временем" Анализ временной и пространственной сложности

"Видимость: 🌟🌟🌟🌟🌟"

"Вкус: Острая курица"

"Время приготовления: 15 мин."

Эта статья была включена вGithub github.com/Geekhyt, спасибо Стар.

После введения в структуры данных и алгоритмы洗脑, я не знаю, достигло ли всеобщее осознание важности структур данных и алгоритмов более высокого уровня. (Хотя количество прочитанного оставляет желать лучшего). Если вы не видели его, рекомендуется сначала прочитать пилотную версию.Как получить структуру данных и алгоритм во внешнем интерфейсе (пилот)

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

временная сложность и пространственная сложность

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

"Гуру тайм-менеджмента Айк: Иногда время имеет свои преимущества. Перепутана полярность!"

  • Возьмем в качестве примера League of Legends, например, когдаIGпобедитьSПосле чемпионата серии вы найдете большую группу только意识, но в поле зрения квалификационного матча оказываются игроки, операции которых не успевают. (Да, это мы) В студенческие годы мы тоже были бриллиантами, мастерами. Однако из-за работы мы можем только попрощаться с нашей молодежью. но,意识еще!

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

"Без лишних слов, давайте будем талантливыми!"

(выше концепции)

Сначала поймите время и пространство:

  • "Время: время, необходимое для выполнения текущего алгоритма."
  • "Пространство: сколько памяти требуется для выполнения текущего алгоритма."

Плюс сложность:

  • "Временная сложность: полное название — асимптотическая временная сложность, которая указывает на зависимость роста между временем выполнения алгоритма и размером данных."
  • "Пространственная сложность: Полное название — асимптотическая пространственная сложность, которая представляет зависимость роста между объемом памяти алгоритма и размером данных."

Другими словами, эффективность алгоритма执行时间、存储空间Два аспекта решили.复杂度分析就是用来分析算法执行效率与数据规模之间的关系,включать时间复杂度а также空间复杂度.

Зачем придумали эти два понятия? Все еще думаете, что у меня недостаточно понятий, чтобы понять?

На самом деле, вы также можете вести апостериорную статистику, обычно известную как"задним числом". Но поскольку все они названы в честь лошади, у нее должны быть свои недостатки.

  • Статистический тест после события, как правило, должен быть связан с определенной средой, напримерDEV、SIT、UATЕсли конфигурация компьютера среды отличается, результаты измерений будут другими. Грубо говоря, вы берете один и тот же кусок кода под разные процессоры(i9、i5、i3)Для запуска теста результаты разные.

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

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

Обозначение большого O

Обозначение Big O было впервые введено немецким теоретиком чисел Паулем Бахманом в его книге 1892 года «Теория аналитических чисел», а позже популяризировано другим немецким теоретиком чисел, Эдмундом Ландау.

T(n) = O(f(n))

所有代码的执行时间 T(n) 与每行代码的执行次数 n 成正比。

  • T(n): время выполнения кода
  • п: размер данных
  • f(n): сумма количества выполнений каждой строки кода.
  • O: означает, что T(n) пропорционально f(n)

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

Общая временная сложность

Порядок величины увеличивается следующим образом:

  • 常量阶 O(1)
  • 对数阶 O(logn)
  • 线性阶 O(n)
  • 线性对数阶 O(nlogn)
  • 平方阶 O(n^2)
  • 立方阶 O(n^3)
  • 指数阶 O(2^n)
  • 阶乘阶 O(n!)

в,指数阶а также阶乘阶При увеличении размера данных n время выполнения резко возрастает, что очень неэффективно, анализировать пока не будем. Давайте разберемся с оставшейся временной сложностью один за другим через код.

Постоянный порядок O(1)

const a = 1;
let b = 2;

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

Логарифмический O (logn)

let i = 1;
const n = 6;
while (i < n) {
  i = i * 2;
}

Обратите внимание на приведенный выше код: после выполнения цикла x раз цикл завершается. То есть 2 в степени x равно n. Тогда x = log2^n, т. е. цикл завершается после выполнения log2^n раз, а временная сложность равна O(logn).二分查找的时间复杂度就是 O(logn)。

Линейный порядок O (n)

const n = 996;
for (let i = 0; i <= n; i++) {
    console.log('来过' + i +'次前端食堂吃饭');
}

Нет сомнения, что код в цикле for будет выполнен n раз, поэтому временная сложность такого кода равна O(n).计数排序、基数排序、桶排序的时间复杂度都是 O(n)。

Линейный логарифмический порядок O (nlogn)

let j = 1;
const n = 6;
for (let i = 0; i <= n; i++) {
    while (j < i) {
        j = j * 2;
    }
}

После понимания логарифмического порядка и линейного порядка легко понять линейный логарифмический порядок, то есть, если код с временной сложностью O(logn) повторяется n раз, то его временная сложность равна O(nlogn).归并排序、快速排序、堆排序的时间复杂度都是 O(nlogn)。

Квадратный порядок O (n ^ 2)

const n = 6;
for (let i = 0; i <= n; i++) {
    for (let j = 0; j <= n; j++) {
        console.log('前端食堂的饭真香');
    }
}

Квадратный порядок заключается в том, чтобы вложить код O (n) еще в один цикл, а его временная сложность составляет O (n ^ 2).冒泡排序、插入排序、选择排序的时间复杂度都是 O(n^2)。

Что касается O(n^3), то это гнездо петель на основе O(n^2). (матрешка)

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

Помимо,"Существуют также временная сложность в лучшем случае, временная сложность в наихудшем случае, временная сложность в среднем случае, амортизированная временная сложность и т. д.". На практике в большинстве случаев он не особенно широко используется и не будет здесь расширяться.

На самом деле код часто оказывается сложнее. Вот несколько советов, как оценить временную сложность:

  • 单段代码看高频:循环
  • 多段代码取最大:有循环和多重循环的情况,取多重循环的复杂度
  • 嵌套代码求乘积:循环中的递归
  • 多个规模求和:分别有两个参数控制两个循环的次数,取二者的复杂度相加

Общая космическая сложность

  • O(1)
  • O(n)
  • O(n^2)

Мы все еще анализируем его по одному через код:

O(1)

const a = 1;
let b = 2;

Пространство, занимаемое определяемыми нами переменными a и b, не меняется при замене переменной, поэтому его пространственная сложность равна O(1).

O(n)

let arr = [];
const n = 996;
for (let i = 0; i < n; i++) {
    arr[i] = i;
}

Память, занимаемая arr, определяется n и будет увеличиваться по мере увеличения n, поэтому его пространственная сложность равна O(n)."Если вы инициализируете двумерный массивn*n, то его пространственная сложность равна O(n^2)."

Кроме того, логарифмические пространственные сложности, такие как O(logn) и O(nlogn), редко встречаются в обычное время и не будут здесь рассматриваться.

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

Трансформация времени и пространства

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

План столбцов серии последующих алгоритмов

  • Опыт работы с LeetCode
  • Общий алгоритм решения проблем

❤️Любовное тройное комбо

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

2. Обратите внимание на фронтальную столовую официального аккаунта,"Ваша передняя столовая, не забывайте есть вовремя"!

3. Эта статья добавлена ​​в интерфейсную столовую.Github github.com/Geekhyt, попросите звездочку, поблагодарите звездочку.