Я ищу структуру данных, которая бы поддерживала целочисленную таблицу размера и позволяла бы выполнять следующие операции за время .
- , которое увеличивает .
- , которое уменьшает .
- , который возвращает количество индексов таких что .
У вас есть обещание, что каждый призыв к уменьшению может быть сопоставлен с предыдущим вызовом увеличения с теми же параметрами . Приложение, которое я имею в виду, представляет собой алгоритм развертки для вычисления во времени области объединения n заданных прямолинейных прямоугольников.
Четырехъядерное дерево будет иметь размер , поэтому оно не является решением. Деревья Фенвика или Интервала имеют правильный вкус, но я не вижу, как их расширить, чтобы поддержать описанные выше операции.
ds.data-structures
cg.comp-geom
Кристоф Дюрр
источник
источник
Ответы:
Используйте дерево сегментов - рекурсивное разбиение диапазона на меньшие диапазоны. Каждый интервал [ a , b ] ваших операций обновления может быть разбит на O ( log n ) диапазонов в этом рекурсивном разделе. Для каждого диапазона [ x , y ] store:[ 1 , n ] [ а , б ] O ( журналн ) [ х , у]
Тогда, если рекурсивно разбито на [ x , z ] и [ z + 1 , w ], мы имеем u ( x , y ) = { 0, если c ( x , y ) > 0 u ( x , z ) + u ( z + 1 , y ) в противном случае[ х , у] [ Х , г] [ z+ 1 , ш ]
Чтобы выполнить операцию увеличения , разбейте [ a , b ] на диапазоны O ( log n ) , увеличьте c ( x , y ) для каждого из этих диапазонов и используйте приведенную выше формулу для пересчета u ( x , y) ) для каждого из этих диапазонов и каждого из их предков. Операция уменьшения аналогична уменьшению вместо увеличения.( а , б ) [ а , б ] O ( журналн ) с ( х , у) и ( х , у)
источник
источник