Структура данных для обновления интервалов и запроса количества нулей

13

Я ищу структуру данных, которая бы поддерживала целочисленную таблицу t размера и позволяла бы выполнять следующие операции за время .nO(logn)

  • increase(a,b) , которое увеличивает .t[a],t[a+1],,t[b]
  • decrease(a,b) , которое уменьшает t[a],t[a+1],,t[b] .
  • support() , который возвращает количество индексовi таких чтоt[i]0 .

У вас есть обещание, что каждый призыв к уменьшению может быть сопоставлен с предыдущим вызовом увеличения с теми же параметрами a,b . Приложение, которое я имею в виду, представляет собой алгоритм развертки для вычисления во времени O(nlogn) области объединения n заданных прямолинейных прямоугольников.

Четырехъядерное дерево будет иметь размер , поэтому оно не является решением. Деревья Фенвика или Интервала имеют правильный вкус, но я не вижу, как их расширить, чтобы поддержать описанные выше операции.Θ(n2)

Кристоф Дюрр
источник
Деревья Фенвика не будут использовать обещание, что «каждый призыв к уменьшению может быть сопоставлен с предыдущим вызовом для увеличения с теми же параметрами a, b», так что может быть более простое решение, использующее это обещание (но пока оно ускользает от меня).
Джереми
Поскольку количество вводимых вами данных не может превышать (вы можете обнаруживать повторы и не вставлять их в структуру данных), мы по-прежнему получаем производительность O ( log n ), используя общую структуру данных дерева мер. См. Cosy.sbg.ac.at/~ksafdar/data/courses/SeminarADS/… слайд 47-52. N2О(журналN)
Чао Сюй
Джереми и Чао Сюй. Спасибо за ваши комментарии. Теперь я понимаю, как можно использовать дерево интервалов для поддержания общей длины объединения изменяющегося набора интервалов. На самом деле это очень симпатичная структура данных.
Кристоф Дюрр
Для общей проблемы структуры данных поиск по времени требует пространства O ( p ) O ( n 2 ), где p - размер списка активных пар координат. Но действительно для алгоритма строчной линии p O ( n ), поэтому пространство остается линейным. Проблема все еще открыта для структуры данных с лучшим пространством, чем O ( p ) , когда plog(n2)O(log(n))O(p)O(n2)ppO(n)O(p) . pω(n)
Джереми
2
Вот хорошая ссылка, где вы можете протестировать свои реализации с другими решениями той же проблемы: spoj.com/OI/problems/NKMARS
Segal-Halevi

Ответы:

2

Используйте дерево сегментов - рекурсивное разбиение диапазона на меньшие диапазоны. Каждый интервал [ a , b ] ваших операций обновления может быть разбит на O ( log n ) диапазонов в этом рекурсивном разделе. Для каждого диапазона [ x , y ] store:[1,N][a,б]О(журналN)[Икс,Y]

  • Число интервалов [ a , b ] , которые были увеличены и не уменьшены, так что [ x , y ] является одним из диапазонов, на которые разбивается [ a , b ]с(Икс,Y)[a,б][Икс,Y][a,б]
  • Число ячеек, которые не покрыты разделенными подмножествами интервалов, которые в [ x , y ] или ниже в рекурсииU(Икс,Y)[Икс,Y]

Тогда, если рекурсивно разбито на [ x , z ] и [ z + 1 , w ], мы имеем u ( x , y ) = { 0, если  c ( x , y ) > 0 u ( x , z ) + u ( z + 1 , y ) в противном случае[Икс,Y][Икс,Z][Z+1,вес]

U(Икс,Y)знак равно{0если с(Икс,Y)>0U(Икс,Z)+U(Z+1,Y)в противном случае
поэтому мы можем обновлять каждое значение в постоянное время, когда изменяются другие данные для диапазона. На каждый запрос поддержки можно ответить, посмотрев на u ( 1 , n ) .U(Икс,Y)U(1,N)

Чтобы выполнить операцию увеличения , разбейте [ a , b ] на диапазоны O ( log n ) , увеличьте c ( x , y ) для каждого из этих диапазонов и используйте приведенную выше формулу для пересчета u ( x , y) ) для каждого из этих диапазонов и каждого из их предков. Операция уменьшения аналогична уменьшению вместо увеличения.(a,б)[a,б]О(журналN)с(Икс,Y)U(Икс,Y)

Дэвид Эппштейн
источник
[x,y][x,y][x,y]u(x,y)=0
[x,y][x,y][x,y]
Не могли бы вы привести пример?
Jbapple
Предположим, ваш интервал - числа [1,8]. Он рекурсивно делится на [1,4], [4,8], затем [1,2], [3,4], [5,6] и [7,8], а затем все одноэлементные диапазоны. Первоначально все раскрыто, все c [x, y] = 0, и у каждого диапазона есть u = его длина. Но затем предположим, что вы выполняете операцию увеличения [2,6]. Максимальные диапазоны O (log n), на которые можно разложить [2,6]: [2,2], [3,4] и [5,6], поэтому для этих трех мы устанавливаем c [x, y] колеблется до 1. Согласно формуле в моем ответе, это приводит к тому, что u [x, y] для этих трех диапазонов также становится равным 0. u [1,2] становится 1, u [1,4] также становится 1, u [ 5,8] = 2, а u [1,8] = 1 + 2 = 3
Дэвид Эппштейн