Organizzazione della stessa serie di dati in base a due criteri diversi contemporaneamente

0

Diciamo che voglio modellare una rubrica.

Desidero che una rubrica venga mantenuta in ordine ordinato per nome della persona per cui è stata creata la voce della rubrica. Tuttavia, poiché è possibile che ci siano due persone con lo stesso nome, non posso utilizzare nessuna delle raccolte ordinate, perché richiedono l'uso di chiavi (che, per definizione, devono essere univoche). D'altra parte, devo avere una sorta di identificatore univoco per ogni voce, se desidero implementare la rubrica come servizio, altrimenti non avrei modo di identificare la voce che vorrei aggiornare o eliminare.

Vorrei ascoltare suggerimenti e idee su come organizzare i dati e il processo di aggiunta e aggiornamento, quindi è ordinato in un modo desiderato, e tuttavia mantenere la possibilità di una rapida ricerca di una singola voce basata su un ID unico.

L'idea che mi è più vicina è qualcosa di simile.

Le rubriche sono organizzate in ordine alfabetico, quindi uno degli approcci potrebbe essere qualcosa del tipo:

SortedDictionary<char, List<PhonebookEntry>> phonebook = new SortedDictionary<char, List<PhonebookEntry>>();

La chiave sarebbe il primo carattere dell'identificatore principale PhonebookEntry (nome).

L'elenco verrà mantenuto in ordine ordinato su inserimento e aggiornamento. L'inserto cerca l'indice nell'elenco in cui deve essere aggiunta la voce e quindi inserisce la voce in tale indice. L'alternativa sarebbe un approccio a forza bruta: per ordinare semplicemente l'elenco dopo ogni inserimento. L'aggiornamento controllerebbe se il nome della voce è stato aggiornato. In tal caso, ordina l'elenco di conseguenza se la voce rimane nella stessa lista, o la rimuove da quella lista e la inserisce nell'elenco appropriato del dizionario.

Ora, il problema è come trovare la voce sulla base di una sorta di identificatore univoco che verrebbe assegnato a ciascuna voce (ad esempio GUID, ad esempio). Sono più vicino all'idea di avere un altro dizionario, come questo:

Dictionary<Guid, Tuple<char, long>> phonebookEntryMap = new Dictionary<Guid, Tuple<char, long>>();

La chiave sarebbe l'ID univoco della voce, il valore sarebbe una Tupla che contiene il primo carattere della voce (per identificarlo nella struttura principale) e l'indice nella lista. L'ovvio lato negativo di questo approccio è che questa struttura deve essere attentamente mantenuta. Il vantaggio è che è un sovraccarico di memoria minimo, fornendo tutte le informazioni necessarie per un accesso rapido alla voce desiderata.

Un'alternativa sarebbe mantenere un riferimento a PhonebookEntry nel dizionario di mappatura invece della Tupla. Richiederebbe più memoria, ma nessun sovraccarico di mappatura.

Ci sono altri suggerimenti su come risolvere elegantemente questo problema?

    
posta Vladimir Stokic 18.01.2017 - 09:36
fonte

1 risposta

1

Penso che quello che stai cercando sia una "MultiMap". È fondamentalmente una mappa che può avere diversi valori per chiave. Puoi anche farlo basandosi su un normale Map<String, List<PhoneEntry>> ma è meno conveniente.

L'aspetto più importante è che si tratta di una mappa basata sull'albero . Avrai quindi inserimenti e rimozioni in O(log(N)) e inserzioni ordinate in O(1) poiché si tratta solo di "camminare sull'albero".

... e se vuoi ricerche / elenchi in base a diversi tasti (ad esempio nome o guida), mantieni solo più mappe. Questo è tutto.

    
risposta data 18.01.2017 - 20:54
fonte

Leggi altre domande sui tag