алгоритм для вычисления активности во временных интервалах с учетом временных меток

#algorithm #timestamp #time-series

#алгоритм #временная метка #временные ряды

Вопрос:

Учитывая серию временных меток операций сетевого ввода-вывода, какой наилучший алгоритм для вычисления активности для всех временных интервалов за день?

Например, выберите размер интервала = 30 секунд, затем 1 день = 24*60*60/30 =2880 слотов. Для одного временного интервала пометьте его как активный или неактивный на основе заданных данных временных рядов (активный, если в этом интервале есть активность, неактивный в противном случае). Затем вычислите коэффициент активности = (# активных слотов) / (# всего слотов).

Предложения?

Ответ №1:

Я не уверен, что вы подразумеваете под «лучшим» в этом контексте, но потерпите меня.

Итак, нам нужна функция, которая будет принимать количество временных интервалов в 24-часовом дне и временную метку и возвращать временной интервал, к которому принадлежит временная метка. Что-то вроде:

 int GetSlot(int numberOfSlots, int secondsSinceMidnight)
{
    int secondsInSlot = 24 * 60 * 60 / numberOfSlots;
    return secondsSinceMidnight / secondsInSlot;
}
  

Теперь создайте пустую структуру данных карты от временных интервалов до количества временных меток. Начните перебирать набор временных меток. Для каждой временной метки вызовите GetSlot ; вызовите его слот assignedSlot . Мы проверяем структуру данных карты, чтобы увидеть, содержит ли она запись для assignedSlot . Если это так, мы увеличиваем отображенный счетчик на единицу. В противном случае мы добавляем новую запись для assignedSlot и устанавливаем количество временных меток равным единице. Продолжить для всех временных меток.

В конце у нас есть одна запись в структуре данных карты для каждого активного слота. Мы знаем общее количество слотов, поэтому получить среднее количество активных слотов легко: map.size() / numberOfSlots . Мы запомнили больше информации, чем вам технически нужно, но все же.

Это O (n) времени и O (n) пространства.

Альтернативой может быть сортировка временных меток в порядке возрастания, а затем перебор их, подсчитывая активные временные интервалы по мере продвижения. Это может быть сделано O (n log n) времени и O (1) пространства.

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

Комментарии:

1. спасибо, что упомянули сортировку временных меток — определенно улучшение моего алгоритма map-reduce.