2013-07-23 10 views

risposta

10

Il problema con k-d-trees è che sono non progettato per gli aggiornamenti.

Mentre è possibile inserire oggetti con facilità (se si utilizza una rappresentazione basata su puntatore, che richiede molta più memoria di un albero basato su array) e si eliminano con trucchi come i messaggi tombstone, eseguendo tali modifiche sarà degenerare prestazioni dell'albero.

Non sono a conoscenza di un buon metodo per riequilibrare in modo incrementale un albero K-D. Per gli alberi 1-dimensionale hai alberi rosso-neri, alberi B, alberi B *, alberi B + e cose simili. Questi ovviamente non funzionano con gli alberi k-d a causa degli assi rotanti e quindi della diversa classificazione. Quindi, alla fine, con una k-d-tree, potrebbe essere meglio raccogliere solo le modifiche e di tanto in tanto fare una ricostruzione completa dell'albero . Quindi almeno questa parte dell'albero sarà abbastanza buona.

Tuttavia, esiste una struttura simile (che nei miei esperimenti sovrasta spesso il k-d-tree!): L'R * -tree. Invece di eseguire divisioni binarie, usa rettangoli di selezione per raccogliere oggetti, e si è pensato molto a rendere l'albero una struttura dati dinamica. Questo è anche il punto in cui il R * -tree si comporta molto meglio dell'albero R: ha una divisione molto più intelligente per la ricerca in kNN, ed esegue un riequilibrio incrementale per migliorare la sua struttura.

+2

Qualsiasi implementazione di R * -tree in Python/Scipy? – heltonbiker

+0

Un quad-tree è migliore nell'aggiornamento? – user1767754

+1

Python R * -tree: http://toblerity.org/rtree/ – James