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


13

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

  • 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(nlog⁡n)

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


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

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

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

Для загальної проблеми структури даних для пошуку в час потрібен простір де - розмір списку активні пари координат. Але дійсно для алгоритму швидкої лінії тому простір залишається лінійним. Проблема все ще відкрита для структури даних з кращим простором, ніж , коли . O ( p ) ⊂ O ( n 2 ) p p ∈ O ( n ) O ( p ) p ∈ ω ( n )log⁡(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 ][1,n][a,b]O(log⁡n)[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(log⁡n)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(nlog⁡n)supportO(1)Ключова ідея - розбити таблицю на групи розміром . Тоді кожна операція з модифікації ( або ) працює на максимум групах , і лише на ті, які знаходяться в кінці її діапазону ( і , у вашій формулюванні) взяти час.збільшеннязменшенняO( √Θ(n)increasedecreaseabω(logn)O(n)abω(log⁡n)


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