2016-02-25 11 views
5

Ho un oggetto del percorso di gara che è un oggetto ArrayList che contiene oggetti Horse. Ho scelto ArrayList perché è facile da implementare. Tuttavia, lo svantaggio di usare un ArrayList è che non posso facilmente tenere traccia delle posizioni di ogni cavallo senza andare ripetutamente in giro attraverso la collezione. Ad esempio, se voglio trovare 2 cavalli che si trovano entro una distanza X di distanza l'uno dall'altro, dovrei ripetere iterando attraverso n^2 volte.Che cos'è una buona raccolta di dati per rappresentare una corsa di cavalli?

Esiste una strategia migliore per farlo?

MODIFICA: Molte richieste per essere specifiche sul mio modello di gara, quindi elaborerò qui.

Il modello viene aggiornato ogni iterazione. Quindi ogni cavallo ha la sua velocità, accelerazione, distanza percorsa, ecc. E ogni iterazione attraverso la raccolta aggiorna questi valori. È necessario che, se un cavallo è vicino a un altro, esso rallenti, cosa che ho intenzione di fare confrontando i valori della distanza percorsa.

+2

Potete trovare tali coppie di cavalli ordinandone le posizioni e iterando, che è 'O (n log n)'. –

+0

essere specifici: 1. devi interrogare e modificare i valori in modo casuale? o 2. (ripetutamente) {aggiorni i valori quindi esegui le query}? caso 1. -> albero con rimuovi e reinserisci, caso 2. -> array: ripeti {aggiorna valori, ordina, esegui query} – BeyelerStudios

+0

c'è anche un terzo caso: i valori (cioè le posizioni di gara) possono saltare saltuariamente? o possono solo muoversi su e giù? in questo terzo caso si desidera una lista di scansione (che è una matrice ordinata) e spostandosi verso l'alto o verso il basso equivale a scambiare le posizioni nell'array. – BeyelerStudios

risposta

1

Suppongo che si possano aggiungere oggetti Horse alla raccolta TreeSet. Dovresti implementare un'interfaccia comparabile nella classe Horse e sovrascrivere il metodo compareTo(), quindi ordinare i cavalli per distanza. Quindi puoi usare operazioni specifiche su treeSet come "higher()" che restituirà il primo cavallo che viene eseguito più di uno dato, ecc. Puoi leggere di più su questa collezione here. Inoltre tutte le operazioni sono O (lgN) per complessità temporale.

+3

L'avvertenza è che TreeSet non si ri-ordina automaticamente se le proprietà dei valori che influenzano l'ordinamento vengono modificate dopo l'inserimento. –

+0

Certo, ma non sono esattamente sicuro di quale sia il caso. Ma hai ragione su questo. Ma l'oggetto può essere rimosso e aggiunto di nuovo in tempo O (lgN). –

+0

Ma TreeSet non consente duplicati. In questo modo puoi perdere cavalli con la stessa distanza – Eva

0

Se si mantiene un elenco ordinato sugli aggiornamenti della posizione del cavallo, è possibile determinare tutte le coppie di cavalli X distanti tra loro in una scansione, N ora (bilanciamento mantenendo la lista ordinata, log (n) per aggiornamento).

Se si desidera che tutti i cavalli siano a distanza di X da un dato cavallo H. È inoltre possibile mantenere una mappa hash di cavallo all'indice di array e potenzialmente evitare di ripetere l'intero array.