
Комментарии 10
В хабе Визуализация данных, да еще про графики с time-series - скринкасты были бы к месту.
На худой конец - скриншоты того, что получилось.

Еще пращуры живущие на деревьях использовали для прореживания алгоритм swinging doors - пики не пропадут
https://habr.com/ru/articles/105652
Для хранения последовательностей в виде дельт для экономии памяти модно использовать алгоритмы VLQ или GVE c приращением
Это сжатие с потерями, не надо путать.
Но автор додумался до MinMax тоже с потерями но хуже
Нет у него потерь, все отсчёты хранятся на дне LOD, в отличии от SwingingDoor где отсчёты с отклонениями ниже порога теряются.
А если сделать порог нулевым то начнутся те же проблемы что у ТС.
Еще пращуры живущие на деревьях
Но автор додумался
Откуда это внезапное высокомерие по отношению к незнакомому человеку?
тоже с потерями но хуже
Почему вы решили, что в задаче автора предложенный вами алгоритм покажет себя лучше? Напомню, в статье речь не про прореживание данных ради экономии места, а про визуализацию временного ряда в реалтайме с масштабированием.
Нет высокомерия. Показалось.
Каковы критерии "лучше"?
Я заговорил о более простом алгоритме. Не расписал его детально. Без "бинарных деревьев" и "агрегатов". Для показа графика не нужно больше точек, чем пикселей по горизонтальной оси на экране (при гладком графике меньше). Отрисовать отрезки графика намного дольше чем сделать предобработку. То есть предобработку нужно сделать до отрисовки. Не нужно гнать в графику "300 тыс" точек. Есть тут потери или нет - для качественной отрисовки swinging door достаточно. для отрисовки на полный экран - достаточно 1-2 тыс с запасом, для мини графиков как в видео - нескольких сотен. я бы хранил его структуру как буфер для быстрого построения графика. Для построения выборки по времени - можно вырезать из него часть для передачи. Если точек слишком много - можно построить следующую итерацию огрубив. Если нужно взять большую детализацию маленького промежутка времени - можно взять сырые данные из чанков, их тогда понадобится максимум штук 10 на полный экран. если эконония памяти не интересует (хотя это большой бонус) то swinging door дает уменьшение количества обрабатываемых точек без потери наглядности графика.
По большей части в итоговой реализации так и работает: если на графике < n точек, рисуем сырые данные, если область расширили, то подбираем подходящий агрегат. Вся предобработка в агрегаты здесь происходит прямо во время приема данных от датчика. По сути просто несколько доп условий на измерение(помимо расчет реального значения из сырых данных датчика). В последствии никакая доп обработка не нужна, просто выбрать render level и область видимости
Благодарю за материалы, по диагонали пробежался, на досуге почитаю подробнее.
Выше уже другие комментаторы отписали, но все же дополню своими мыслями: в данной задаче нет потребности сжимать данные, напротив - необходимо хранить все сырые точки.
MinMax используется исключительно для рендера, при большом количестве отрисовываемых точек. И так как при шастабировании график сжимается в линию, финальный алгоритм позволил достичь оптимальное соотношение производительности/информативности.
Возможно не самый лучший подход, но он позволил выполнить необходимую задачу
Путь к миллиону точек: как я переписывал плоттер три раза, прежде чем он перестал лагать