Die bisher verwendete Python Listen sind sehr einfach zu bedienen. Allerdings verschleiern sie die zu Grunde liegende Datenstruktur.
Bei einer Python Liste handelt es sich um ein dynamisches Array. Ein Array ist eine Datenstruktur, bei der im Voraus ein zusammenhängender Speicherbereich von fixer Grösse definiert wird. Bei einem dynamischen Array fällt die Restriktion der fixierten Grösse weg und dem Speicherplatz wird laufend den Bedürfnissen angepasst. Die Anpassung der Grösse des Speicherbereichs ist allerdings mit erheblichem Rechenaufwand verbunden. Diesem Nachteil steht allerdings der Vorteil gegenüber, dass in einem Array mittels des Index mit konstantem Aufwand auf die einzelnen Elemente zugegriffen werden kann. Falls das Array sortiert ist, kann ausserdem relativ effizient nach einem Element in dieser Datenstruktur gesucht werden.
Eine Alternative für das Ablegen einer Sequenz von Elementen mit nicht im Voraus bestimmten Umfang, ist eine verkettete Liste (linked list).
Die verkettete Liste (linked list) ist eine Datenstruktur, bei der mit einer Variabel auf das erste gespeicherte Element verwiesen wird. Zusammen mit diesem Element wird auch der Speicherort des nächsten Elementes gespeichert. Von dieser Verkettung von Element zu Element hat die Datenstruktur ihren Namen. In einer verketteten Liste lassen sich neue Elemente mit konstantem Aufwand einfügen. Allerdings hat die verkettete Liste den Nachteil, dass die Suche nach einem Element mit linearem Aufwand verbunden ist.
An dieser Stelle kommt der binäre Suchbaum (binary search tree, bst) ins Spiel.
Bäume in der Informatik
Quelle: xkcd.com/835, besucht am 4. Mai 24
Ein Baum in der Informatik ist eine Datenstruktur die aus Knoten (engl. Vertex bzw. vertices, V) und Kanten (engl. edge, E) besteht. Der erste Knoten ist die Wurzel (engl. root). Alle anderen Knoten haben einen Knoten als Elternknoten. Ein Elternknoten kann ein oder mehrere Kindknoten haben. Ein Knoten ohne Kinder wird als Blatt bezeichnet. Üblicherweise werden Bäume vom Wurzelknoten aus nach unten dargestellt.
Ein binärer Suchbaum ist eine baumförmige Datenstruktur, bei der jeder Knoten ein oder zwei Kinder hat. Die Werte in den Knoten sind dabei so in den Baum eingeordnet, dass jedes linke Kind kleiner ist als der Elternknoten und jedes rechte Kind grösser. Im Idealfall ist der Baum symmetrisch ausbalanciert. Es kann allerdings auch sein, dass ein binärer Suchbaum derart aus dem Gleichgewicht ist, dass er wie eine verkettete Liste aussieht. Aus diesem Grund muss bei der Effizienzbetrachtung dieser Datenstruktur zwischen Idealfall und Worst Case unterschieden werden. Im Idealfall ist die Suche und das Einfügen neuer Elemente mit einem Aufwand von \(log(n)\) möglich. Im Worst Case verursacht die Suche einen linearen Aufwand.
Die folgende Grafik zeigt ein Beispiel eines binären Suchbaums.