Arhn - архитектура программирования

Алгоритм планирования интервью

Я пытаюсь придумать алгоритм, который всегда дает оптимальное решение этой проблемы в кратчайшие сроки:

Есть n кандидатов на работу и k комнат, в которых у них запланированы собеседования в разное время дня. У интервью есть определенное расписание в каждой комнате, при этом у каждого интервью есть определенное время начала (si), время окончания (fi) и комната для интервью (rя). Все единицы времени всегда являются целыми числами. Кроме того, нам нужно запланировать фотографии с людьми, которые в настоящее время опрашиваются в течение дня. На самом деле фотографии не занимают много времени, но в какой-то момент дня каждый интервьюируемый должен быть на фотографии. Если мы запланируем снимок на время t, все люди, у которых в настоящее время берут интервью, будут на этом изображении. Фотосъемка не влияет на оставшееся время начала и окончания каждого интервью. Итак, проблема в следующем: с неупорядоченным списком интервью, каждое с переменными (si, fi, ri), как сделать вы следите за тем, чтобы каждый кандидат на собеседование был на фотографии, при этом делая как можно меньше фотографий?

Поэтому в идеале мы должны делать снимки, когда присутствует как можно больше людей, чтобы свести к минимуму количество сделанных снимков. Моя первоначальная идея для этого была своего рода грубой силой, но это была бы действительно плохая среда выполнения. Очень важно свести к минимуму время выполнения этого алгоритма, при этом возвращая как можно меньше фотографий. При этом, если вы можете придумать быстрый жадный алгоритм, который не решает проблему идеально, я бы тоже хотел это услышать.

Я уверен, что мое описание здесь было далеко не безупречным, поэтому, если вы хотите, чтобы я что-то прояснил, не стесняйтесь оставлять комментарии, и я свяжусь с вами.


  • Чтобы уточнить, когда вы делаете снимок, он включает всех собеседников во всех комнатах? Если да, влияет ли информация о помещении на готовое решение? 30.03.2015
  • @фари Да. Все интервьюируемые во всех комнатах на фото. Информация о комнате есть, потому что иногда в комнате кто-то есть, а иногда нет. В комнате не может находиться более 1 человека. Итак, если у нас есть 5 комнат, то интервью опрашивают не более 5 человек, но может быть и 0. Это отвечает на ваш вопрос? 30.03.2015

Ответы:


1

Начните со следующих наблюдений:

  1. Во время каждого интервью необходимо сделать хотя бы одну фотографию, поскольку мы не можем сфотографировать этого интервьюируемого до того, как он придет или после того, как он уйдет.
  2. Набор людей, доступных для фотографирования, меняется только в моменты времени si и fi.
  3. После события прибытия si, если следующее событие j является прибытием, нет необходимости делать снимок между si и sj >, так как все доступные в si по-прежнему доступны в sj.
  4. Таким образом, вы можете позволить набору доступных интервьюируемых «нарастить» через события прибытия (до k из них) и подождать, чтобы сделать снимок, пока кто-то не собирается уходить.

Таким образом, я думаю, что следующий алгоритм должен работать:

  1. Внесите время прибытия и отъезда в список и отсортируйте его (время должно оставаться с пометкой «приход» или «отъезд» и индексом интервьюируемого).
  2. Создайте логический массив A размера n, чтобы отслеживать, доступен ли каждый интервьюируемый (интервью идет).
  3. Создайте логический массив P размера n, чтобы отслеживать, был ли сфотографирован каждый интервьюируемый.
  4. Цикл по отсортированному списку времени (индексная переменная i):

    а. Если обнаружено прибытие, установите A[i] на true.

    б. Если обнаружен отъезд j, проверьте P[j], чтобы убедиться, что уходящий человек уже сфотографирован. Если нет, сделайте снимок сейчас и запишите его эффекты (для всех A[k] = true набора P[k] = true). Наконец, установите A[i] на false.

Сортировка — O(n log n), цикл имеет 2n итераций, а проверка массивов — O(1). Но поскольку для каждого события фотографирования вам может потребоваться перебрать A, общее время выполнения в худшем случае составит O(n2) (что произойдет, если интервью не перекрываются во времени).

30.03.2015
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..