Показать сообщение отдельно
  #125 (permalink)  
Старый 09.01.2023, 20:41
Аватар для webgraph
Профессор
Отправить личное сообщение для webgraph Посмотреть профиль Найти все сообщения от webgraph
 
Регистрация: 14.11.2014
Сообщений: 186

Сообщение от 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('Вася');

/* а дальше-то как? */

Последний раз редактировалось webgraph, 09.01.2023 в 20:50.
Ответить с цитированием