Parsing și construcții S-expresii folosind seturi și arbore binar de căutare

voturi
1

Aceasta este tema pseudo (e extra credit). Am o BST, care este un index de cuvinte care indică liniile (stocate în altă parte), care conțin cuvintele. Am nevoie să pună în aplicare un mod de a căuta utilizând s-expresii, astfel că pot combina și (&) și sau (|).

La comanda solicita un utilizator ar putea tip ceva de genul:

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

În esență, că ar trebui să se întoarcă toate liniile care conțin cuvintele foc, pădurea și apă precum și toate liniile care conțin ocean, barcă și apă.

Ceea ce într-adevăr nevoie de ajutor cu logica este necesară pentru analizarea și nodurile fi introduse în copac pentru a reprezenta în mod corespunzător expresia mai mult decât codul actual. Singurul lucru pe care l-am elaborat care are sens pentru mine returnează un set de linii pentru fiecare cuvânt în expresie. Apoi, în funcție de cazul în care este un „sau“ sau „și“ operațiune mi-ar realiza o uniune sau operațiune de tip intersecție pe aceste seturi pentru a crea un set nou și să treacă pe care copacul.

Sunt un fel de pierdut cu privire la modul de a analiza linia care conține expresia. După unele crezut, se pare că „mai departe“, unul dintre sub-expresii este cea mai mare ar trebui să fie în copacul meu s-exprimare? Cred că dacă aș putea obține doar un impuls în direcția corectă în ceea ce privește analiza și inserarea expresiile în arborele ar trebui să fie OK.

copacul meu probă că am venit cu pentru interogarea de mai sus arata ceva de genul;

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

Acest lucru are sens ca focul se va întoarce un set de linii care conțin toate foc și pădurilor va returna un set de linii care conțin toate pădure. Apoi, la „&“ nivelul I ar lua cele două seturi și de a crea un alt set care conținea numai liniile care au fost în ambele seturi oferindu-mi astfel un set care are doar linii care conțin atât foc și de pădure.

alt bloc de poticnire mea este cum să reprezinte totul în copac după ce am depășit obstacolul parsare. Am o clasă de ExpTreeNode care va servi ca nodurile pentru ExpTree mea (BST) și apoi am 2 subclase, operatorul și operand, dar nu sunt sigur dacă acest lucru este o bună abordare.

Întrebat 13/04/2011 la 18:11
sursa de către utilizator
În alte limbi...                            


1 răspunsuri

voturi
4

Dijkstra a făcut-o pentru tine deja :-)

Încercați algoritmul triajul: http://en.wikipedia.org/wiki/Shunting-yard_algorithm

Puteți crea RPN (inversa notația poloneză) folosind algoritmul triaj, și o dată care este creat, puteți face o trecere prin ea pentru a crea arborele binar.

În mod normal, RPN este utilizat pentru a face evaluarea, dar puteți crea de fapt un copac.

De exemplu, în loc de evaluare, creați noduri de arbore și împingeți-le pe stiva.

Deci, dacă vedeți node1, node2, operatorul. Puteți crea un nou nod

   Operator
   /     \
  node1   node2

și-l împinge înapoi pe stivă.

Un exemplu mai detaliat:

Spun expresia este (apples AND oranges) OR kiwis

THe RPN pentru acest lucru este kiwis oranges apples AND OR

Acum, plimbare acest lucru menținând în același timp o stivă.

Asigurați-un nod din stivă împinge spre kiwis. Nod de portocale împinge pe stivă. La fel cu mere.

Deci, stiva este

Node:Apples
Node:Oranges
Node:Kiwis

Acum poți vedea și în RPN.

Pop primele două din stivă și de a crea un nod nou cu și, ca părinte.

Nod: SI, [nod: Mere, Node: Portocale]

practic copac

       AND
     /    \
  Apples  Oranges

Acum împinge acest nod pe stivă.

Deci, stiva este

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

Acum poți vedea sau în RPN și de a crea un nod cu sau ca părinte și Node: AND și Node ca Kiwis copii obtinerea copac

           OR 
         /   \
       AND   Kiwis
     /    \
  Apples  Oranges

S-ar putea fi chiar posibilitatea de a modifica algoritmul de triaj pentru a crea copac, dar care se ocupă cu RPN pare mai ușor.

Alternativ, puteți încerca să utilizați tehnici recursive Descent Parsarea. Ce vă întreb este foarte comună și va fi capabil să găsească gramatici și codul chiar, dacă veți căuta pe web.

Apropo, trebuie doar să spui drept arbore binar? BST (binar de căutare copac) are o constrângere suplimentară ...

Publicat 13/04/2011 la 18:14
sursa de către utilizator

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