Vor ein paar Jahren, während eines C# Kurs lernte ich einen binären Baum zu schreiben, die mehr oder weniger so aussah:Bäume mit den Werten auf den Blättern nur
data Tree a = Branch a (Tree a) (Tree a) | Leaf
ich den Vorteil der es sah, hatte sie seine Werte auf den Zweigen, die ein schnelles und einfaches Nachschlagen und Einfügen von Werten ermöglichten, weil es einen Wert auf der Wurzel jedes Zweigs bis hinunter zu einem Blatt treffen würde, das keinen Wert enthielt.
Seit ich Haskell zu lernen begann, jedoch; Ich habe zahlreiche Beispiele von Bäumen gesehen, die wie folgt definiert sind:
data Tree a = Branch (Tree a) (Tree a) | Leaf a
Diese Definition verwirrt mich. Ich kann nicht den Nutzen, die Daten über die Elemente sehen, dass nicht Zweig tun, weil es an einem Baum enden würde, führt, die wie folgt aussieht:
Was mir scheint wie eine schlecht gestaltete Alternative zu einer Liste. Es lässt mich auch die Nachschlagzeit in Frage stellen, da es nicht beurteilen kann, welcher Zweig nach unten geht, um den Wert zu finden, nach dem er sucht; sondern muss jeden Knoten durchlaufen, um zu finden, wonach er sucht.
Also, kann jemand etwas Licht darauf werfen, warum die zweite Version (Wert auf Blättern) ist so viel häufiger in Haskell als die erste Version?
sicher können Sie das in C# tun, und es ist auch ziemlich einfach; Wenn Sie wissen, wie auf jeden Fall –
Sie sind einfach zwei verschiedene Datenstrukturen mit vielleicht verschiedenen Anwendungen, Vorteile, Nachteile (und vielleicht nicht). Zum Beispiel ist 'Data.IntMap' von letzterer Form (Daten nur auf Blättern) und' Data.Map' ist von letzterer Form. Was ist der Sinn, beides zu haben? Die Dokumentation hat folgendes zu sagen: "[IntMap] funktioniert besonders gut bei binären Operationen wie Union und Intersection. Meine Benchmarks zeigen jedoch, dass es bei Einfügungen und Löschungen im Vergleich zu [Data.Map]" (viel) schneller ist. Schließlich würde ich nicht sagen, dass die zweite Version "viel häufiger" ist. – user2407038