Обложка канала

geeks content

Канал IT-сообщества для отбора настоящих гиков в закрытый чат. Принимай вызовы или просто отписывай комментарии по постам и может быть тебя позовут в чат.

geeks content

6 лет назад
Открыть в
Меня попросили "простыми" словами рассказать про вычислительную сложность - вот эта вот буква O, после которой в скобках следует как правило n: O(n), O(n^2), O(log(n)), O(1). Единица - это, кстати, самое крутое, что может быть для алгоритма, грубо говоря это значит, что алгоритм выполняется сразу.

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

В целом сложность алгоритма представляет из себя максимальное количество итераций вашего цикла или циклов в сумме. Например, если надо в массиве найти элемент со значением 7, то сложность такого поиска будет O(n):

for (let i = 0; i < arr.length; i++) {
if (arr[i] === 7) return true;
}

Если у вас цикл в цикле, например, тот же поиск числа в двумерном массиве, то перемножаете количество итераций обоих циклов и получается O(n * m), m - количество итераций второго цикла:

for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr[i].length; j++) {
if (arr[i][j] === 7) return true;
}
}

На деле такое количество итераций будет только если элемента в массиве нет или он на последней позиции. Но учитываем всегда самый плохой вариант. У сортировки пузырьком 2 вложенных цикла над одним массивом, поэтому ее сложность O(n * n) = O(n^2).

Вычислительная сложность обычно спрашивается на собеседованиях и объясняется в универах, после которых забывается. Но вот я (и не только) постоянно прикидываю сложность и учитываю ее у уже реализованных алгоритмов, например, метод Array.sort(). Вам тоже рекомендую - это не сложно.

На фронте достаточно часто игнорирование сложности своего и чужих алгоритмов в обработчиках событий, таких как change, mousemove, mouseover приводит к торможениям.