L'analisi e la costruzione S-espressioni utilizzando Scene e albero binario di ricerca

voti
1

Si tratta di compiti a casa pseudo (è di credito extra). Ho un BST, che è un indice di parole che indicano le linee (memorizzati da qualche altra parte) che contengono le parole. Ho bisogno di implementare un modo per cercare utilizzando S-espressioni in modo da poter combinare e (e) eo (|).

Al prompt dei comandi di un utente potrebbe digitare qualcosa del tipo:

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

In sostanza, che dovrebbe restituire tutte le righe che contengono le parole di fuoco, foresta e acqua così come tutte le righe che contengono oceano, barca e l'acqua.

Quello che ho davvero bisogno di aiuto con la logica per l'analisi e nodi inserimento nella struttura di rappresentare correttamente l'espressione più che il codice vero e proprio. L'unica cosa che ho lavorato che ha senso per me restituisce un insieme di linee per ogni parola nell'espressione. Poi, a seconda se si tratta di un o o e operazione vorrei eseguire un sindacato o tipo di operazione di intersezione su quei set per creare un nuovo set e passare che su l'albero.

Sto tipo di Lost su come analizzare la riga che contiene l'espressione. Dopo alcuni pensavano sembra che il più fuori uno dei sotto-espressioni è la più alta che dovrebbe essere nel mio albero s-espressione? Penso che se potessi ottenere una spinta nella giusta direzione per quanto riguarda l'analisi e l'inserimento delle espressioni nell'albero dovrei essere OK.

Il mio albero di esempio che mi è venuta per la query di cui sopra sembra qualcosa di simile;

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

Questo ha senso come il fuoco sarebbe tornato un insieme di linee che contengono tutti il ​​fuoco e la foresta sarebbe restituire un insieme di linee che contengono tutti foresta. Poi alla & livello Vorrei prendere quei due set e creare un altro set che conteneva solo le linee che erano in entrambi i set me dando così una serie che ha solo le linee che contengono sia il fuoco e la foresta.

Il mio altro ostacolo è come rappresentare tutto l'albero dopo supero l'ostacolo di parsing. Ho una classe ExpTreeNode che servirà come i nodi per il mio ExpTree (BST) e poi ho 2 sottoclassi, operatore e operando, ma non sono sicuro se questo è un buon approccio.

È pubblicato 13/04/2011 alle 18:11
fonte dall'utente
In altre lingue...                            


1 risposte

voti
4

Dijkstra ha fatto per voi già :-)

Provate l'algoritmo di smistamento: http://en.wikipedia.org/wiki/Shunting-yard_algorithm

È possibile creare il RPN (notazione polacca inversa) utilizzando l'algoritmo fascio di smistamento, e una volta che si crea, si può fare un passaggio attraverso di esso per creare l'albero binario.

Normalmente, il RPN è usato per fare la valutazione, ma si può effettivamente creare un albero.

Per esempio, invece di valutare, di creare nodi della struttura e spingerli nello stack.

Quindi, se si vede node1, node2, operatore. Si crea un nuovo nodo

   Operator
   /     \
  node1   node2

e spingerlo indietro nello stack.

Un esempio più dettagliato:

Dire l'espressione è (apples AND oranges) OR kiwis

RPN di questo è kiwis oranges apples AND OR

Ora, a piedi questo, pur mantenendo una pila.

Fare un nodo di kiwi spingere sulla pila. Nodo di arance spingere sulla pila. Stessa cosa con le mele.

Così Lo stack è

Node:Apples
Node:Oranges
Node:Kiwis

Ora si vede la E nel RPN.

Si pop le prime due dalla pila e creare un nuovo nodo con E come genitore.

Node: E, [Nodo: Mele, Node: arance]

fondamentalmente l'albero

       AND
     /    \
  Apples  Oranges

Ora spingere questo nodo nella stack.

Così stack è

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

Ora si vede l'OR nel RPN e creare un nodo con O come genitore e Nodo: ed e Nodo kiwi come i bambini che ottengono l'albero

           OR 
         /   \
       AND   Kiwis
     /    \
  Apples  Oranges

Si potrebbe anche essere in grado di modificare l'algoritmo di smistamento per creare l'albero, ma trattare con il RPN sembra più facile.

In alternativa, si può provare a utilizzare tecniche di ricorsiva Descent analisi. Quello che si chiede è molto comune e si sarà in grado di trovare grammatiche e codice, anche, se si cerca sul web.

Tra l'altro, è sufficiente dire albero binario giusto? BST (Binary Search Tree) ha un vincolo in più ...

Risposto il 13/04/2011 a 18:14
fonte dall'utente

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