Middle+
23
Жарнама желісінің прототипінде жарнама орындарын сату келесідей ұйымдастырылған: сатып алушылар алдын ала өз бағаларын айтады, ал әрбір жарнама орнына олар оны сатып алуға дайын ба, жоқ па, жауап береді. Сату алдында, жоғары баға ұсынған сатып алушылардан келісім немесе бас тарту күтетін функцияны жүзеге асыру керек, содан кейін келісім бергендердің ішінен ең жоғары баға ұсынған сатып алушыға жарнама орнын сатады. Функциядан жауапты мүмкіндігінше тез қайтару керек.
Сұралған компаниялар
Яндекс
AI-дан жауап
sobes.tech AI
Ваша задача — как можно быстрее определить покупателя с максимальной ценой, который согласился купить рекламное место. При этом ответы покупателей приходят асинхронно и могут быть в любом порядке.
Основная идея решения:
- Отсортировать покупателей по цене по убыванию — от самого дорогого к дешевому.
- Запустить параллельно все промисы
accepts(). - Обрабатывать ответы в порядке убывания цены, чтобы как только самый дорогой покупатель согласится, сразу вернуть его индекс.
- Если самый дорогой отказался, ждать ответа следующего по цене и так далее.
Это позволит не ждать всех ответов, а вернуть результат как можно раньше.
Пример реализации:
async function bestBuyer(buyers) {
// Сортируем по убыванию цены
const sorted = buyers
.map((buyer, index) => ({ buyer, index }))
.sort((a, b) => b.buyer.price - a.buyer.price);
// Запускаем все промисы параллельно
const acceptPromises = sorted.map(({ buyer }) => buyer.accepts());
for (let i = 0; i < sorted.length; i++) {
const accepted = await acceptPromises[i];
if (accepted) {
// Возвращаем индекс покупателя с самой высокой ценой, который согласился
return sorted[i].index;
}
}
// Если никто не согласился
return -1;
}
Таким образом, мы не ждём ответы покупателей с меньшей ценой, если уже получили согласие от более дорогого покупателя. Это ускоряет получение результата.