Parsing og bygnings S-uttrykk ved hjelp av Stiller og binært søketre

stemmer
0

Dette er pseudo lekser (det er ekstra kreditt). Jeg har en BST som er en indeks over ord som peker til de linjene (lagret et annet sted) som inneholder ordene. Jeg trenger å implementere en måte å søke med S-uttrykk slik at jeg kan kombinere og (&) og eller (|).

Ved ledeteksten en bruker kan skrive noe sånt som:

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

Hovedsak at skal returnere alle linjer som inneholder ordene brann, skog og vann, samt alle linjer som inneholder hav, båt og vann.

Det jeg virkelig trenger hjelp med er logikken for parsing og sette inn noder i treet du skal representere uttrykket mer enn selve koden. Det eneste jeg har jobbet ut som er fornuftig for meg returnerer et sett med linjer for hvert ord i uttrykket. Så avhengig av om det er en eller eller og operasjon jeg ville utføre en forening eller kryss typen operasjon på disse settene for å opprette et nytt sett og pass på at den opp i treet.

Jeg slags tapt på hvordan å analysere linjen som inneholder uttrykket. Etter noen trodde det ser ut til at lenger ut en av de sub-uttrykkene er det høyeste det skal være i min s-uttrykk treet? Jeg tror at hvis jeg bare kunne få en dytt i riktig retning så langt som parsing og sette inn uttrykkene i treet jeg burde være OK.

Min prøve tre som jeg kom opp med for spørringen ovenfor ser omtrent slik ut;

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

Dette er fornuftig som ild vil returnere et sett med linjer som alle inneholder brann og skogen vil returnere et sett med linjer som alle inneholder skogen. Så på & nivå jeg ville ta de to sett og opprette et nytt sett som inneholdt bare de linjene som var i begge settene og dermed gi meg et sett som bare har linjer som inneholder både brann og skog.

Min andre snublestein er hvordan man skal representere alt i treet etter at jeg overvinne hinder for parsing. Jeg har en ExpTreeNode klasse som vil tjene som nodene for min ExpTree (BST) og da har jeg 2 underklasser, operatør og operand, men jeg er ikke sikker på om dette er en god tilnærming.

Publisert på 13/04/2011 klokken 17:11
kilden bruker
På andre språk...                            


1 svar

stemmer
4

Dijkstra har gjort det for deg allerede :-)

Prøv skiftestasjon algoritme: http://en.wikipedia.org/wiki/Shunting-yard_algorithm

Du kan opprette RPN (omvendt polsk notasjon) med skiftestasjon algoritmen, og når det er opprettet, kan du lage et pass gjennom det å skape den binære treet.

Normalt er RPN pleide å gjøre evalueringen, men du kan faktisk lage et tre.

For eksempel, i stedet for å evaluere, oppretter man tre noder og skyve dem inn på stabelen.

Så hvis du ser node1, node2, operatør. Du oppretter en ny node

   Operator
   /     \
  node1   node2

og skyver den tilbake på stabelen.

En mer detaljert eksempel:

Si uttrykket er (apples AND oranges) OR kiwis

RPN for dette er kiwis oranges apples AND OR

Nå går dette og samtidig opprettholde en stabel.

Lag en node ut av kiwi presse på stakken. Node ut av appelsiner trykk på stabelen. Samme med epler.

Så Stabelen er

Node:Apples
Node:Oranges
Node:Kiwis

Nå ser du det og i RPN.

Du pop de to øverste fra bunken og opprette en ny node med OG som forelder.

Node: AND, [node: epler, node: Appelsiner]

utgangspunktet treet

       AND
     /    \
  Apples  Oranges

Deretter skyver denne noden på stabelen.

Så stack er

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

Nå ser du det eller i RPN og opprette en node med eller som foreldre og Node: AND og Node Kiwis som barn får treet

           OR 
         /   \
       AND   Kiwis
     /    \
  Apples  Oranges

Du kan selv være i stand til å endre skiftestasjon algoritme for å skape treet, men arbeider med RPN virker lettere.

Alternativt kan du prøve å bruke Recursive Descent Analyse teknikker. Det du ber om er veldig vanlig, og du vil være i stand til å finne grammatikker og kode selv, hvis du søker på nettet.

Forresten, du bare mener Binary treet rett? BST (binært søketre) har en ekstra begrensning ...

Svarte 13/04/2011 kl. 17:14
kilden bruker

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