Quali sono le differenze tra alberi di segmenti, alberi di intervallo, alberi binari indicizzati e alberi di intervallo?


200

Quali sono le differenze tra alberi di segmenti, alberi di intervallo, alberi binari indicizzati e alberi di intervallo in termini di:

  • Idea / definizione chiave
  • applicazioni
  • Prestazioni / ordine in dimensioni superiori / consumo di spazio

Per favore, non solo dare delle definizioni.


12
Non è un duplicato, quella domanda è se gli alberi di fenwick sono generalizzazione degli alberi a intervalli e la mia domanda è più specifica e diversa.
Aditya,

7
Non è stata data risposta a stackoverflow.com/questions/2795989/… , la risposta lì fornisce solo una definizione.
Aditya,

12
Come è troppo ampio? "Quali sono alcune differenze tra xey?" è chiaro e concentrato come si arriva. Questa è un'ottima domanda
IVlad

16
E non c'è una buona risposta per questo disponibile ovunque. Una buona risposta sarà ottima per la comunità
Aditya,

22
La maggior parte di queste strutture di dati (eccetto gli alberi di Fenwick) sono riviste in questo pdf: "Alberi di ricerca per intervallo, segmento, intervallo e priorità" (di DT Lee). Oppure puoi leggerlo come capitolo di questo libro: "Manuale di strutture dati e applicazioni" .
Evgeny Kluev il

Risposte:


319

Tutte queste strutture di dati vengono utilizzate per risolvere diversi problemi:

  • La struttura ad albero dei segmenti memorizza gli intervalli e ottimizzata per " quale di questi intervalli contiene un determinato punto ".
  • La struttura ad albero degli intervalli memorizza anche gli intervalli, ma ottimizzata per " quali di questi intervalli si sovrappongono a un determinato intervallo ". Può essere utilizzato anche per query di punti, simile all'albero dei segmenti.
  • La struttura ad albero dei punti memorizza i punti e ottimizzata per le query " quali punti rientrano in un determinato intervallo ".
  • L'albero indicizzato binario memorizza il conteggio degli articoli per indice e ottimizzato per " quanti elementi ci sono tra l'indice m e le query".

Prestazioni / consumo di spazio per una dimensione:

  • Albero dei segmenti : tempo di preelaborazione O (n logn), tempo di query O (k + logn), spazio O (n logn)
  • Albero degli intervalli : tempo di preelaborazione O (n logn), tempo di query O (k + logn), spazio O (n)
  • Albero di intervallo : tempo di preelaborazione O (n logn), tempo di query O (k + logn), spazio O (n)
  • Albero indicizzato binario - Tempo di preelaborazione O (n logn), Tempo di query O (logn), Spazio O (n)

(k è il numero di risultati riportati).

Tutte le strutture di dati possono essere dinamiche, nel senso che lo scenario di utilizzo include sia modifiche ai dati che query:

  • Albero dei segmenti - l'intervallo può essere aggiunto / eliminato in O (logn) tempo (vedi qui )
  • Albero degli intervalli - l'intervallo può essere aggiunto / eliminato nel tempo O (logn)
  • Albero di intervallo : nuovi punti possono essere aggiunti / eliminati in O (logn) tempo (vedi qui )
  • Albero indicizzato binario : il conteggio degli articoli per indice può essere aumentato nel tempo O (logn)

Dimensioni superiori (d> 1):

  • Albero del segmento - O (n (logn) ^ d) tempo di preelaborazione, O (k + (logn) ^ d) tempo di interrogazione, O (n (logn) ^ (d-1)) spazio
  • Albero intervallo - O tempo di preelaborazione O (n logn), tempo di query O (k + (logn) ^ d), spazio O (n logn)
  • Albero di intervallo - O (n (logn) ^ d) tempo di preelaborazione, O (k + (logn) ^ d) tempo di interrogazione, O (n (logn) ^ (d-1))) spazio
  • Albero indicizzato binario - O (n (logn) ^ d) tempo di preelaborazione, O ((logn) ^ d) tempo di interrogazione, O (n (logn) ^ d) spazio

12
Ho davvero l'impressione che segmenti alberi <intervalli alberi da questo. C'è qualche motivo per preferire un albero a segmenti? Ad esempio semplicità di implementazione?
j_random_hacker,

7
@j_random_hacker: gli algoritmi basati su alberi a segmenti presentano vantaggi in alcune varianti ad alta dimensione più complesse della query degli intervalli. Ad esempio, trovare quali segmenti di linea non paralleli all'asse si intersecano con una finestra 2D.
Lior Kogan,

5
Grazie, sarei interessato a qualsiasi elaborazione tu possa dare su questo.
j_random_hacker,

3
@j_random_hacker, gli alberi dei segmenti hanno un altro uso interessante: RMQ (intervalli minimi query) nel tempo O (log N) dove N è la dimensione dell'intervallo complessivo.
ars-longa-vita-brevis,

1
Perché gli alberi dei segmenti O (n log n) sono spazi? Memorizzano N foglie + N / 2 + N / 4 + ... + N / 2 ^ (log N), e questa somma è O (N) se non sbaglio. Anche la risposta @ icc97 riporta anche lo spazio O (N).
Formica

24

Non che io possa aggiungere qualcosa alla risposta di Lior , ma sembra che potrebbe fare con un buon tavolo.

Una dimensione

k è il numero di risultati riportati

|              | Segment       | Interval   | Range          | Indexed   |
|--------------|--------------:|-----------:|---------------:|----------:|
|Preprocessing |        n logn |     n logn |         n logn |    n logn |
|Query         |        k+logn |     k+logn |         k+logn |      logn |
|Space         |        n logn |          n |              n |         n |
|              |               |            |                |           |
|Insert/Delete |          logn |       logn |           logn |      logn |

Dimensioni superiori

d > 1

|              | Segment       | Interval   | Range          | Indexed   |
|--------------|--------------:|-----------:|---------------:|----------:|
|Preprocessing |     n(logn)^d |     n logn |      n(logn)^d | n(logn)^d |
|Query         |    k+(logn)^d | k+(logn)^d |     k+(logn)^d |  (logn)^d |
|Space         | n(logn)^(d-1) |     n logn | n(logn)^(d-1)) | n(logn)^d |

Queste tabelle sono create nel Markdown formattato di Github - vedi questo Gist se vuoi che le tabelle siano formattate correttamente.


2
Cosa intendi per risultati riportati?
Pratik Singhal,

@ ps06756 gli algoritmi di ricerca hanno spesso un runtime di log (n) dove n è l'inputize ma può produrre risultati che sono lineari in n che non possono essere fatti in tempo logaritmico (non è possibile produrre n numeri in log (n) time) .
oerpli,

1
Il Segment Tree non dovrebbe avere O(n logn) spacenella prima tabella?
Danny_ds,
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.