quali sono i vantaggi degli ocre nelle prestazioni spaziali / temporali o altro, e in quali situazioni sono più applicabili (ho sentito la programmazione grafica 3D)?
Gli alberi kD sono alberi binari bilanciati e ocre sono tentativi, quindi i vantaggi e gli svantaggi sono probabilmente ereditati da quelle strutture di dati più generali. In particolare:
- Il riequilibrio può essere costoso (gli octrei non necessitano di ribilanciamento).
- Il bilanciamento gestisce meglio l'eterogeneità perché è adattivo.
- Un fattore di ramificazione più elevato in ocre significa alberi meno profondi (meno indirette e allocazioni) per distribuzioni omogenee.
Inoltre, la bisection (come in octrees) si presta a una banale implementazione in termini di bit-twiddling. Allo stesso modo, immagino che gli octrees possano trarre grandi benefici dalle distanze pre-calcolate quando si effettuano ricerche di distanza.
MODIFICARE
Apparentemente i miei riferimenti a tentativi e omogeneità necessitano di chiarimenti.
I tentativi sono una famiglia di strutture di dati rappresentate da alberi di dizionari e vengono utilizzati come dizionari per chiavi che sono sequenze (in particolare stringhe ma anche sequenze di DNA e bit in un valore di hash per i tentativi di hash). Se ciascun dizionario mappa un bit di ciascuna delle coordinate x, ye z (bit più significativo nel primo livello del trie, successivo bit significativo nel secondo livello ecc.), Allora il trie è un ottetto che suddivide uniformemente lo spazio 3D. Quindi gli ocre ereditano le caratteristiche dei tentativi che sono, in generale:
- Un alto fattore di ramificazione può significare alberi poco profondi che comportano poche direttezze quindi la ricerca è veloce, ad esempio 20 livelli di albero binario possono essere memorizzati in 4 livelli di un albero con un fattore di ramificazione di 256.
- I tentativi non vengono riequilibrati durante gli inserimenti e le eliminazioni, risparmiando un'operazione costosa richiesta per alberi binari bilanciati.
Lo svantaggio è che l'eterogeneità può comportare tentativi / octe squilibrati, quindi le ricerche possono richiedere molte indicazioni indirette. Il problema equivalente nei tentativi è risolto utilizzando la compressione dei bordi per comprimere più livelli di indiretta in un unico livello. Octrees non lo fa, ma non c'è nulla che ti impedisca di comprimere un octree (ma non credo che potresti chiamare il risultato un octree!).
Per un confronto, prendere in considerazione un dizionario specializzato per le chiavi di stringa che viene rappresentato come un trie. Il primo livello del trie si ramifica sul primo carattere della chiave. Il secondo livello sul secondo personaggio e così via. È possibile cercare qualsiasi stringa cercando il primo carattere dalla chiave nel dizionario per ottenere un secondo dizionario utilizzato per cercare il secondo carattere dalla chiave e così via. Un insieme di stringhe di chiavi casuali sarebbe una distribuzione omogenea . Un insieme di stringhe chiave che condividono tutti un prefisso (ad esempio tutte le parole che iniziano con "anti") sono eterogeneidistribuzione. In quest'ultimo caso, il primo dizionario contiene solo un binding, per "a", il secondo solo per "n" e così via. Cercare qualsiasi mappatura nel trie sempre cercando gli stessi quattro dizionari con gli stessi quattro tasti. Questo è inefficiente ed è ciò che fanno gli ocre se, ad esempio, vengono utilizzati per immagazzinare distribuzioni di particelle eterogenee in cui la stragrande maggioranza delle particelle si trova in un piccolo volume all'interno dello spazio vettoriale.