Parsowanie i budowlane S-wyrażeń wykorzystaniem zbiorów i binarne drzewo poszukiwań

głosy
1

Jest to pseudo praca domowa (to dodatkowy kredyt). Mam BST który jest indeksem słów, które wskazują na linii (przechowywanych gdzie indziej), które zawierają słowa. Trzeba zaimplementować sposób wyszukiwać za pomocą s-wyrażeń więc mogę łączyć i (&) i albo (|).

W wierszu polecenia użytkownik może wpisać coś takiego:

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

W istocie, że powinien zwrócić wszystkie wiersze zawierające słowa ogień, las i woda, jak również wszystkie wiersze zawierające ocean, łodzi i wody.

Co ja naprawdę potrzebują pomocy ze jest logika za parsowanie i wstawianie węzłów do drzewa, aby właściwie reprezentować ekspresję więcej niż rzeczywisty kod. Jedyną rzeczą, jaką wypracowaliśmy że sens mnie wraca zbiór wierszy dla każdego słowa w wyrażeniu. Następnie w zależności czy jest to „albo” lub „i” Operacja Chciałbym wykonać unii lub operację typu skrzyżowanie tych zestawów, aby utworzyć nowy zestaw i przekazać, że się na drzewie.

Jestem rodzaj utracone, w jaki sposób zanalizować wiersz, który zawiera wyraz. Po namyśle wydaje się, że „dalej” na jednej z podrzędnych wyrażeń jest wyższa powinna być w moim drzewie s-wyrażenie? Myślę, że gdybym mógł po prostu push we właściwym kierunku w miarę analizowania i wstawienie wyrażenia w drzewo powinno być OK.

Moja próbka drzewo, które wymyśliłem dla zapytania powyżej wyglądać;

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

Ma to sens, jak ogień zwróci zestaw wierszy, które zawierają wszystko ogniem i las zwróci zestaw wierszy, które zawierają cały las. Następnie na „&” Poziom wziąłbym te dwa zestawy i stworzyć inny zestaw, który zawierał tylko te linie, które były w obu zestawach samym dając mi zestaw, który ma tylko linie, które zawierają zarówno ogień i las.

Mój inny przeszkodą jest to, jak do reprezentowania wszystko w drzewie po tym, jak przezwyciężyć przeszkody parsowania. Mam klasy ExpTreeNode, która będzie służyć jako węzłów dla mojego ExpTree (BST) i wtedy mam 2 podklasy, operator i argument, ale nie jestem pewien, czy jest to dobre podejście.

Utwórz 13/04/2011 o 18:11
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
4

Dijkstra zrobił to dla ciebie już :-)

Spróbuj algorytmu stoczni manewrowy: http://en.wikipedia.org/wiki/Shunting-yard_algorithm

Można utworzyć RPN (Odwrotna Notacja Polska) przy użyciu algorytmu stoczni manewrowe, a raz, że jest tworzony, można złożyć podanie przez to stworzyć drzewo binarne.

Normalnie RPN służy do wykonania oceny, ale rzeczywiście można utworzyć drzewo.

Na przykład, zamiast oceniać, tworzyć węzły drzewa i wcisnąć je na stos.

Więc jeśli widzisz node1 Node2, operator. Utworzyć nowy węzeł

   Operator
   /     \
  node1   node2

i wsunąć go z powrotem na stos.

Bardziej szczegółowy przykład:

Powiedzieć, że wyrażenie jest (apples AND oranges) OR kiwis

THe RPN jest to, kiwis oranges apples AND OR

Teraz chodzić to utrzymując stos.

Zrób węzeł z kiwi naciskać na stosie. Węzeł z pomarańczy naciskać na stosie. To samo z jabłek.

Stos jest więc

Node:Apples
Node:Oranges
Node:Kiwis

Teraz widzisz aw RPN.

Pop dwa górne ze stosu i utworzyć nowy węzeł z I jako rodzic.

Węzeł: I [Gałąź: jabłka, węzeł: Pomarańcze]

zasadzie drzewo

       AND
     /    \
  Apples  Oranges

Teraz naciśnij ten węzeł na stosie.

Więc stos jest

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

Teraz widzisz OR w RPN i utworzyć węzeł z lub jako rodzic i Node: a i kiwi węzła jako dzieci coraz drzewo

           OR 
         /   \
       AND   Kiwis
     /    \
  Apples  Oranges

może nawet być w stanie zmodyfikować algorytm stoczni manewrowych, aby utworzyć drzewo, ale do czynienia z RPN wydaje się łatwiejsze.

Alternatywnie, można spróbować przy użyciu technik Zejście rekurencyjne parsowania. Co pytasz jest bardzo powszechne i będzie można znaleźć gramatyk i kodu nawet, jeśli szukać w internecie.

Nawiasem mówiąc, po prostu oznaczać drzewo binarne prawo? BST (Binary Search Tree) ma dodatkowy ograniczenie ...

Odpowiedział 13/04/2011 o 18:14
źródło użytkownik

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