Сообщение от Alexandroppolus
|
Я бы чуть по-другому сделал:
pool - это Map, где ключём будет участник, а значением - двусвязный список задач, связанных с участником. Большой общий список всё равно не нужен. Когда приходит новая задача, она просто добавляется в списки к обоим участникам (если не может выполниться прямо сейчас, т.е. кто-то из двух занят).
Когда участников много (всего М), то оптимизация очень хорошая: если задачи распределены более-менее равномерно, то имеем дело со списками, которые меньше полного списка в М раз. Ну а если оказалось, что почти все задачи завязаны на какого-то одного участника Х, то по нему выстроится длинный список, зато все прочие будут почти всегда свободны, и нам не придется долго искать задачу в этом длинном списке.
Долгие проходы по списку будут, но в редких случаях.
Итого: довольно простая оптимизация, которая охватывает почти все кейсы.
|
Alexandroppolus,
voraa,
Получается, когда какая-либо операция между <Петя> и <Вася> выполнена — мы проверяем pool на наличие ключей только с их именем, вместо того, чтобы проверять единый список от начала до конца.
Только непонятно как проводить выполнение операции в таком случае:
1. Выполняется операция <Петя> передает <Васе> 5 бочек апельсинов — а этот момент они находятся в buffer.
const buffer = new Set();
buffer.add('Петя');
buffer.add('Вася');
2. Пока эти 5 бочек транспортируются, <Вася> решил 1 бочку апельсинов передать <Мише> и 1 бочку <Кате>.
const pool = new Map();
//при условии, что Васи вообще нет в pool
pool.set('Вася', [
{
action: 'Отправить 1 бочку апельсинов',
to: 'Миша'
},
{
action: 'Отправить 1 бочку апельсинов',
to: 'Катя'
}
]);
pool.set('Миша', [{
action: 'Отправить 1 бочку апельсинов',
from: 'Вася'
}]);
//а вот Катя уже сидит в пуле, например
let KatyaTasks = pool.get('Катя');
KatyaTasks.push({
action: 'Отправить 1 бочку апельсинов',
from: 'Вася'
});
pool.set('Катя', KatyaTasks);
3. Когда операция между <Петя> и <Вася> завершается, то они удаляются из buffer и их имена начинают искаться в pool.
buffer.delete('Петя');
buffer.delete('Вася');
/* а дальше-то как? */