Ein Kollege, der an der genetischen Programmierung arbeitet, hat mir die folgende Frage gestellt. Ich habe zuerst versucht, es auf der Grundlage eines gierigen Ansatzes zu lösen, aber bei einem zweiten Gedanken fand ich ein Gegenbeispiel zum gierigen Algorithmus. Also, ich dachte, es lohnt sich hier zu erwähnen.
Betrachten Sie zwei Polynome, die durch ihre Ausdrucksbäume dargestellt werden. Zum Beispiel sind unten und dargestellt:
Regeln:
- Jeder Knoten ist entweder ein Variablenname ( ), eine Zahl oder eine Operation (+, -, ×).
- Das Durchlaufen des Baums in der richtigen Reihenfolge sollte zu einem gültigen Polynom führen.
- Operationsknoten haben In-Grad 2. Andere Knoten haben In-Grad 0. Alle Knoten haben Out-Grad 1 (außer Root, dessen Out-Grad 0 ist).
Definieren Sie auf einem Knoten N des Baums die Grundoperation wie folgt:
- Eine grundlegende Operation kann die Bezeichnung des Knotens ändern. Beispielsweise kann in 3 geändert werden, oder + kann in geändert werden .
- Eine grundlegende Operation kann einen Ausdrucksbaum über N erstellen (siehe das folgende Beispiel).
Die Kosten für die Grundoperation vom Typ 1 betragen 1. Die Kosten für Typ 2 entsprechen der Anzahl von {+, -, ×} Operationen im neu erstellten Ausdrucksbaum.
Beispiel für Typ 2: Die Kosten der folgenden Grundoperation betragen 2, da der Ausdrucksbaum, der auf Knoten N aufgebaut ist, zwei Operationen (- und ×) verwendet.
Sei T1 und T2 zwei Ausdrucksbäume, die Polynome darstellen. Definieren Sie den Abstand von T1 und T2 wie folgt: Die Mindestkosten für grundlegende Operationen zur Konvertierung von T1 in T2. Beachten Sie, dass der konvertierte Baum nicht dieselbe Struktur wie T2 haben muss. Wir wollen nur, dass es dasselbe Polynom wie T2 berechnet. (Siehe die Kommentare für ein Beispiel.)
Das Problem: Geben Sie für T1 und T2 einen Algorithmus an, der ihre Entfernung berechnet.
Beispiel 1: T1 und T2 seien die beiden am Anfang dieses Beitrags abgebildeten Bäume. Um den rechten Baum in den linken Baum umzuwandeln, kann man einen Baum mit den Kosten 3 über × erstellen und 4 in 1 ändern (die Gesamtkosten betragen 4).
Antworten:
Die Baumbearbeitungsentfernung ist eine Verallgemeinerung der Zeichenfolgenbearbeitungsentfernung. Der Abstand zwischen zwei Bäumen ist die minimale Anzahl von Knoteneinfügungen, -löschungen und -neuetiketten, die erforderlich sind, um einen Baum in den anderen zu verwandeln. (Wenn wir Knoten v löschen, werden die Kinder von v zu Kindern von Eltern (v)). Das Problem ist NP-schwer, wenn die Bäume ungeordnet sind, aber wenn sie geordnet sind (dh es gibt eine Reihenfolge von links nach rechts unter den Geschwistern), ist das Problem in O (n ^ 3) Zeit lösbar (wie in dem Papier darüber) Sadeq erwähnt). Eine gute Umfrage, die dies beschreibt: http://portal.acm.org/citation.cfm?id=1085283
quelle