Друзья, практический вопрос надо счиать скользящую медиану в последовательности по заданному

окну (длины N)
тупой вариант - взять значения в окне, отсортировать, взять элемент посередине

можно как-то ускорить? например взять какую-то структуру (какую?), чтобы добавить и удалять из нее элемент, сохраняя отсортированность, можно было за log(N)
и можно было получить этот самый средний элемент

17 ответов

54 просмотра

Прошитое дерево

Стас-Выщепан Автор вопроса

две разделённые хипы размером в половину окна?

Стас Выщепан
Как это будет работать?

если все элементы первой хипы <= всех элементов второй, то в корне лежит медиана

Это "классика", нет? https://ru.wikipedia.org/wiki/Алгоритм_выбора

Yaroslav Schekin
Это "классика", нет? https://ru.wikipedia.org/wiki...

Нет, quick select это O(w), получится O(n*w). Традиционный способ — балансировать два мультисета, или два хипа (нестандартных, с быстрой заменой). tc = O(n log w), sc = O(w)

Yuriy
Нет, quick select это O(w), получится O(n*w). Трад...

Нужны хешмапы видимо, чтобы находить элемент внутри хипа

На литкоде есть. https://leetcode.com/problems/sliding-window-median/

Стас Выщепан
это прекрасно

И собственно там можно посмотреть разные решения. Целевая сложность - O(nlogk) время, O(k) - память, если не считать память на ответ.

Evgenii Zheltonozhskii🇮🇱
а зачем два, еще раз?

Два ~одинакового размера, в одном все значения меньше второго.

Yuriy
Нет, quick select это O(w), получится O(n*w). Трад...

При чём тут конкретно quickselect? ;) Я имел в виду, что сама проблема (и её вариации) "классическая" (и алгоритмы давно известны), и дал ссылку на её название. Даже в английской версии той же статьи есть: "For a collection of data values undergoing dynamic insertions and deletions, the order statistic tree augments a self-balancing binary search tree structure with a constant amount of additional information per tree node, allowing insertions, deletions, and selection queries that ask for the k-th element in the current set to all be performed in O(log n) time per operation.[2] Going beyond the comparison model of computation, faster times per operation are possible for values that are small integers, on which binary arithmetic operations are allowed.[32] It is not possible for a streaming algorithm with memory sublinear in both n and k to solve selection queries exactly for dynamic data..."

Один раз посчитать медиану окна, а дальше просто пересчитывать под изменения ? Окна ведь перекрывающиеся ? Если так, то после одной сортировки в N каждая следующая будет зависеть от дельты окна. Вопрос структуры имеет смысл только, если вы это делаете постоянно или если размер окна очень велик. Если же это так, то есть алгоритм быстрой медианы за линейку https://habr.com/ru/articles/346930/

Похожие вопросы

Обсуждают сегодня

Всем привет Есть достаточно базовая задача: Дан неориентированный граф. Требуется определить, есть ли в нем цикл, и, если есть, вывести его. Входные данные подаются в виде ма...
Αλeksandr
10
Привет всем. Подскажите, как можно данную задачу более менее эффективно решить? В столовой одного известного Завода вот-вот начнётся обед. На обеде есть три гарнира — макарош...
Vitaliy
6
всем привет. У меня есть неупорядоченный массив точек(в моем случае в трёхмерном пространстве). Есть критерий связанности точек: если евклидово расстояние между ними меньше за...
Павлик Ливаткин
31
Доброе утро. Такой вопрос: есть ли какие-то практически полезные меры вычислительной мощности (в смысле computational complexity) для реальных машин, с ограниченными ресурсам...
Yaroslav Schekin
15
Всем привет Пытаюсь решить следующую задачу: https://informatics.msk.ru/mod/statements/view.php?id=6992&chapterid=101#1 Строка S была записана много раз подряд, после чего из ...
Αλeksandr
10
Здравствуйте. Есть задача нужно найти наименшое число P где фактриал P делиться на 10^N. Ограничения 10^9. Знаю что нужно найти такой P в конце как минимум N нулей. Решение с ...
. Azmiddin
20
Должна-ли работать такая стратегия: Мы каждую секунду бросаем монетку - орел или решка. Если орел - покупаем акцию на все деньги, если у нас есть деньги, или продаем все акци...
George Polevoy
13
#pragma once #include <iostream> #include <vector> template <typename T, typename Comp = std::less<T>> class Heap { public: Heap() = default; Heap(const std::vector<T>&...
Степан
1
Как можно сжимать временные ряды в памяти? У меня есть исторические стоимости ценных бумаг. Данные для каждой минуты в истории OHLC (Open, High, Low, Close). Соответственно, O...
George Polevoy
10
Всем привет Есть задача про интервалы - https://ejudge.lksh.ru/archive/2014/12/Ccpp/day01/01.pdf?ysclid=lhaombs4s4535475456 Думал как решить задачу быстрее, чем за квадрат, но...
Αλeksandr
18
Карта сайта