So che è una vecchia domanda ma forse qualcuno potrebbe aggiungere ulteriori idee.
NB: Le seguenti sarebbe veramente solo senso per uno specifico sottoinsieme di casi di utilizzo:
Se il requisito comprende altamente sovrapposti mazzi di chiavi (nel caso estremo lo stesso insieme di chiavi per tutte le mappe) quindi una molto soluzione efficace potrebbe essere quella di "esternalizzare" le chiavi rispetto alle mappe e fare in modo che le mappe contengano solo valori, in una matrice.
L'implementazione non deve dipendere "strutturalmente" dal fattore di sovrapposizione, ma la mia funziona meglio più le chiavi si sovrappongono. Come ti aspetteresti.
Non riesco a fornire dettagli esatti della mia implementazione, ma è importante disporre di un meccanismo adeguato per convertire chiavi (memorizzate al di fuori dell'oggetto mappa) in indici nell'array dei valori, consentendo anche il mantenimento della matrice di valori compact, ovvero avere la lunghezza cinque se la mappa contiene cinque mappature.
Dire che le chiavi di tutte queste mappe si trovano in una mappa separata, mappata ai numeri. Quindi si tratta di un modo per mettere in relazione numeri e indici di array.
Scusate se questo non è abbastanza specifico, ma ho pensato che l'idea sia interessante e semplice allo stesso tempo, e potrebbe essere usata come una direzione alternativa nello sviluppo di una mappa efficiente della memoria.
Anche in questo caso, è intrinsecamente adatto a casi di utilizzo di "sovrapposizione di chiavi" elevate, ma è esso stesso generico. Potrebbero verificarsi problemi di prestazioni se la sovrapposizione è troppo bassa, a seconda dei dettagli di implementazione.
Non penso che una mappa basata su una lista collegata sarebbe la "più piccola". Creerei un array basato su senza gli oggetti Entry (cioè i valori sono memorizzati direttamente nell'array). Ciò significa che le collisioni diventeranno cattive, ma ci sono modi per ovviare a questo. –
La settimana scorsa ho implementato esattamente questa mappa (quindi non siete soli con le vostre esigenze). Sfortunatamente, l'implementazione non è Open Source. Sono riuscito a ridurre la dimensione richiesta della mappa a 16 (per l'oggetto mappa) + 16 (per l'array, arrotondato per eccesso) + 8 * 'size' (per i contenuti dell'array). Questo è l'utilizzo di memoria più basso che si possa ottenere, a meno che non si desideri operare direttamente sull'array usando solo metodi statici, il che consente di risparmiare altri 16 byte per mappa. Ma in quel caso, non sarebbe più un'implementazione dell'interfaccia 'Mappa'. –