Algoritmo per ridurre le chiamate all'API di mappatura

1

Una distribuzione casuale di punti si trova su una mappa.

Questi dati si trovano dietro un'API e voglio afferrare il set completo di punti all'interno di un determinato riquadro di delimitazione.

Posso interrogare l'API con il riquadro di delimitazione e l'API restituirà il set di punti che rientrano in quella casella.

Il problema è che l'API limiterà il risultato a 10 elementi, senza impaginazione e senza indicazione se ci sono più punti che sono stati omessi.

Quindi ho creato un algoritmo ricorsivo che prende un riquadro di delimitazione e richiede i punti che si trovano al suo interno. Se il set di risultati è esattamente di 10 elementi, allora divido il riquadro di delimitazione in quattro quadranti e ricorri.

Funziona bene ma la mia domanda è questa: se vuoi minimizzare il numero di chiamate API, qual è il modo ottimale per dividere il riquadro di delimitazione?

Dividerlo in quadranti era solo una decisione arbitraria. Quando ci sono molti punti sulla mappa, devo approfondire molti livelli prima di iniziare a ottenere risultati significativi. Quindi immagino che potrebbe essere più veloce dividere la scatola in, diciamo, 9, 16 o più sezioni. Ma se lo faccio, allora alla fine arriva a un punto in cui molte richieste restituiscono 0 risultati che non sono così efficienti.

Inoltre, la dimensione del limite sul set di risultati influisce sulla risposta?

(Questo è tutto presupponendo che io non abbia conoscenza preliminare della densità nominale del punto nel riquadro di delimitazione)

    
posta aidan 13.06.2014 - 09:48
fonte

3 risposte

2

Come si divide il riquadro di delimitazione si tratta di ottimizzare le chiamate API. Spezzalo nei quadranti e rischi di doverli suddividere ulteriormente per non essere abbastanza piccolo. Rompila nella griglia e rischi di effettuare chiamate API superflue quando i quadranti farebbero.

Idealmente vorrai suddividerlo in un numero di caselle che divide il numero di punti in 10 punti ciascuno. Tuttavia, il problema con 10 è che non puoi sapere se ci sono più punti, quindi dovremo accontentarci di 9.

Approccio statistico

A questo punto, il fattore decisivo è determinato dalle statistiche. Statisticamente, quali sono le probabilità che un'area contenga esattamente 9 punti all'interno? Suppongo che questo sia facilmente determinato dallo zoom corrente. Se si esegue lo zoom indietro, probabilmente non si otterranno solo 9 punti nel quadrante. Per eliminare questa variabile, attenersi alle misurazioni fisiche (miglia, chilometri, ecc.) Poiché non cambieranno con lo zoom. Dovrai semplicemente eseguire il lavoro extra di calcolo delle misurazioni fisiche dallo zoom corrente (numero di punti in un'area definita da larghezza * altezza = numero di punti / chilometro ^ 2 * larghezza * altezza).

Ora la parte difficile è ottenere queste statistiche. Questo è in gran parte determinato dal modo in cui funziona la tua applicazione. Se gli utenti forniscono questi punti, allora è interamente variabile e dovrai tenere un conto corrente di numero di punti / chilometro ^ 2. Se questi punti sono statici, puoi fare qualche ottimizzazione all'interno del tuo programma.

Data la densità media (numero di punti / chilometro ^ 2) e la deviazione standard, puoi mirare a una deviazione standard da 9, e avrai un 84% (68% + 16% di coda per essere più di uno deviazione standard verso zero) possibilità di far cadere tutti i punti tra 9 e 0. Una volta che si conosce la densità massima da questo calcolo, l'altezza e la larghezza saranno l'inverso della densità massima moltiplicata per 9 meno la deviazione standard.

Mi rendo conto che questa è una sorta di risposta tecnica, ma ottimizzerebbe. Tuttavia, considera anche che una mappa non è distribuita uniformemente, quindi sarebbe ottimale solo se la distribuzione è coerente con il resto della mappa. Potrebbe non funzionare bene per dire, una città.

Approccio alternativo

Un approccio alternativo se hai dati di punti statici potrebbe essere semplicemente eseguire simulazioni di monte-carlo, iniziando con la suddivisione in 2x2 quadrati e poi passando a 3x3, 4x4, eccetera. Conta il numero di chiamate API totali e scegli quello che richiede il minimo. Spero che ti aiuti!

    
risposta data 13.06.2014 - 10:13
fonte
2

Vorrei scegliere una coordinata (x / y) e trovare la linea divisoria che divide i punti restituiti in due parti, idealmente 5/5.

In questo modo non chiami molto tempo api se ci sono dei punti raggruppati vicino all'angolo del tuo rettangolo originale.

Un'altra cosa, se hai una buona euristica per la densità, puoi saltare le chiamate per rettangoli di grandi dimensioni e iniziare con abbastanza piccolo in modo che ci siano solo piccole possibilità che siano vuote o che contengano molto più di 10 punti.

ad es. se sospetti cluster nell'angolo in alto a sinistra e forse pochi punti nel resto, puoi chiedere 3 rettangoli, uno con cluster (e aspettati di recidenziare) uno sotto (o sul lato di esso) e il resto.

    
risposta data 13.06.2014 - 10:37
fonte
1

Non penso che ci sia molto che puoi fare al riguardo. Se conosci la densità dei punti, potresti abbattere i quadranti di conseguenza.

Se i punti non cambiano, puoi memorizzarli nella cache, quindi inizialmente avresti una quantità relativamente alta di chiamate all'API che alla fine si minimizzeranno man mano che la tua applicazione maturerà.

    
risposta data 13.06.2014 - 10:03
fonte

Leggi altre domande sui tag