Структура даних для оновлень на інтервали та кількість запитів нулів


13

Я шукаю структуру даних, яка б підтримувала цілу таблицю розміром і дозволила наступні операції в часі .n O ( журнал n )tnO(logn)

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

Ви обіцяєте, що кожен виклик, який зменшується, може бути порівняний з попереднім викликом для збільшення з тими ж параметрами . Я маю на увазі додаток - алгоритм швидкої лінії для обчислення за часом області об'єднання n заданих прямолінійних прямокутників.O ( n log n )a,bO(nlogn)

Квадратне дерево має розмір , тому це не є рішенням. Дерева Fenwick або Interval мають правильний аромат, але я не бачу, як їх розширити, щоб підтримати вищеописані операції.Θ(n2)


Дерева Fenwick не використовуватимуть обіцянку, що "кожен виклик, який зменшується, може бути прирівняний до попереднього виклику для збільшення з тими ж параметрами a, b", тому може бути більш просте рішення, використовуючи цю обіцянку (але вона покидає мене поки що).
Джеремі

Оскільки кількість введених даних може бути не більше (ви можете виявити повтори та не вставити в структуру даних), ми все одно отримаємо продуктивність використовуючи загальну структуру даних дерева дерева вимірювань. Дивіться cosy.sbg.ac.at/~ksafdar/data/courses/SeminarADS/… слайд 47-52. O ( журнал n )n2O(logn)
Чао Сю

Єремі та Чао Сю. Дякуємо за ваші коментарі. Зараз я розумію, як інтервальне дерево можна використовувати для підтримки загальної довжини об'єднання мінливого набору інтервалів. Це насправді дуже мила структура даних.
Крістоф Дюрр

Для загальної проблеми структури даних для пошуку в час потрібен простір де - розмір списку активні пари координат. Але дійсно для алгоритму швидкої лінії тому простір залишається лінійним. Проблема все ще відкрита для структури даних з кращим простором, ніж , коли . O ( p ) O ( n 2 ) p p O ( n ) O ( p ) p ω ( n )log(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 ][1,n][a,b]O(logn)[x,y]

  • Кількість інтервалів , збільшених і не зменшених, таким чином, що є одним з діапазонів, на який розділяється[ a , b ]c(x,y)[a,b][x,y][a,b]
  • Кількість комірок, які не охоплені розділеними підмножинами інтервалів, що знаходяться при або нижче в ході рекурсіїu(x,y)[x,y]

Тоді, якщо рекурсивно розбивається на і маємо тому ми можемо оновлювати кожне значення у постійний час, коли інші дані для діапазон змінюється. На кожен запит підтримки можна відповісти, поглянувши на .[x,y][x,z][z+1,w]

u(x,y)={0if c(x,y)>0u(x,z)+u(z+1,y)otherwise
u(x,y)u(1,n)

Щоб виконати операцію збільшення , розділ на діапазони , приріст для кожного з цих діапазонів, і використовуйте формулу вище для перерахунку для кожного з цих діапазонів і кожного їх предків. Операція зменшення збігається із зменшенням замість приросту.(a,b)[a,b]O(logn)c(x,y)u(x,y)


Я не думаю, що я розумію твою другу кулю. У піддереві з гниллю, позначеною , які комірки не охоплені розділеними підмножинами інтервалів на ? Чи не охоплюється весь діапазон , тому ? [x,y][x,y][x,y]u(x,y)=0
jbapple

Це залежить від того, які операції з збільшення ви зробили. Спочатку всі вони розкриваються, але коли ви збільшуєте невеликий інтервал у межах (або будь-який інтервал, який починається або закінчується в межах , або що включає у свій розділ), він зменшується. [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. Відповідно до формули у моїй відповіді, це призводить до того, що і [x, y] для цих трьох діапазонів також стає 0. u [1,2] стає 1, u [1,4] також стає 1, u [ 5,8] = 2, а u [1,8] = 1 + 2 = 3
Девід Еппштейн

0

Ви можете підтримати та в та в час. зменшення O ( increasedecreaseпідтримкаO(1)O(nlogn)supportO(1)Ключова ідея - розбити таблицю на групи розміром . Тоді кожна операція з модифікації ( або ) працює на максимум групах , і лише на ті, які знаходяться в кінці її діапазону ( і , у вашій формулюванні) взяти час.збільшеннязменшенняO(Θ(n)increasedecreaseabω(logn)O(n)abω(logn)


Чому б не взяти такий підхід до межі. Замість того, щоб згрупувати у відра , ми можемо натомість сформувати дерево, подібне до цього: 1 / \ 2 3 / \ / \ 4 5 6 7 З якого, оновляючи, ви приймаєте для всіх операцій. O(журналn)O(n)O(logn)
С. Пек
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.