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


13

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

  • 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(nlog⁡n) области объединения 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)pp∈O(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
— Дэвид Эппштейн

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.