Ok, ich denke, es gab nicht viele Referenzen oder Nachforschungen zur Beantwortung dieser Frage. Stattdessen habe ich mir die Zeit genommen, deine verschiedenen Ideen und Bäume auszuprobieren. Ich habe nicht viel besseres gefunden als RB-Bäume, aber vielleicht ist das nur ein Such-Bias.
Der RB-Baum kann (insertion) ausgeglichen mit vier einfachen Regeln, wie shown by Chris Okasaki:
balance T (T R (T R a x b) y c) z d = T R (T B a x b) y (T B c z d)
balance T (T R a x (T R b y c)) z d = T R (T B a x b) y (T B c z d)
balance T a x (T R b y (T R c z d)) = T R (T B a x b) y (T B c z d)
balance T a x (T R (T R b y c) z d) = T R (T B a x b) y (T B c z d)
balance T a x b = T B a x b
AVL-Bäume können in einer ähnlichen Art und Weise Musteranpassungs ausgeglichen werden. Allerdings sind die Regeln komprimieren nicht so gut:
balance T (T (T a x b dx) y c (-1)) z d (-2) = T (T a x b dx) y (T c z d 0) 0
balance T a x (T b y (T c z d dz) 1) 2 = T (T a x b 0) y (T c z d dz) 0
balance T (T a x (T b y c 1) 1) z d (-2) = T (T a x b -1) y (T c z d 0) 0
balance T (T a x (T b y c (-1)) 1) z d (-2) = T (T a x b 0) y (T c z d 1) 0
balance T (T a x (T b y c _) 1) z d (-2) = T (T a x b 0) y (T c z d 0) 0
balance T a x (T (T b y c 1) z d (-1)) 2 = T (T a x b -1) y (T c z d 0) 0
balance T a x (T (T b y c (-1)) z d (-1)) 2 = T (T a x b 0) y (T c z d 1) 0
balance T a x (T (T b y c _) z d (-1)) 2 = T (T a x b 0) y (T c z d 0) 0
balance t = t
Wie AVL Bäume Nähte in der Regel schlechter als RB Bäume in Betracht gezogen werden, sind sie wahrscheinlich nicht wert, die zusätzlichen Aufwand.
AA Bäume könnten theoretisch ausgeglichen schön und leicht von:
balance T n (T n a x b) y c = T n a x (T n b y c) -- skew
balance T n a x (T n b y (T n c z d)) = T (n+1) (T n a x b) y (T n c z d) --split
balance T n a x b = T n a x b
Aber leider Haskell nicht wie die Überlastung der n
. Es ist möglich, dass eine weniger standardisierte Implementierung von AA-Bäumen, die keine Ränge verwenden, sondern etwas, das R und B ähnlicher ist, gut funktionieren würde.
Splay-Bäume sind schwierig, da Sie sich auf einen einzelnen Knoten anstatt auf die statische Struktur des Baums konzentrieren müssen. Es kann durch merging insert and splay erfolgen.
Treasures sind auch in einer funktionalen Umgebung unruhig, da Sie keinen globalen Zufallsgenerator haben, sondern Instanzen in jedem Knoten behalten müssen.Dies kann durch leaving the task of generating priorities to the client angegangen werden, aber selbst dann können Sie keinen Prioritätsvergleich mit Mustervergleich durchführen.
Keine direkte Antwort, aber lesen Sie "Rein funktionale Datenstrukturen", um ein paar gute Ideen zu bekommen. –
Ich mag es. Es geht nicht viel in detaillierte Strukturen, sondern bietet eine gute allgemeine Sichtweise. –
Benötigen Sie einen Suchbaum oder eine Baumdarstellung einer Sequenz (wie Fingerspitzen - mit Verkettung und Teilung)? Im letzteren Fall sind rein funktionale 2-3 Bäume trivial. – jkff