Memorizza i punteggi per i giocatori e produce una lista dei punteggi più alti

1

Questa domanda deriva da una domanda di intervista che ho ricevuto per un lavoro che ho rifiutato. Ho richiesto la revisione del codice per la mia soluzione nel sito dedicato allo scambio di stack ( link ). Ma spero che questa domanda sia sufficientemente riformulata e chiesta con una diversa motivazione di non essere un duplicato dell'altra domanda.

Considera il seguente scenario:

Dovresti memorizzare i punteggi dei giocatori nel back-end del server di un gioco. Il server è scritto in Java.

Ogni punteggio deve essere registrato, cioè un giocatore può avere un numero qualsiasi di punteggi per qualsiasi numero di livelli.

Una lista dei punteggi migliori dovrebbe essere prodotta con i quindici migliori punteggi per un dato livello, ma solo un punteggio per utente (nel senso che anche se il giocatore X ha i due punteggi più alti per il livello Y, viene conteggiata solo la prima posizione e il giocatore Z ha il secondo posto).

Nessuna informazione dovrebbe essere mantenuta e dovrebbero essere usate solo librerie standard Java 1.7+. Nessuna libreria o framework di terze parti sono accettabili.

Con il numero di giocatori come fattore principale, quale sarebbe la migliore struttura dati in termini di scalabilità e concorrenza?

Come accederai alla struttura per registrare un punteggio singolo dato un livello e un ID giocatore?

Come accederai alla struttura per compilare la lista dei punteggi più alti?

    
posta zrvan 28.05.2014 - 08:27
fonte

1 risposta

1

Questa potrebbe essere una domanda trabocchetto, dal momento che implica che dovresti essere in grado di rappresentare i punteggi per ogni singolo livello per ogni singolo giocatore in una singola struttura di dati. Mentre questo può essere vero in generale, stiamo parlando di un gioco con molti molti giocatori. Pertanto, provare a tenere tutto in memoria potrebbe funzionare inizialmente, ma non è ragionevole presumere che sarebbe scalabile, e dal momento che scalabilità è importante qui, dovresti dire al tuo intervistatore che una struttura di dati java di qualsiasi non si può ragionevolmente pensare che la forma contenga tutte le informazioni richieste.

Ciò che viene in mente è un database per tali cose, dal momento che è contemporaneamente concorrente sia scalabile che completamente di supporto, entrambi requisiti in questo caso. Se l'intervistatore vuole entrare nei dettagli in merito, è possibile, ma penso che il punto chiave qui sia che non proverai a inserire tutto nella memoria del server.

Tuttavia su questo punto, dovresti probabilmente aggiungere che sarebbe anche inefficiente dover caricare tutti i punteggi dopo ogni livello per vedere se hai un posto nella lista dei punteggi migliori. Quindi, a tale scopo, penso che mantenere i punteggi migliori per ogni livello sia un ragionevole compromesso per le prestazioni. In termini di memoria, i primi 10 slot X 100 livelli sono 1000 slot, quantità di spazio perfettamente ragionevole e, soprattutto, non cresce .

Rappresenterei ciò usando un Map<int, SortedMap<long, Player>> . La mappa esterna viene utilizzata per memorizzare una mappa per ogni livello (non è necessario cercare in altri livelli oltre a quello che ho appena battuto). È anche irrilevante il tipo di mappa, dal momento che deve solo trovare il livello indicato. Il% co_de interno memorizza il punteggio come chiave e la classe SortedMap associata che ha ottenuto quel punteggio. In questo caso, è rilevante che sia un Player , poiché è probabile che tu voglia accedervi in modo sequenziale in base al punteggio.

Quando un giocatore finisce un livello, puoi fare un rapido controllo in memoria per vedere se il giocatore è arrivato alla lista dei punteggi migliori per quel determinato livello senza fare un recupero esplicito al database ogni volta. In tal caso, in un'azione sincronizzata , dovresti inserire il giocatore nella SortedMap per quel livello (rimuovendo il punteggio peggiore in seguito) e quindi aggiornare il database. Deve essere sincronizzato per garantire che sia anche coerente con il database e coerente con le richieste multiple che verranno fatte.

Questo risponde alla tua domanda?

    
risposta data 28.05.2014 - 09:50
fonte

Leggi altre domande sui tag