Эффективный способ расчета заданий в день с интервалом времени

У меня проблема, которую я пытаюсь решить, но я чувствую, что не решаю ее самым эффективным способом. Любой новый свет на это оценивается.

Это промежуток времени, на который я хочу посмотреть

start = '2013-01-01';
end = '2013-01-08';

Список назначений с датами начала и окончания

assignments = [{start: '2013-01-01', end: '2013-01-01'},
 {start: '2013-01-01', end: '2013-01-02'},
 {start: '2013-01-01', end: '2013-01-03'},
 {start: '2013-01-01', end: '2013-01-04'}];

Я хочу получить результат, каждый день в промежутке времени со значением, представляющим, сколько назначений было активным в тот день. Это то, что я хочу, чтобы результат выглядел следующим образом:

result = [{date: '2013-01-01', value: 4},
 {date: '2013-01-02', value: 3},
 {date: '2013-01-03', value: 2},
 {date: '2013-01-04', value: 1},
 {date: '2013-01-05', value: 0},
 {date: '2013-01-06', value: 0},
 {date: '2013-01-07', value: 0},
 {date: '2013-01-08', value: 0}];

Мои попытки включают итерацию через каждую дату в daterange и проверку того, сколько заданий выпадает на этот день. Я также попытался пойти другим путем, итерации через назначения, а затем его даты начала и окончания, нажав значение в массив для каждой даты.

Есть ли один из этих способов на правильном пути или есть более разумный более эффективный способ?

Примечание. Я делаю это с помощью javascript с подчеркиванием и моментом js для дат.

1 ответ

итерации через назначения, а затем даты начала и окончания, нажатие значения в массив для каждой даты

Не уверен, если вы имеете в виду правильную вещь здесь. Вместо того, чтобы нажимать на массив, должен быть достаточным объект для сопоставления дат (как строковых ключей) с их соответствующим счетчиком (целое число). Фундаментальный аспект здесь заключается в том, что вы можете напрямую обращаться к подсчетам по дате (без циклов).

Есть ли один из этих способов на правильном пути или есть более эффективный способ?

Оба находятся на правильном пути. Какой из них более эффективен, зависит от ваших данных, в основном, насколько разреженные распределения распределены по диапазону дат (или, возможно, даже за пределами?).

Having
 a := number of assignments
 d := average duration of assignments (number of days per assignment)
 n := number of days in your range
then the runtimes would be
 O(a*d) for iterating assignments and their duration
 O(a*d+n) for that and building a result with all days
 O(a*n) for iterating days and checking all assignments

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

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

licensed under cc by-sa 3.0 with attribution.