Код Middle Кластер, воркеры, масштабирование обновлено

Плавный взвешенный round-robin как в nginx

Условие

Напиши weightedRoundRobin(servers, n): servers массив { name, weight }, вернуть имена серверов для первых n запросов по алгоритму smooth weighted round-robin:

  1. у каждого сервера есть current, изначально 0;
  2. на каждый запрос: к current каждого сервера прибавить его weight; выбрать сервер с максимальным current (при равенстве первый в массиве); вычесть из его current сумму всех весов.

Сервер с весом 0 не выбирается никогда. Если все веса нулевые, верни пустой массив.

Примеры

weightedRoundRobin([{"name":"a","weight":5}, {"name":"b","weight":1}, {"name":"c","weight":1}], 7) // ["a", "a", "b", "a", "c", "a", "a"]
weightedRoundRobin([{"name":"x","weight":1}, {"name":"y","weight":1}], 4) // ["x", "y", "x", "y"]
weightedRoundRobin([{"name":"big","weight":3}, {"name":"small","weight":1}], 8) // ["big", "big", "small", "big", "big", "big", "small", "big"]

Как подойти

Подсказки: 2
  1. Каждый шаг: всем current += weight, у выбранного current -= total.
  2. Строгое > при выборе даёт «первый при равенстве».

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.

Термины по теме