Parsing et de construction S-expressions à l'aide de jeux et arbre de recherche binaire

voix
1

C'est des devoirs pseudo (c'est un crédit supplémentaire). J'ai un BST qui est un index des mots qui pointent vers les lignes (stockées ailleurs) qui contiennent les mots. Je dois mettre en œuvre un moyen de recherche à l'aide s-expressions pour que je puisse combiner et (&) et ou (|).

À l'invite de commande un utilisateur peut taper quelque chose comme:

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

Pour l'essentiel qui devrait renvoyer toutes les lignes qui contiennent le feu des mots, la forêt et l'eau ainsi que toutes les lignes qui contiennent l'océan, le bateau et l'eau.

Ce que je vraiment besoin d'aide avec est la logique de l'analyse syntaxique et d'inserer des noeuds dans l'arbre pour représenter correctement l'expression plus que le code réel. La seule chose que j'ai travaillé que logique me renvoie un ensemble de lignes pour chaque mot dans l'expression. Ensuite, en fonction si elle est un « ou » ou « et » opération j'exécuterait une union ou une opération de type d'intersection sur ces ensembles pour créer un nouveau jeu et passer que sur l'arbre.

Je suis un peu perdu sur la façon d'analyser la ligne qui contient l'expression. Après réflexion, il semble que le « plus » sur l'un des sous-expressions est le plus élevé, il devrait être dans mon arbre de l'expression? Je pense que si je pouvais obtenir un coup de pouce dans la bonne direction dans la mesure où l'analyse syntaxique et l'insertion des expressions dans l'arbre, je devrais être OK.

Mon arbre échantillon que je suis venu avec pour la requête ressemble au-dessus de quelque chose comme;

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

Cela est logique que le feu retournerait un ensemble de lignes qui contiennent tous des incendies et de la forêt renverrait un ensemble de lignes qui contiennent toutes des forêts. Ensuite, au niveau « et » je prendrais ces deux ensembles et créer un autre ensemble qui ne contenait que les lignes qui étaient dans les deux ensembles me donnant ainsi un ensemble qui a seulement des lignes qui contiennent à la fois le feu et la forêt.

Mon autre pierre d'achoppement est la façon de représenter tout dans l'arbre après avoir surmonté l'obstacle de l'analyse syntaxique. J'ai une classe ExpTreeNode qui servira les nœuds pour mon ExpTree (BST), puis-je avoir 2 sous-classes, opérateur et opérande, mais je ne suis pas sûr que ce soit une bonne approche.

Créé 13/04/2011 à 18:11
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
4

Dijkstra a fait pour vous déjà :-)

Essayez l'algorithme de cour de triage: http://en.wikipedia.org/wiki/Shunting-yard_algorithm

Vous pouvez créer la RPN (notation polonaise inverse) en utilisant l'algorithme de cour de triage, et une fois qui est créé, vous pouvez faire une passe à travers elle pour créer l'arbre binaire.

Normalement, le RPN est utilisé pour faire l'évaluation, mais vous pouvez réellement créer un arbre.

Par exemple, au lieu d'évaluer, de créer des nœuds d'arbre et les pousser sur la pile.

Donc, si vous voyez node1, node2, opérateur. Vous créez un nouveau noeud

   Operator
   /     \
  node1   node2

et le pousser à nouveau sur la pile.

Un exemple plus détaillé:

Dire l'expression est (apples AND oranges) OR kiwis

RPN pour cela est kiwis oranges apples AND OR

Maintenant marcher ce tout en maintenant une pile.

Faire un nœud de pousser sur pile kiwis. Noeud sur les oranges pousser sur la pile. Même avec des pommes.

Ainsi, la pile est

Node:Apples
Node:Oranges
Node:Kiwis

Maintenant, vous voyez l'ET dans le RPN.

Vous pop les deux premiers de la pile et de créer un nouveau noeud avec et en tant que parent.

Noeud: ET, [Noeud: pommes, Noeud: Oranges]

essentiellement l'arbre

       AND
     /    \
  Apples  Oranges

Maintenant, poussez ce nœud sur pile.

Alors pile est

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

Maintenant, vous voyez le OU dans le RPN et créer un nœud avec OU en tant que parent et le nœud: Kiwis et nœud eT comme l'arbre enfants Aux

           OR 
         /   \
       AND   Kiwis
     /    \
  Apples  Oranges

Vous pourriez même être en mesure de modifier l'algorithme de cour pour créer shuntage l'arbre, mais face à la RPN semble plus facile.

Alternativement, vous pouvez essayer d'utiliser des techniques récursive Descente Parsing. Ce que vous demandez est très commun et vous serez en mesure de trouver le code et même grammaires, si vous recherchez le web.

Soit dit en passant, vous voulez dire juste arbre binaire? BST (Binary arbre de recherche) a une contrainte supplémentaire ...

Créé 13/04/2011 à 18:14
source utilisateur

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