El análisis y la construcción de S-expresiones utilizando conjuntos y el árbol de búsqueda binaria

votos
1

Esta es la tarea de pseudo (que es el crédito adicional). Tengo un BST, que es un índice de palabras que apuntan a las líneas (almacenados en otro lugar) que contienen las palabras. Tengo que poner en práctica una forma de buscar el uso de s-expresiones para que pueda combinar y (&) y o (|).

A la orden de solicitar a un usuario podría escribir algo como:

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

Esencialmente que debe devolver todas las líneas que contienen la palabra fuego, bosque y agua, así como todas las líneas que contienen océano, barco y el agua.

Lo que realmente necesita ayuda con la lógica para analizar y nodos de inserción en el árbol para representar adecuadamente la expresión más que el código real. La única cosa que he trabajado que tiene sentido para mí está devolviendo un conjunto de líneas para cada palabra en la expresión. A continuación, dependiendo de si se trata de una u o y operación de E sería realizar una operación de tipo de intersección o unión de estos conjuntos para crear un nuevo conjunto y pasar que en el árbol.

Soy un poco perdido sobre cómo analizar la línea que contiene la expresión. Después de pensarlo parece que el más fuera una de las sub-expresiones es la más alta que debería estar en mi árbol de s-expresión? Creo que si tan sólo pudiera conseguir un empuje en la dirección correcta por lo que el análisis y la inserción de las expresiones en el árbol que debería estar bien.

Mi árbol de ejemplo que se me ocurrió para la consulta anterior se ve algo como;

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

Esto tiene sentido ya que el fuego podría devolver un conjunto de líneas que contienen todos el fuego y el bosque devolvería un conjunto de líneas que contienen todos los bosques. A continuación, en la Y nivel me gustaría tener esos dos conjuntos y crear otro conjunto que contenía sólo las líneas que estaban en ambos conjuntos de mí, dando así un conjunto que sólo tiene líneas que contienen el fuego y el bosque.

Mi otro escollo es la forma de representar todo en el árbol después de superar el obstáculo del análisis sintáctico. Tengo una clase ExpTreeNode que servirá como los nodos para mi ExpTree (BST) y luego tengo 2 subclases, operador y operando, pero no estoy seguro si esto es un buen enfoque.

Publicado el 13/04/2011 a las 18:11
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
4

Dijkstra lo ha hecho por que ya :-)

Probar el algoritmo de playa de vías: http://en.wikipedia.org/wiki/Shunting-yard_algorithm

Puede crear la RPN (notación polaca inversa) utilizando el algoritmo playa de vías, y una vez que se crea, se puede hacer un pase a través de él para crear el árbol binario.

Normalmente, la RPN se utiliza para hacer la evaluación, pero en realidad se puede crear un árbol.

Por ejemplo, en lugar de evaluar, se crean los nodos del árbol y los empuja en la pila.

Así que si ves el nodo 1, el nodo 2, del operador. Se crea un nuevo nodo

   Operator
   /     \
  node1   node2

y empujar de nuevo en la pila.

Un ejemplo más detallado:

Dicen que la expresión es (apples AND oranges) OR kiwis

RPN para esto es kiwis oranges apples AND OR

Ahora camina ello manteniendo una pila.

Haga un nodo de kiwis de empuje contra la pila. Nodo de naranjas de empuje contra la pila. Lo mismo pasa con las manzanas.

Por lo que la pila es

Node:Apples
Node:Oranges
Node:Kiwis

Ahora se ve la Y en el RPN.

Usted hace estallar los dos superiores de la pila y crear un nuevo nodo con y como los padres.

Nodo: Y, [Node: Manzanas, Node: Naranjas]

básicamente el árbol

       AND
     /    \
  Apples  Oranges

Ahora empuje este nodo en la pila.

Así pila es

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

A continuación aparece el OR en la RPN y crear un nodo con O como padre y nodo: Y y kiwis nodo como los niños que consiguen el árbol

           OR 
         /   \
       AND   Kiwis
     /    \
  Apples  Oranges

Usted podría incluso ser capaz de modificar el algoritmo de playa de vías para crear el árbol, pero en relación con la RPN parece más fácil.

Alternativamente, puede intentar utilizar técnicas Analizador descendente recursivo. Lo que pides es muy común y usted será capaz de encontrar las gramáticas y el código aún, si usted busca en la web.

Por cierto, que acaba de decir la derecha del árbol binario? BST (árbol de búsqueda binaria) tiene una restricción adicional ...

Respondida el 13/04/2011 a las 18:14
fuente por usuario

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