Алгоритмы составления топа-50 items по входящим позициям
Есть такая задачка которую я уже не могу сам решить. Требуется из входящих данные составить топ 50 лучших.
Данные для определения топа это просто цифры в одном item их может быть от 1 до n количества ( но есть определенная граница, к примеру это будет 3, она тоже динамическая и определяется по количеству источников )
К примеру возьмем 3 item с такими данным [3, 2, 3], [1, 3], [3] Ранее я пытался подобное считать с помощью средней арифметической, то есть сложить все цифры в массиве и разделить на количество. Но этот подход выдает не совсем правильные данные
Выходят item с наименьшими элементами на 1 место, а должно быть наоборот так как источников нашлось меньше, недостающие позиций можно считать за 51
Эту 51 можно использовать в расчете, я это тоже пробовал. Вышло еще хуже, item разбросаны не понятно как
Подскажите какие алгоритмы тут могут быть полезны и примеры их если не затруднит. Задача уже горит, сделать нужно, а в голове каша образовалась
Проще говоря возьмем ТОП-3
С входящими 9 item. У каждого item есть своя позиция изначальная, из этих изначальных позиций мне нужно составить алгоритм поиска общей позиций.
[[1,2,1], [2,1,3], [3,5,6], [2], [1,3], [3], [5], [5,5,3], [3,7,12]] - это массив items с масивом позиций item по которым происходит составление ТОПа
То есть [1, 2, 1] - это 1 item с тремя источниками и их позициями. Ранее я делал так 1 + 2 + 1 = 4 / 3(колличество источников) и получал балл для сортировки
Но так как источников может быть от 1 до условно 3, этот метод отпадает, из-за того что item с данными [2] всегда стоит выше чем [1, 2, 1], а тут меньше источников что уже делает его не таким важным чем [1, 2, 1] где есть все источники к тому же на первых позициях. Надеюсь теперь стало понятнее Вот кусок кода который создает рейтинг балл
Давайте еще проще из n количества цифр мне нужно получить балл для составления топа. Но нужно учесть что чем больше количество n элементов тем выше рейтинг, с учетом суммы n цифр
rating = () => {
this.tracks = this.tracks.map(_collection => {
const positions = []
_collection.data.forEach((_track, _index) => {
if (_index <= this.services.length) {
positions.push({
service: _track.parent.service,
position: _track.parent.position
})
}
})
// Ищем не найденные треки и добавляем им позиицию 101
this.entityServices.forEach(service => {
const position = positions.find(_position => {
if (_position.service === service.name) return _position
})
if (!position) {
positions.push({
service: service.name,
position: 101
})
}
})
// Складываем все позиции
let summ = 0
positions.forEach(position => {
const service = this.entityServices.find(_service => {
if (_service.name === position.service) return _service
})
const weight = (service) ? service.weight : 1
summ += (position.position * weight)
})
// Делим сумму на колличество сервисов и обрезаем число после запятой на 2
summ = ((summ / positions.length) * this.entityServices.length)
_collection.rawPosition = summ
return _collection
})
return this
}