Ich arbeite derzeit an einer Haskell-API. Letztere bietet einige Funktionen, die derzeit eine Liste der Listen als Eingabe, d.h. [(String,[(String, Double)])]
.
Zur Veranschaulichung sehen Sie hier ein Beispiel für die Liste der Listen oben erwähnt:
[
("A", [
("I1", 1),
("I2", 2),
]
),
("B", [
("I1", 3),
]
)
]
Ich habe einige privat Hilfsfunktionen. Eine Hilfsfunktion sucht nach bestimmten Einträgen in dieser Liste ( Data.List.find
= O(n)
); eine weitere Funktion führt Schnittmengen aus; und eine weitere Funktion wandelt die oben dargestellte Liste in die folgende um:
[
("I1", [
("A", 1),
("B", 3),
]
),
("I2", [
("A", 2),
]
)
]
Die Funktion, die die Transformation durchführt, verwendet Data.Map
da es einige Funktionen bietet, die diesen Prozess sehr vereinfachen, wie Data.Map.unionWith
y Data.Map.insertWith
. Nun, da die Transformationsfunktion die Data.Map.fromList
y Data.Map.toList
dachte ich, es wäre schön, eine Karte der Karten anstelle einer Liste der Listen von Anfang an. Also änderte ich meine Beispieleingabe, um sie an die Karte der Karten Anforderung.
Zur Veranschaulichung hier noch einmal die Liste von oben als Karte der Karten :
Map.fromList [
("A", Map.fromList [
("I1", 1),
("I2", 2),
]
),
("B", Map.fromList [
("I1", 3),
]
)
]
Dank dieses Schrittes hat mein Code ein paar Zeilen verloren, und dank der Data.Map.lookup
Die Suche nach dem Gewünschten dauert jetzt nur noch O(log n)
Zeit.
Trotzdem frage ich mich gerade, ob das wirklich eine gute Lösung ist? Ist eine Karte der Karten der richtige Weg? Oder sollte die Transformationsfunktion mit Data.Map.fromList
y Data.Map.toList
und lassen Sie den Rest mit Liste der Listen ? Oder besser noch, gibt es eine Datenstruktur, die für diese Art von Arbeit besser geeignet ist?
Ich bin sehr gespannt auf Ihre Antworten.
1 Stimmen
Sind Ihre Suchvorgänge tatsächlich schneller geworden (in Wanduhrzeit), oder haben Sie die algorithmische Komplexität verbessert? Die algorithmische Komplexität ist zwar eine wichtige Überlegung, aber es gibt noch andere Überlegungen. Wenn Sie nur wenige Elemente haben (vielleicht <10?), ist die Liste der Listen wahrscheinlich am effizientesten.
0 Stimmen
John: Danke für deinen Beitrag. Ich habe verwendet
Data.List.find
um nach einem Element zu suchen. Da es sich um eine Empfehlungs-API handelt, sollte sie in der Lage sein, eine große Menge an Daten zu verarbeiten.0 Stimmen
John: Beim erneuten Lesen meines vorherigen Kommentars ist mir aufgefallen, dass ich nicht auf Ihre erste Frage geantwortet habe. Das tut mir leid. Ich habe die algorithmische Komplexität verbessert, da
Data.List.find
nimmtO(n)
Zeit, und ich ersetzte sie durchData.Map.lookup
die inO(log n)
tiempo.