Набор раздвижных окон

Я ищу способ эффективно поддерживать набор значений из 1-минутного скользящего окна из заданного потока данных (~ 100 тыс. значений/сек).

Я ищу решение с не более чем логарифмическим временем вставки (поскольку базовый упорядоченный по времени вектор значений имеет o (n))


person discobot    schedule 13.05.2013    source источник
comment
Как вы будете получать доступ к элементам внутри окна? Двухсторонняя очередь допускает амортизированные добавления и удаления с постоянным временем из начала и конца (соответственно) набора, но только O (n) доступ к случайным элементам в середине.   -  person chepner    schedule 13.05.2013


Ответы (1)


Если я неправильно понимаю ваш вопрос, это можно сделать за постоянное время (постоянное за вставку) с круговым буфером. Выделите буфер с длиной в 2 раза больше, чем максимальное количество элементов в вашем окне. Например. max 100k значений в секунду 6 миллионов значений в минуту, поэтому выделите буфер длиной 8388608 байт. Сохраняйте абсолютный индекс в этом буфере, но вставляйте в него и удаляйте из него элементы, маскируя индекс с помощью 0x7FFFFF.

person Rafael Baptista    schedule 13.05.2013
comment
Если это скользящее окно, я считаю, что вам нужен только буфер размером, равным размеру окна, хотя это немного изменит ситуацию (требуется смещение, а не маска). - person Bernhard Barker; 13.05.2013
comment
Никто не будет удалять элементы через одну минуту, поэтому эта структура данных должна сама отслеживать возраст значений. - person discobot; 13.05.2013