Ich weiß, es ist eine alte Frage, aber vielleicht könnte jemand weitere Ideen hinzufügen.
NB: Die folgenden würde wirklich nur für eine spezifische Untermenge von Anwendungsfällen Sinn ergeben:
Wenn die Anforderung sich auf stark überlappende Schlüsselsätze bezieht (im Extremfall der gleiche Schlüsselsatz für alle Maps), dann könnte eine sehr effektive Lösung darin bestehen, die Schlüssel im Hinblick auf Maps "extern" zu machen und die Maps nur Werte, in einem Array, zu enthalten.
Die Implementierung sollte nicht "strukturell" vom Überlappungsfaktor abhängig sein, aber meine funktioniert besser, je mehr die Schlüssel sich überlappen. Wie du erwarten würdest.
Ich kann keine genauen Details meiner Implementierung geben, aber es ist wichtig, einen geeigneten Mechanismus zu haben, um Schlüssel (außerhalb Ihres Map-Objekts gespeichert) in Indizes des Wertearrays umzuwandeln, während es dem Wertearray ermöglicht wird, kompakt zu bleiben, also eine Länge von fünf zu haben, wenn Ihre Map fünf Zuordnungen enthält.
Angenommen, die Schlüssel für all diese Maps sitzen in einer separaten Map, zugeordnet zu Zahlen. Dann geht es darum, eine Möglichkeit zu haben, die Zahlen und Array-Indizes in Beziehung zu setzen.
Entschuldigung, wenn das nicht spezifisch genug ist, aber ich fand die Idee interessant und gleichzeitig einfach und könnte als alternative Richtung bei der Entwicklung einer speichereffizienten Map verwendet werden.
Es ist von Natur aus für Anwendungsfälle mit hoher "Schlüsselüberlappung" geeignet, aber an sich ist es allgemein gültig. Es kann durchaus Leistungsprobleme haben, wenn die Überlappung zu gering ist, abhängig von den Implementierungsdetails.
1 Stimmen
Ich denke nicht, dass eine auf einer verketteten Liste basierende Map die "kleinste" wäre. Ich würde eine auf einem Array basierende erstellen, ohne die Entry-Objekte (d.h. die Werte werden direkt im Array gespeichert). Das bedeutet, dass Kollisionen unangenehm werden, aber es gibt Möglichkeiten, damit umzugehen.
0 Stimmen
Letzte Woche habe ich eine Implementierung genau dieser Map gemacht (also bist du nicht alleine mit deinen Bedürfnissen). Leider ist die Implementierung nicht Open Source. Ich habe es geschafft, die erforderliche Größe der Map auf 16 (für das Map-Objekt) + 16 (für das Array; aufgerundet) + 8 *
size
(für die Array-Inhalte) zu reduzieren. Das ist der geringste Speicherverbrauch, den man erreichen kann, es sei denn, man möchte direkt auf das Array zugreifen und nur statische Methoden verwenden, was nochmal weitere 16 Byte pro Map sparen würde. Aber in dem Fall wäre es keine Implementierung desMap
-Interfaces mehr.