Albero B rispetto a un albero R - Non è solo un gruppo di elenchi collegati collegati tra loro?


10

Ho abbastanza familiarità con un albero B, principalmente dovuto mantenere i database ben alimentati con elettricità, aria condizionata e spazio su disco rigido. Associo a un doppio elenco (doubl [ie, ey]?).

Oggi uno degli sviluppatori a pranzo ha menzionato un albero a R.

Ho saltato su Wikipedia e ho iniziato a leggere. Sembrava terribile come un albero B più alto. Sfortunatamente, non avere una profonda preparazione matematica rende difficile capire di cosa stanno parlando alcuni miei colleghi.

Speravo che qualcuno potesse chiarire alcune differenze tra un albero B e un albero R. Probabilmente finirò comunque per chiedere ai ragazzi, ma non vi è alcuna garanzia che risponderanno alla mia domanda. Molto probabilmente inizieranno a divagare su Dio sa cosa. . .


un BTree non è sicuramente come un doppio elenco collegato. Un albero consente l'accesso nelle operazioni di registro (n) anziché proporzionale a n, come negli elenchi.
Javier,

@Javier: i nodi foglia di un indice b-tree sono di solito un elenco doppiamente collegato per consentire un rapido recupero da parte dei fratelli di nodi indice.
Giordania,

1
Essendo una domanda puramente tecnica, questo appartiene a StackOverflow (per favore non ripubblicarlo lì, verrà automatizzato se un numero sufficiente di persone vota per chiuderlo qui).
Péter Török,

1
Questo è sul tema qui: Programmers.SE è per domande concettuali sulla programmazione. Stack Overflow è quando hai effettivamente il codice con cui hai bisogno di aiuto.

2
@Peter Torok: Sotto il vecchio sistema, questo DOVREBBE essere stata una domanda SO. Ma ora che questo sito esiste.
surfasb,

Risposte:


7

Un albero R può essere considerato una generalizzazione di un albero b. Laddove un albero b fornisce accesso O (registro n) su un "intervallo limitato" delle chiavi che contiene, un albero R fornisce accesso O (registro n) su una "regione dimensionale K" delle chiavi che contiene.

Se si desidera mappare i codici postali sui nomi delle contee, è possibile utilizzare un B-Tree, dal momento che si potrebbe chiedere "Quali sono tutte le contee con codici postali tra 60000 e 61000?" Tuttavia, un B-Tree non sarebbe adatto a mappare le coordinate GPS sui nomi delle contee per domande come "Quali sono tutte le contee entro 100 miglia da Chicago?", Dal momento che ordina le sue chiavi solo su una singola dimensione. Un albero a R rompe le sue chiavi in ​​base a riquadri di delimitazione sovrapposti, quindi è un modo naturale per memorizzare le chiavi quando è necessario eseguire query su più dimensioni.


Mi piace l'analogia.
surfasb,

1
Più di un esempio concreto che di un'analogia, è esattamente come vengono utilizzati questi algoritmi di indice.
SingleNegationElimination,

6

La maggior parte delle strutture ad albero può essere ridotta a una qualche forma di elenco collegato, purché si ignori il modo in cui viene costruito l'elenco (in particolare, come gli elementi vengono aggiunti e rimossi e come i nodi vengono ribilanciati, se applicabile). È essenzialmente l'algoritmo di inserimento / cancellazione / recupero che distingue una struttura di dati da un'altra.

I nodi in un albero a R generalmente contengono un riquadro di delimitazione, che consente di indicizzare in modo efficiente posizioni, poiché potrebbe essere necessario se si desidera cercare record "vicino" a una posizione particolare. Gli elementi in un albero a B hanno un ordinamento più semplice; puoi confrontare direttamente se qualcosa è maggiore o uguale a un altro elemento. In un albero a R, lo scopo di ciascuna voce è determinare quali elementi sono contenuti in un rettangolo di selezione.

Un B-Tree ti consente di cercare in modo efficiente elementi ordinabili nella memoria secondaria (come un disco rigido) e un R-Tree ti permette di cercare in modo efficiente elementi che sono "in" o "vicino" a un particolare punto o riquadro di delimitazione, anche nella memoria secondaria.


Sembra che l'albero R inizi a mostrare la sua distinzione man mano che aumenta il numero di elementi, giusto? O è un po 'troppo semplificato?
surfasb,

Penso che dato un numero simile di nodi, non vedresti una particolare differenza nell'uso dello spazio se non per il costo lineare dei dati del riquadro di delimitazione su nodi non foglia. Ma semplicemente non puoi rappresentare i riquadri di delimitazione in modo efficiente nella definizione convenzionale di un B-Tree, quindi, utilizzeresti sicuramente molto più spazio se provassi a rappresentare le informazioni spaziali in un B-Tree. L'albero a R è per le relazioni spaziali, l'albero a B supporta solo l'ordinamento a dimensione singola.
JasonTrue,

2
@JasonTrue: In realtà, ci sono modi efficaci per linearizzare i riquadri di delimitazione per l'indicizzazione B-Tree: en.wikipedia.org/wiki/Geohash . Sebbene gli hash siano "efficienti", non sono particolarmente convenienti. È probabile che una query con riquadro di delimitazione arbitrario richieda 9 query separate per uno spazio bidimensionale e se la casella si sovrappone a un asse maggiore (ad esempio, The International Dateline), il numero di query può raddoppiare o quadruplicare e diventa molto complicato da usare. Nonostante ciò, è ancora un'opzione quando gli indici lineari sono l'unico tipo disponibile.
SingleNegationElimination,
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.