Eine Anwendungsdomäne, in der Binärbäume besser oder leichter anpassbar sind als bestimmte Alternativen, sind persistente Datenstrukturen (die häufig in der (rein) funktionalen Programmierung verwendet werden).
Eine persistente Datenstruktur ist eine Datenstruktur, die die vorherige Version von sich selbst beibehält, wenn sie geändert wird. (Datenstrukturen, die diese Eigenschaft nicht haben, werden als kurzlebig bezeichnet .) Ein Vorteil dieser Art von Datenstruktur besteht darin, dass Teile der Datenstruktur gemeinsam genutzt werden können. Da sich die Struktur selbst garantiert nicht ändert, ist es sicher, sie gemeinsam zu nutzen frei zwischen anderen Datenstrukturen und sogar Threads, ohne sich Sorgen machen zu müssen, dass sich diese ändern. Ein weiterer subjektiver Vorteil besteht darin, dass diese Datenstrukturen leichter zu verstehen sind.
Konzeptionell könnten Sie einen unveränderlichen Datentyp haben, der eine Liste von Zahlen ist, z. L.1= { 3 , 4 , 5 }. Dann könnten Sie einen neuen Wert einführen, der zwei Zahlen am Anfang dieser Liste hinzufügt:L.2= C o n s ( 1 , c o n s ( 2 ,L.1) ) = { 1 , 2 , 3 , 4 , 5 }. Was passierte mitL.1? Nichts -L.1= { 3 , 4 , 5 }, immer noch. HatL.2Kopieren Sie diese drei Elemente und fügen Sie sie in eine eigene Liste ein. Im Idealfall nicht - die Werte in der ListeL.1 gehört L.2, ebenfalls:
1 , 2 ,3 , 4 , 5L.1L.2
Es gibt Datenstrukturen, die sich besser für die Implementierung persistenter Listen wie der oben genannten eignen. Ebenso eignen sich Binärbäume besser für die Implementierung persistenter Datenstrukturen mit bestimmten Eigenschaften als andere Datenstrukturen oder Strategien. Die im Beispiel gezeigte strukturelle Freigabe mit den beiden Listen überträgt sich auf Binärbäume. Sie können sich vorstellen, dass mehrere Versionen eines Baums Teilbäume gemeinsam nutzen können, die sie gemeinsam haben.
Wie gesagt, einige Datenstrukturen lassen sich leichter ändern, um dauerhaft zu sein. Sie erwähnen die Hash-Tabelle, bei der es sich normalerweise (wenn nicht sogar unbedingt) um eine kurzlebige Datenstruktur handelt. Es scheint weniger offensichtlich, wie man eine gemeinsame Implementierungsstrategie anpassen kann, damit eine Hash-Tabelle dauerhaft ist. Beachten Sie, dass eine Hash-Tabelle häufig mit einem Array implementiert wird (insbesondere Arrays, die als kontinuierlicher Teil des Speichers implementiert sind). Arrays sind nett, da sie zufälligen Zugriff auf Elemente bieten. Dies ist eine wichtige Eigenschaft, die Sie idealerweise haben möchtenO ( 1 )durchschnittlicher Zugriff auf Elemente in der Hash-Tabelle. Aber Arrays sind nicht so schön, wenn es darum geht, persistente Datenstrukturen aufzubauen. Das Wesentliche dabei ist, dass Sie zwar einen unveränderlichen Array-Datentyp erstellen können, jedoch aufgrund der Art der Arrays das Risiko besteht, viel kopieren zu müssen. Wenn der oben genannte Listentyp mit Arrays implementiert würde, müssten Sie einen erstellen ganz neues Array mit fünf Elementen, anstatt einen Teil davon zu teilen. Und was ist, wenn Sie etwas in der Mitte des Arrays ändern möchten? Die naheliegendste - und scheinbar unvermeidliche - Antwort ist wiederum das Kopieren .
Persistente Datenstrukturen vermeiden im Allgemeinen nicht das Kopieren. Bestimmte Datenstrukturen machen das Kopieren jedoch weniger häufig. Dies ist eine wünschenswerte Eigenschaft, wenn Sie verlangen, dass eine Datenstruktur unveränderlich sein muss.