хуйу нас не матерятся
Так уж получается, что я принимаю участие в найме сотрудников в разные организации уже лет так 5. И у меня собралась печальная статистика, > 80% жабаскриптеров не знаю даже базовых алгоритмов и структур данных. Сейчас я попробую их(Вас) убедить что эти знания крайне нужны.
Давайте представим, что наш фронтэнд получил ответ от бэка со списком всех сотрудников, вида:
[
{ id: 1, name: 'Паша', salary: 859, age: 49 },
{ id: 2, name: 'Маша', salary: 200, age: 20 },
...
]
И нам на фронте нужно получить количество человек с зарплатой > 300 тугриков. Стандартно это делается так:
let count = 0;
for(let item of employee)
if( item.salary > 300 )
count ++;
console.log('Result:', count);
В этом примере, нам всегда приходится обходить все элементы массива, сложность алгоритма On, причём и в среднем и в лучшем, и в худшем случае.
И всё тут нормально, если количество записей небольшое, а выполнять эту процедуру нужно ровно 1 раз. Если же эту процедуру нужно выполнять несколько раз, например, по запросу пользователя, то код выше можно легко оптимизировать:
let sortedBySalary = employee.sort( (a,b) => a.salary - b.salary );
function findCountMore1(arr, value) {
for(let index=0; index<arr.length; index++)
if( arr[ index ].salary > value )
return arr.length - index;
return 0;
}
console.log('Result:', findCountMore1(sortedBySalary, 300));
Сортируем массив по зарплате. А уже в сортированном массиве достаточно найти первый элемент удовлетворяющий нашим условиям, ведь все следующи тоже 100% будет их удовлетворять.
В этом примере, сложность в среднем On/2, в лучшем случае O1, то есть первый же элемент может удовлитворить критериям и дальнейший обход массива останавливается. В худшем получим On, так же как и в прошлом примере, это в случае, если все элементы не удовлетворяют критериям.
Возьмём пример данных выше, и представим, что нужно получать сотрудников отфильтрованных по возрасту, или по имени. В этом случае мы можем сгруппировать данные по индексам хэштаблицы. А хэштаблицей в js является обычный объект:
let hashIndex = {};
for(let item of employee) {
if( !hashIndex[ item.age ] )
hashIndex[ item.age ] = [];
hashIndex[ item.age ].push(item);
}
console.log('Result:', hashIndex[ 42 ]);
После этой подготовки мы сможем находить всех сотрудников по возрасту за время O1, это на порядок быстрее, чем стандартным перебором через Array.find, который всегда проходится по всем элементам.
А к тому, что самые базовые знания алгоритмов и структур данных, могут ускорить Ваш код в разы.