Introductioniterativ Trie Konstruieren von einem Baum
Die folgende Funktion iterativ durchläuft eine Baumstruktur von verschachtelten Vektoren hergestellt. Es testet jedes Blatt gegen ein Prädikat. Die Pfade zu allen Blättern, die diesen Wahrheitstest bestehen, werden in einer Trie structure zurückgegeben. Letzteres beschreibt alle gefundenen Pfade auf nicht-redundante Weise.
(defn get-trie-of-matches [is? tree]
(loop [[tree i path fk] [tree 0 [] nil]
accum {}]
(cond
(>= i (count tree)) ;; end of level/go up
(if (nil? fk) accum (recur fk accum))
(vector? (tree i)) ;; level down
(recur [(tree i) 0 (conj path i) [tree (inc i) path fk]] accum)
(is? (tree i)) ;; match
(let [new-accum (assoc-in accum (conj path i) {})]
(recur [tree (inc i) path fk] new-accum))
:else ;; next on same level
(recur [tree (inc i) path fk] accum))))
Weitere Erläuterungen finden Sie unter this post.
Beispiel
Betrachten Sie die folgende Baum
(def tree [7 9 [7 5 3 [4 6 9] 9 3] 1 [2 7 9 9]])
auf die Funktion angewendet, even?
als Prädikat verwendet:
(get-trie-of-matches even? tree)
=> {2 {3 {0 {}, 1 {}}}, 4 {0 {}}}
Das Ergebnis die Zahlen sogar drei Pfade beschreibt in tree
. Nämlich 2-3-0
, 2-3-1
und 4-0
.
Problem
Auch wenn die oben genannte Funktion funktioniert, könnte es bessere Möglichkeiten, die Trie zu konstruieren, während der Baum durchquert. Im Moment ist eine Hash-Karte überschwemmt. Bei jedem Spiel über assoc-in. Der Algorithmus durchquert die Baumstruktur relativ von Ebene zu Ebene, hängt jedoch jeden Pfad global an accum
an, was nicht notwendig ist. Auch diese Methode ist nur möglich, da eine Hash-Map verwendet wird. Es könnte jedoch besser sein, eine sequentielle Datenstruktur für die Trie zu verwenden, um weitere Iterationen darüber zu ermöglichen. Dies konnte nicht für die obige Methode übernommen werden.
Frage
Wie kann ein Trie aus der obigen Funktion erstellt wird get-trie-of-matches
, ohne sie auf Hash-Karte spezifisch ‚global‘ ‚write‘ Funktionen?
Werfen Sie einen Blick auf [Specter] (http://nathanmarz.com/blog/functional-navigational- Programmierung-in-clojurescript-with-sp.html). Sie können angeben, wie Sie in Ihrer Datenstruktur getrennt von dem navigieren möchten, was Sie einfügen möchten. Es behauptet, sowohl eine hohe Leistung (besser als "Einstieg" usw.) als auch eine einfache Programmierung bereitzustellen. –
Könnten Sie genauer angeben, was Ihre Probleme bei der Implementierung sind, die Sie geben? Es gibt sicherlich "bessere" Wege, um das Gleiche zu erreichen, aber es ist nicht klar, was anders sein sollte. Was meinen Sie zum Beispiel mit "hasp-map-spezifischen" globalen Schreibfunktionen? Suchen Sie nach einer faulen Lösung? –