Binärbaum Traversierung mit Endlichem Automat möglich? |
18.08.2016, 15:38 | Gulliveig | Auf diesen Beitrag antworten » | |||||
Binärbaum Traversierung mit Endlichem Automat möglich? nach nicht umweltgerechtem Befüllen des Papierkorbs mit Ansätzen in Kleinschrift auf A4 Papier trau ich mich mal die Frage ins Forum zu stellen: Gegeben sei ein Binärbaum mit internen und externen Nodes. Interne Nodes tragen keine Daten, sondern nur Verweise zu keinem, einem oder zwei Nachfolgern ("Links" und "Rechts"). Externe Nodes tragen neben den Verweisen zusätzlich Daten. Ziel ist es, einen beliebigen Teilbaum mittels eines finiten Automaten zu traversieren, und zwar pre-order, d.h. erst der Parent, dann das left child, dann das right child. Beispiel: Seit der Teilbaum gegeben mit:
Nach JEDER Ausgabe hält der Automat in einem bestimmten Zustand. Bei Fortsetzung soll dann der nächste externe Node ausgegeben werden, mit Wegen gemäss dem aktuellen Zustand. Weder eine rekursive noch eine iterative Lösung sind zulässig, da ich keinen variablen Speicher benutzen kann (Rekursiv: zur entweder zur Aufnahme der Funktion, iterativ: um mir die eingeschlagenen Richtungen zu merken). Ich dachte daher daran, einen endlichen Automaten zu entwerfen. Die Anzahl der FEST zugeordneten Variablen (Stati) ist beinahe nebensächlich, aber es darf kein DYNAMISCH wachsender Stack ins Spiel kommen. Ich habe erste Ergebnisse mit Zuständen wie LE (left exists), RE (right exists), IN (internal node), usw., scheitere aber regelmässig daran, die richtige Verzweigung "weiter oben" zu finden und nicht alles nochmal zu durchlaufen. Gibt es da irgendwo deutsch- oder englischsprachliche Literatur darüber? Bei Google finde ich nicht wirklich etwas brauchbares. Danke für euren Input! |
|||||||
18.08.2016, 16:30 | HAL 9000 | Auf diesen Beitrag antworten » | |||||
Kommt m.E. drauf an, in welcher Form der Datenbaum "zugänglich" ist: Wenn es an jedem Knoten neben den Pointern auf die left/right-children auch einen auf den parent gibt, dann ist es m.E. schon mit einem endlichen Automaten möglich, das Ding zu traversieren. Falls nicht, sehe ich auch keine Möglichkeit. Aber ich sehe das eher aus der praktischen Programmierersicht - theoretische Informatik ist nicht so mein Ding. |
|||||||
18.08.2016, 16:34 | Gulliveig | Auf diesen Beitrag antworten » | |||||
Ja, einen Parent haben die Nodes auch, sorry fürs Nichterwähnen. |
|||||||
18.08.2016, 17:08 | HAL 9000 | Auf diesen Beitrag antworten » | |||||
Müsste eigentlich einfach so gehen, im C-Code:
Zu ergänzen wäre noch Funktion print, die das Datum (falls ungleich 0) ausgibt, der Rest ist soweit lauffähig. |
|||||||
18.08.2016, 17:28 | Gulliveig | Auf diesen Beitrag antworten » | |||||
Hallo HAL (ich liebe den Namen). Danke für deinen Post und die Zeit, nur: das ist die iterative Lösung. Die englischsprachige Wiki hat einen sehr kompakten Pseudocode dazu. Ein finiter Automat kennt nicht wirklich Do...While Schleifen. Er weiss nur: ich bin bei Node B, und habe folgende Informationen (Zustände) aus vorangehenden Läufen: x, y, z... Daraus (und nur daraus) muss er das nächste Ereignis hervorbringen (und zwar genau nur eines, nämlich C). Dann hört der Automat auf zu arbeiten, nix mit Schleifen. Beim nächsten Aufruf weiss er: ich bin bei C, und habe folgende Zustände: x2, y2, z2, die sich aus dem vorangehenden Aufruf ergeben haben. |
|||||||
18.08.2016, 18:31 | HAL 9000 | Auf diesen Beitrag antworten » | |||||
Ich dachte, es kommt dir drauf an, dass nur endlich viele (d.h. von der Baumgröße unabhängig viele) Daten (Variablen+Stack) benötigt werden - und das erfüllt der Algorithmus. Na egal, viel Spaß noch bei der Suche - ist mir ein Rätsel, wie du das ohne Schleifen bewältigen willst.
Das ist m.E. Krümelkackerei: Die dauernde Aufruf-Wiederholung ist doch sowas wie eine Schleife. |
|||||||
Anzeige | |||||||
|
|||||||
18.08.2016, 20:50 | Gulliveig | Auf diesen Beitrag antworten » | |||||
Ja, wie gesagt, danke für die Zeit. Aber nein, keine Schleife, sorry für die Krümelkackerei, das ist nicht... Ach egal, wie üblich, 10000+ posts gewinnt über 1+ post: publish or perish. Endliche Automaten sind anders gewickelt als iterative oder rekursive Prozeduren, aber das schrieb ich ja im Eingangspost. Sie funktionieren wie in der deutschen Wiki ersichtlich unter: Endlicher Automat, oder besser in der englischen Wiki, unter Finite-state machine. PS: Würde mich aber dennoch über Antworten freuen, die finite Automaten zum Thema haben, obwohl ich nach 72+ Arbeitsstunden mittlerweile vermute, dass es keine theoretische Lösung geben KANN, weil es IMMER einen variablen Stack benötigt bei indefinitiv tiefen Binärbäumen (?) - und deshalb wahrscheinlich auch die mangelnde Trefferquoute bei Google. Einen Beweis zu erbringen dürfte länger dauern (es sei denn es gäbe bereits einen?). Viele Grüsse (, und sorry, HAL, keine Probleme, ich hab mich wahrscheinlich einfach nicht genau genug ausgedrückt.) |
|||||||
18.08.2016, 21:53 | HAL 9000 | Auf diesen Beitrag antworten » | |||||
Nun ja, meine Lösung oben funktioniert für indefinitiv tiefen Binärbäume nur deswegen nicht, weil irgendwann mal Pointer fester Speichergröße eine riesige Knotenzahl nicht mehr addressieren kann. Aber dieses Problem hast du bei jedem solchen Algorithmus - ja, bereits die Speicherung der Baumes ist davon betroffen, dass man bei immer größer werdenen Bäumen diese "left,right,parent"-Pointer in ihrer Speichergröße reorganisieren muss. Vielleicht versuchst du es mal im Informatikerboard, da besteht vielleicht mehr Verständnis für dein Anliegen. Und so einen Müll wie den hier
unterlässt du da besser: Die wenigen beleidigen, die sich überhaupt mit deinem Anliegen auseinandersetzen, ist nicht gerade feiner Stil. |
|
Verwandte Themen
Die Beliebtesten » |
|
Die Größten » |
|
Die Neuesten » |