Минимальная скорость прокатки и максимальная скорость прокатки для повышения С++?

У меня есть код, в котором используется аккумулятор Boost для отслеживания среднего значения в подвижном окне - "среднее значение". В дополнение к среднему скользящему средству я хотел бы отслеживать минимальное и максимальное значение в этом же переходящем окне.

Есть ли способ вычислить минимальный ход и максимальный ход с помощью аккумулятора Boost? Я не вижу пути...

Я попытался добавить теги min и max к аккумулятору, используемому для roll_mean, но это не дает мне того, что я хочу.

typedef accumulator_set<uint32_t, stats<tag::rolling_mean> > rollingMeanAcc_t;

становится

typedef accumulator_set<uint32_t, stats<tag::rolling_mean,tag::min,tag::max> > rollingMeanAcc_t;

Однако приведенные здесь значения min и max вычисляются по всему аккумулятору, а не ограничены одним и тем же окном качения, как среднее.

Документация Boost говорит, что min и max вычисляются по всем образцам, не ограничиваясь катящимся окном. Похоже, что они не обеспечивают способ ограничения или веса образцов.

Я хотел бы иметь возможность сообщать среднее/минимальное/максимальное значение в развернутом окне.

В настоящее время я использую Boost версии 1.48.0. Я просмотрел документацию для последней версии (1.54.0) и не вижу, чтобы там был выполнен каток min/max.

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

+5
09 авг. '13 в 18:10
источник поделиться
2 ответа

Я не думаю, что аккумулятор может делать качки мин/макс.

Проблема довольно проста: накопитель в значительной степени по определению использует только O (1) данные - он не хранит обрабатываемые данные. Он может поддерживать мин или макс с данными O (1), поскольку он просто меняет ток min/max, когда число выходит за пределы диапазона min/max.

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

Теперь рассмотрим, что произойдет с минимумом, если (например) сортировка ввода. Каждый раз, когда элемент удаляется из окна, мы получаем другое минимальное значение. Другими словами, аккумулятору необходимо будет хранить все данные в окне, чтобы поддерживать текущий минимум должным образом. Аналогично, для максимума с сортировкой в ​​порядке убывания.

Короче говоря, вы не можете использовать для этого аккумулятор. Вам нужно сохранить все данные в окне.

+6
09 авг. '13 в 18:23
источник

Может быть, более умный алгоритм (на самом деле, вероятно, есть), но с моей головы я просто бы сохранил окно в круговом буфере и вычислил минимальный/макс по требованию. Загрузите результат и установите грязный флаг, когда окно изменится. Это дает операцию накопления O (1) и операцию извлечения O (1) с наихудшим случаем O (K), где K - размер окна.

0
22 авг. '13 в 0:09
источник

Посмотрите другие вопросы по меткам или Задайте вопрос