Parsing und Gebäude S-Expressions-Sets und binären Suchbaum mit

stimmen
1

Dies ist Pseudo-Hausaufgaben (es ist zusätzliche Kredite). Ich habe ein BST bekam die ein Index von Wörtern, die zu den Linien Punkt (woanders gespeichert), die die Wörter enthalten. Ich muß einen Weg zur Umsetzung mit s-Ausdrücke zu suchen, so kann ich kombinieren und (&) und oder (|).

Am Befehl einen Benutzer dazu auffordern, könnte so etwas wie ein:

QUERY ((((fire)&(forest))|((ocean)&(boat)))&(water))

das sollte alle Zeilen zurück, die die Worte Feuer, Wald und Wasser sowie alle Linien enthält, Ozean, Boot und Wasser im Wesentlichen enthalten.

Was ich wirklich brauche Hilfe bei der die Logik für das Parsen und Einfügen von Knoten in den Baum richtig den Ausdruck mehr als der eigentliche Code zu repräsentieren. Das einzige, was ich habe, dass gearbeitet macht Sinn für mich ist eine Reihe von Linien für jedes Wort in dem Ausdruck zurück. Dann je nachdem, ob es eine „oder“ oder „und“ Operation ich auf diesen Sätzen eine Vereinigung oder Kreuzungsart Operation durchführen würde einen neuen Satz zu erstellen und auf den Baum weiter.

Ich bin ein bisschen verloren, wie die Linie zu analysieren, die den Ausdruck enthält. Nachdem einige dachten, es scheint, dass die „weiter“ aus einer der Unterausdrücke desto höher ist es in meinem s-Ausdrucksbaum sein sollte? Ich denke, wenn ich nur einen Schub in der richtigen Richtung, so weit wie das Parsen und Einsetzen die Ausdrücke in dem Baum bekommen könnte, dass ich in Ordnung sein.

Mein Beispiel Baum, kam ich mit für die Abfrage oben sieht ungefähr so ​​aus;

                                            &
                                         /     \
                                       |       water
                                   /      \
                                 &          &
                               /   \        /   \
                            fire  forest  ocean boat

Dies macht Sinn, wie Feuer eine Reihe von Linien zurückkehren würde, dass alle Feuer und Wald enthalten würde eine Reihe von Zeilen zurück, die alle Wälder enthalten. Dann auf die „&“ Ebene würde ich diese beiden Sätze nehmen und einen anderen Satz erstellen, die nur die Linien enthalten, die somit in beiden Sätzen waren mir eine Menge geben, die nur Linien hat, die sowohl Feuer und Wald enthalten.

Mein anderer Stolperstein ist, wie alles im Baum darzustellen, nachdem ich die Hürde des Parsing überwinden. Ich habe eine ExpTreeNode Klasse, die als Knoten für meine ExpTree dienen (die BST) und dann habe ich zwei Subklassen, Operator und Operanden, aber ich bin nicht sicher, ob dies ein guter Ansatz ist.

Veröffentlicht am 13/04/2011 um 18:11
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
4

Dijkstra hat es für Sie bereits getan :-)

Versuchen Sie, den Rangierbahnhof Algorithmus: http://en.wikipedia.org/wiki/Shunting-yard_algorithm

Sie können die RPN (Reverse Polish Notation) mit dem Rangierbahnhof Algorithmus erstellen, und sobald das erstellt wird, können Sie einen Pass machen durch den binären Baum zu erstellen.

Normalerweise wird die RPN verwendet, um die Bewertung zu tun, aber man kann tatsächlich einen Baum erstellen.

Zum Beispiel, Sie statt Auswertung Baumknoten erstellen und sie auf den Stapel schieben.

Also, wenn Sie sehen node1, Knoten2, Betreiber. Sie erstellen einen neuen Knoten

   Operator
   /     \
  node1   node2

und schiebt ihn zurück auf den Stapel.

Ein detaillierteres Beispiel:

Sagen Sie den Ausdruck (apples AND oranges) OR kiwis

RPN hierfür ist, kiwis oranges apples AND OR

Nun sind diese gehen, während ein Stapel zu halten.

Machen Sie einen Knoten aus Kiwis auf den Stapel schieben. Knoten aus Orangen drücken auf den Stapel. Das Gleiche gilt für Äpfel.

So Der Stapel ist

Node:Apples
Node:Oranges
Node:Kiwis

Nun sehen Sie die und in der RPN.

Sie knallen die beiden Besten aus dem Stapel und einen neuen Knoten mit und als Eltern erstellen.

Knoten: AND, [Knoten: Äpfel, Knoten: Orangen]

im Grunde der Baum

       AND
     /    \
  Apples  Oranges

Schieben Sie nun diesen Knoten auf den Stapel.

So Stack

Node:AND, [Node:Apples, Node:Oranges]
Node:Kiwis

Jetzt können Sie die OR in der RPN sehen und einen Knoten mit einem oder als Elternteil und Knoten erstellen: UNd und Knoten Kiwis als Kinder den Baum bekommen

           OR 
         /   \
       AND   Kiwis
     /    \
  Apples  Oranges

Man könnte sogar den Rangierbahnhof Algorithmus ändern kann, um den Baum zu erstellen, aber mit dem RPN zu tun scheint einfacher.

Alternativ können Sie versuchen Recursive Descent Parsing-Techniken. Was Sie bitten, ist sehr verbreitet, und Sie werden in der Lage, auch Grammatiken und Code zu finden, wenn Sie das Web durchsuchen.

By the way, so dass Sie in Binary Baum richtig? BST (binärer Suchbaum) hat eine zusätzliche Einschränkung ...

Beantwortet am 13/04/2011 um 18:14
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more