Desidero ordinare molte posizioni (waypoint) sulla loro distanza dalla posizione corrente. La posizione corrente è, ovviamente, un bersaglio mobile, quindi per ogni aggiornamento di posizione, è necessario ricalcolare la distanza per ogni posizione. Ma solo ricalcolare per le posizioni vicine sarebbe sufficiente.Qual è il modo più veloce per ordinare molte località sulla distanza?
Attualmente utilizzo i dati di base e memorizzo la distanza della posizione corrente come attributo nella tabella (ma solo l'aggiornamento è quando viene modificato) all'interno del configurecell: atindexpath: method. Questo tipo di funziona, ma l'applicazione non risponde mentre i dati del core aggiornano automaticamente tutte le distanze. Questo funziona per 250 posizioni, ma per 5000 si blocca. Ho bisogno che funzioni per 10.000 località, anche se probabilmente ho solo bisogno delle 1000 località più vicine o giù di lì.
Idee che non ho ancora provato: Memorizza tutte le distanze in un array separato in memoria con nient'altro che ID e distanza di registrazione. Quindi ordina la matrice sulla distanza. Il problema è che quindi non posso usare FetchedResultsController perché non esiste un campo di ordinamento nel database.
Filtra le posizioni in base alla latitudine e alla longitudine utilizzando un predicato. Quindi presentare solo le posizioni filtrate.
Eseguire il ricalcolo delle distanze in una filettatura separata.
Nessuna idea sembra abbastanza semplice da provare.
Chiunque abbia suggerimenti, idee diverse, una variazione delle mie idee?
Per questo ho bisogno di una "posizione Center". quindi posso trattare tutte le posizioni come punti su una superficie piana. Penso che sia adatto per "preordinare" tutte le posizioni, in modo che le posizioni vicine siano preordinate nelle vicinanze. E tutte le mie posizioni sarebbero in Europa per ora. Potrebbe essere parte della soluzione. – Bjinse
Hilbert Curve è sicuramente il "modo" per farlo, ma se la mia comprensione dello spazio che riempie le curve è corretta, qualsiasi curva di riempimento dello spazio andrà bene (Peano viene in mente. Scegli uno che preservi bene la località). Un'altra cosa da considerare è la memorizzazione delle posizioni in un kd-tree adattivo per escludere rapidamente posizioni troppo distanti. –
Per le dimensioni ridotte, kd-tree è migliore della curva di riempimento dello spazio. Per le alte dimensioni, va bene solo se N> = 2^D (N = numero di punti, D = dimensioni). La ragione è che se dividi una dimensione diversa per ogni livello nell'albero kd, se hai un numero insufficiente di punti, avrai un punto singolo in ogni foglia prima di dividerli in ogni dimensione. Ciò significa che la struttura ad albero ignora le dimensioni rimanenti e la qualità soffre. –