Struttura dei dati per aggiornamenti su intervalli e interrogazione del numero di zeri


13

Sto cercando una struttura di dati che mantenga una tabella intera t di dimensione n e consenta le seguenti operazioni nel tempo O(logn) .

  • aumentare(un',B) , che aumentat[un'],t[un'+1],...,t[B] .
  • diminuire(un',B) , che diminuiscet[un'],t[un'+1],...,t[B] .
  • supporto() , che restituisce il numero di indiciio tale chet[i]0 .

Hai la promessa che ogni chiamata a diminuire può essere abbinata a una chiamata precedente per aumentare con gli stessi parametri . L'applicazione che ho in mente è un algoritmo sweepline per calcolare nel tempo O ( n log n ) l'area dell'unione di n determinati rettangoli rettilinei.a,bO(nlogn)

Un quad-albero avrebbe dimensioni , quindi non è una soluzione. Gli alberi Fenwick o Interval hanno il giusto sapore, ma non vedo come estenderli per supportare le operazioni sopra.Θ(n2)


Gli alberi di Fenwick non userebbero la promessa che "ogni chiamata per diminuire può essere abbinata a una chiamata precedente per aumentare con gli stessi parametri a, b", quindi potrebbe esserci una soluzione più semplice usando quella promessa (ma per ora mi sfugge).
Jeremy,

Poiché il numero di input che è possibile avere è al massimo (è possibile rilevare ripetizioni e non inserirle nella struttura dei dati), otteniamo comunque prestazioni O ( log n ) utilizzando la struttura dei dati dell'albero delle misure comune. Vedi cosy.sbg.ac.at/~ksafdar/data/courses/SeminarADS/… slide 47-52. n2O(logn)
Chao Xu,

Jérémie e Chao Xu. Grazie per i tuoi commenti Capisco ora come l'albero degli intervalli può essere utilizzato per mantenere la lunghezza totale dell'unione di un insieme variabile di intervalli. Questa è in effetti una struttura dati molto carina.
Christoph Dürr,

Per il problema generale della struttura dei dati, la ricerca nel richiede spazio O ( p ) O ( n 2 ) dove p è la dimensione dell'elenco di coppie attive di coordinate. Ma in effetti per l'algoritmo sweepline p O ( n ) quindi lo spazio rimane lineare. Il problema è ancora aperto per una struttura di dati con spazio migliore di O ( p ) , quando plog(n2)O(log(n))O(p)O(n2)ppO(n)O(p) . pω(n)
Jeremy,

2
Ecco un bel link dove puoi testare le tue implementazioni con altre soluzioni allo stesso problema: spoj.com/OI/problems/NKMARS
Erel Segal-Halevi

Risposte:


2

Usa un albero dei segmenti - una partizione ricorsiva dell'intervallo in intervalli più piccoli. Ogni intervallo [ a , b ] delle operazioni di aggiornamento può essere partizionato in O ( log n ) degli intervalli in questa partizione ricorsiva. Per ogni intervallo [ x , y ] memorizza:[1,n][a,b]O(logn)[x,y]

  • Il numero degli intervalli [ a , b ]c(x,y)[a,b] che sono stati aumentati e non diminuiti in modo tale che sia uno degli intervalli in cui [ a , b ] è partizionato[x,y][a,b]
  • Il numero di celle che non sono coperte da sottoinsiemi di intervalli partizionati che sono a [ x , y ] o inferiori nella ricorsioneu(x,y)[x,y]

Quindi se è suddiviso ricorsivamente in [ x , z ] e [ z + 1 , w ] abbiamo u ( x , y ) = { 0 se  c ( x , y ) > 0 u ( x , z ) + u ( z + 1 , y ) altrimenti[x,y][x,z][z+1,w]

u(x,y)={0if c(x,y)>0u(x,z)+u(z+1,y)otherwise
così possiamo aggiornare ogni valore in tempo costante quando cambiano gli altri dati per un intervallo. Ad ogni query di supporto è possibile rispondere guardando u ( 1 , n ) .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,

Dipende dall'aumento delle operazioni effettuate. Inizialmente vengono scoperti tutti, ma quando si aumenta un piccolo intervallo all'interno[X,y] (o qualsiasi intervallo che inizi o termini entro [X,y]o che include [X,y]nella sua partizione) diminuisce.
David Eppstein,

Potresti fare un esempio?
jbapple,

Supponiamo che il tuo intervallo sia i numeri [1,8]. È ricorsivamente diviso in [1,4], [4,8], quindi [1,2], [3,4], [5,6] e [7,8], quindi tutte le gamme di un elemento. Inizialmente, tutto è scoperto, tutto c [x, y] = 0 e ogni intervallo ha u = la sua lunghezza. Supponiamo quindi di eseguire un'operazione di aumento [2,6]. Gli intervalli massimi O (log n) in cui [2,6] può essere scomposto sono [2,2], [3,4] e [5,6], quindi impostiamo c [x, y] per quei tre varia a 1. Secondo la formula nella mia risposta, questo fa sì che [x, y] anche questi tre intervalli diventino 0. u [1,2] diventa 1, u [1,4] diventa anche 1, u [ 5,8] = 2 e u [1,8] = 1 + 2 = 3
David Eppstein

0

Puoi supportare aumentare e diminuire nel O(nlogn) e supporto nel O(1)tempo. L'idea chiave è quella di suddividere la tabella in gruppi di dimensioniΘ(n). Quindi ogni operazione di modifica (aumentare o diminuire) funziona al massimo O(n) gruppi e solo quelli vicini alla fine del suo intervallo (un' e B, nella tua formulazione) prendere ω(logn) tempo.


Perché non adottare questo approccio al limite. Invece di passare aO(n) secchi, possiamo invece formare un albero simile a questo: 1 / \ 2 3 / \ / \ 4 5 6 7 di cui, aggiornando, prendi O(logn)per tutte le operazioni.
S. Pek,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.