Yatima2975 scheint Ihre ersten beiden Fragen beantwortet zu haben, ich werde versuchen, die dritte zu beantworten. Um dies zu tun, werde ich einen unrealistisch einfachen Fall behandeln, aber ich bin sicher, dass Sie sich etwas Realistischeres vorstellen können.
n
type Tree = Leaf | Node Tree Tree
n
full : Int -> Tree
full n | n == 0 = Leaf
full n = Node (full (n-1)) (full (n-1))
Und die Tiefe eines Baumes wird von berechnet
depth : Tree -> Int
depth Leaf = 0
depth (Node t1 t2) = 1 + max (depth t1) (depth t2)
d e p t h ( f u l l n) nfu l ld e p t hd e p t h ( f u l l n) fu l l _ d e p t h
full_depth : Int -> Int
full_depth n | n == 0 = 0
full_depth n = 1 + max (full_depth (n-1)) (full_depth (n-1))
Dies vermeidet die Speicherzuordnung des gesamten Baums und die Notwendigkeit, einen Musterabgleich durchzuführen, was die Leistung erheblich verbessert. Darüber hinaus, wenn Sie die Optimierung hinzufügen
max t t --> t
Dann haben Sie eine exponentielle Zeitprozedur in eine lineare ... Es wäre cool, wenn es eine zusätzliche Optimierung gäbe, die erkennt, dass die Identität für ganze Zahlen ist, aber ich bin mir nicht sicher, ob dies der Optimierung wird in der Praxis eingesetzt.fu l l _ d e p t h
Der einzige Mainstream-Compiler, der die automatische Entwaldung durchführt, ist GHC. Wenn ich mich recht entsinne, wird dies nur beim Erstellen von integrierten Funktionen durchgeführt (aus technischen Gründen).
Erstens sind Listen eine Art Bäume. Wenn wir eine Liste als verknüpfte Liste darstellen , handelt es sich nur um einen Baum, dessen Knoten entweder 1 oder 0 Nachkommen haben.
Durchsuchen von Bäumen ist nur eine Verwendung von Bäumen als Datenstruktur. Bäume haben viele verschiedene Anwendungen in der Informatik, einschließlich Sortieren, Implementieren von Karten, assoziativen Arrays usw.
Im Allgemeinen sind Listen, Bäume usw. rekursive Datenstrukturen: Jeder Knoten enthält einige Informationen und eine weitere Instanz derselben Datenstruktur. Das Falten ist eine Operation über alle derartigen Strukturen, die Knoten rekursiv in Werte "von unten nach oben" umwandelt. Das Entfalten ist der umgekehrte Vorgang, es wandelt Werte in Knoten "von oben nach unten" um.
Für eine gegebene Datenstruktur können wir ihre Falt- und Entfaltungsfunktionen mechanisch konstruieren.
Nehmen wir als Beispiel Listen. (Ich werde Haskell für die Beispiele verwenden, da es geschrieben ist und seine Syntax sehr klar ist.) Liste ist entweder ein Ende oder ein Wert und ein "Ende".
Stellen wir uns jetzt vor, wir falten eine Liste. Bei jedem Schritt muss der aktuelle Knoten gefaltet werden, und die rekursiven Unterknoten wurden bereits gefaltet. Wir können diesen Zustand als darstellen
wobei
r
der Zwischenwert konstruiert , indem die Unterliste zu falten. Dies ermöglicht es uns, eine Faltungsfunktion über Listen auszudrücken:Wir konvertieren
List
in,ListF
indem wir ihre Unterliste rekursiv umklappen und dann eine in definierte Funktion verwendenListF
. Wenn Sie darüber nachdenken, ist dies nur eine weitere Darstellung von Standardfoldr
:Wir können
unfoldList
auf die gleiche Weise konstruieren :Wieder ist es nur eine andere Darstellung von
unfoldr
:(Beachten Sie, dass
Maybe (a, r)
isomorph zu istListF a r
.)Und wir können auch eine Entwaldungsfunktion konstruieren:
Es lässt einfach das Zwischenprodukt weg
List
und verschmilzt die Falt- und Entfaltungsfunktionen miteinander.Das gleiche Verfahren kann auf jede rekursive Datenstruktur angewendet werden. Beispiel: Ein Baum, dessen Knoten 0, 1, 2 oder Nachkommen mit Werten auf 1- oder 0-Verzweigungsknoten haben können:
Natürlich können wir
deforestTree
genauso mechanisch wie bisher erstellen .(Normalerweise würden wir
treeFold
bequemer ausdrücken als:)
Ich werde die Details weglassen, ich hoffe, das Muster ist offensichtlich.
Siehe auch:
quelle
Es ist etwas verwirrend, aber die Entwaldung wird (zur Kompilierungszeit) angewendet, um Zwischenbäume zu entfernen, die (zur Laufzeit) erstellt würden. Bei der Abholzung von Wäldern werden keine Teile des abstrakten Syntaxbaums gehackt (das ist die Eliminierung toter Zweige :-)
Eine andere Sache , die Sie weg geworfen haben kann , ist , dass die Listen sind Bäume, nur sehr unausgewogen diejenigen!
quelle