Clojure Zipper von verschachtelten Maps, die eine TRIE unterdrücken

8

Wie kann ich einen Clojure-Reißverschluss für eine TRIE erstellen, dargestellt durch verschachtelte Karten, bei denen die Schlüssel die Buchstaben sind.?

In etwa so:

%Vor%

Stellt einen Trie mit zwei Wörtern "Banane" und "Ana" dar. (Falls nötig, können hier einige Änderungen in den Karten vorgenommen werden.)

Ich habe versucht, map? vals assoc als 3 Funktionen an den Reißverschluss zu übergeben. Aber es scheint nicht zu funktionieren.

Welche 3 Funktionen soll ich verwenden?

Und wie würde der Einsatz-in-Trie basierend auf dem Reißverschluss aussehen?

    
0xMG 21.02.2013, 22:28
quelle

2 Antworten

14

map? vals #(zipmap (keys %1) %2) würde tun, aber das Einfügen / Entfernen von Kindern nicht unterstützen (da Kinder nur Werte sind, wissen Sie nicht, welchen Schlüssel Sie entfernen / hinzufügen).

Die map-zipper unten unterstützt das Einfügen / Entfernen, da Knoten [k v] -Paare sind (mit Ausnahme der Wurzel, die eine Map ist).

%Vor%     
cgrand 22.02.2013 09:21
quelle
0

Die Lösung, die von @cgrant vorgeschlagen wird, ist großartig, beschreibt aber implizit einen Baum, dem alle Zweige und Blattknoten zugeordnet sind value (der Schlüssel im Wörterbuch) außer dem Wurzelknoten, der nur eine Verzweigung ohne Wert ist. Der Baum {"/" nil} ist also kein Baum mit einem einzelnen Blattknoten, sondern ein Baum mit einem anonymen Stammzweig und einem einzelnen Blattknoten mit dem Wert / . In der Praxis bedeutet dies, dass jede Traversierung des Baumes zuerst eine (zip/down t) ausführen muss, um den Wurzelknoten abzusteigen.

Eine alternative Lösung besteht darin, das Stammverzeichnis explizit in der Map zu modellieren, dh nur die Zipper aus Maps mit einem einzelnen Schlüssel im Stammverzeichnis zu erstellen. Zum Beispiel: {"/" {"etc/" {"hosts" nil}}}

Der Reißverschluss kann dann mit:

implementiert werden %Vor%     
mrucci 03.03.2018 20:09
quelle

Tags und Links