PROG_WAY_BLOG Telegram 167
Big O notation

Каждый алгоритм можно оценить по времени и по памяти. При этом, не совсем понятно, как объективно составить эту оценку. Для решения этого вопроса существует O notation.

Это серьезный математически термин, который позволяет установить порядки сравнения поведения функций.

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

Рассмотрим примеры некоторых оценок по сложности:

— Константная сложность O(1)
Константная сложность по времени гласит «Вне зависимости от объема данных, скорость выполнения неизменна»

В коде это, например, обращение к объекту по ключу. Вне зависимости от размера объекта, значение по ключу доступно с константной сложностью.

— Линейная сложность O(n)
Алгоритм линейной сложности по времени — такой алгоритм, время выполнения которого прямо пропорционально объёму данных. Например, это метод reduce

[1, 2, 3, 4].reduce((acc, cur) => acc + cur, 0)


— Квадратная скорость O(n^2)
То есть время выполнения есть квадрат объёма данных. Это может быть тот же reduce, но примененный уже не для массива, а для матрицы, то есть это работа цикла внутри другого цикла.

matrix.reduce((acc, cur) => 
acc + cur.reduce((acc, cur) => acc + cur, 0), 0)


Этот код найдет сумму всех элементов матрицы.

Если же говорить об оценке по времени, то оценки могут быть такими же по величине, что и по сложности, то есть O(1), O(n)…

Рассмотрим пример, где сложность алгоритма по памяти — O(n):

const countElements = (arr) => {
const counts = {}

for (let i = 0; i < arr.length; i++) {
const key = arr[i]
if (counts[key]) {
counts[key] += 1
} else {
counts[key] = 1
}
}

return counts
}


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

Также стоит помнить, что при оценке алгоритма мы отбрасываем константы. То есть алгоритм сложностью O(3n) на самом деле равняется O(n), и так далее.

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

Спасибо за прочтение, это важно ❤️

#theory #useful
15👍6🍓4🗿2🆒2🐳1👨‍💻1🎅1



tgoop.com/prog_way_blog/167
Create:
Last Update:

Big O notation

Каждый алгоритм можно оценить по времени и по памяти. При этом, не совсем понятно, как объективно составить эту оценку. Для решения этого вопроса существует O notation.

Это серьезный математически термин, который позволяет установить порядки сравнения поведения функций.

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

Рассмотрим примеры некоторых оценок по сложности:

— Константная сложность O(1)
Константная сложность по времени гласит «Вне зависимости от объема данных, скорость выполнения неизменна»

В коде это, например, обращение к объекту по ключу. Вне зависимости от размера объекта, значение по ключу доступно с константной сложностью.

— Линейная сложность O(n)
Алгоритм линейной сложности по времени — такой алгоритм, время выполнения которого прямо пропорционально объёму данных. Например, это метод reduce

[1, 2, 3, 4].reduce((acc, cur) => acc + cur, 0)


— Квадратная скорость O(n^2)
То есть время выполнения есть квадрат объёма данных. Это может быть тот же reduce, но примененный уже не для массива, а для матрицы, то есть это работа цикла внутри другого цикла.

matrix.reduce((acc, cur) => 
acc + cur.reduce((acc, cur) => acc + cur, 0), 0)


Этот код найдет сумму всех элементов матрицы.

Если же говорить об оценке по времени, то оценки могут быть такими же по величине, что и по сложности, то есть O(1), O(n)…

Рассмотрим пример, где сложность алгоритма по памяти — O(n):

const countElements = (arr) => {
const counts = {}

for (let i = 0; i < arr.length; i++) {
const key = arr[i]
if (counts[key]) {
counts[key] += 1
} else {
counts[key] = 1
}
}

return counts
}


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

Также стоит помнить, что при оценке алгоритма мы отбрасываем константы. То есть алгоритм сложностью O(3n) на самом деле равняется O(n), и так далее.

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

Спасибо за прочтение, это важно ❤️

#theory #useful

BY progway — программирование, IT


Share with your friend now:
tgoop.com/prog_way_blog/167

View MORE
Open in Telegram


Telegram News

Date: |

How to build a private or public channel on Telegram? Concise On June 7, Perekopsky met with Brazilian President Jair Bolsonaro, an avid user of the platform. According to the firm's VP, the main subject of the meeting was "freedom of expression." ‘Ban’ on Telegram 2How to set up a Telegram channel? (A step-by-step tutorial)
from us


Telegram progway — программирование, IT
FROM American