Разбор и строительство S-выражения с использованием наборов и двоичного дерева поиска

голоса
1

Это псевдо домашнее задание (это дополнительный кредит). У меня BST, который является индекс слов, которые указывают на линии (хранящихся где-то еще), которые содержат слова. Мне нужно реализовать способ поиска с помощью S-выражений, так что я могу совмещать и (&) и или (|).

В командной строке пользователь может ввести что-то вроде:

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

По существу, который должен вернуть все строки, содержащие слова огня, лес и воду, а также все строки, содержащие океан, лодку и воду.

Что мне действительно нужна помощь с логика для разбора и вставки узлов в дерево, чтобы должным образом представить выражение больше, чем фактический код. Единственное, что я работал, что имеет смысл для меня возвращает набор строк для каждого слова в выражении. Тогда в зависимости от того если это «или» или «и» операции я бы выполнить объединение или операцию типа пересечения на этих наборах, чтобы создать новый набор и передать вверх по дереву.

Я бы потерял о том, как разобрать строку, содержащую выражение. После того, как некоторые думали, что кажется, что «дальше» из одного из суб-выражений, тем выше она должна быть в моем s-дерево выражения? Я думаю, что если бы я мог просто получить толчок в правильном направлении, насколько разборе и вставив выражения в дереве, я должен быть в порядке.

Мой образец дерево, которое я придумал для запроса выше выглядит примерно так;

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

Это имеет смысл, как огнь будет возвращать набор строк, которые содержат огнь и лес будет возвращать набор строк, которые содержат все лес. Тогда на «и» уровень я бы эти два набора и создать еще один набор, содержащий только те строки, которые были в обоих наборах, таким образом, давая мне набор, который имеет только строки, которые содержат как огонь и лес.

Мое другой камень преткновения в том, как представлять все в дереве после того, как я преодолеть препятствие разбора. У меня есть класс ExpTreeNode, который будет служить в качестве узлов для моего ExpTree (БСТ), а затем у меня есть 2 подклассов, оператор и операнд, но я не уверен, если это хороший подход.

Задан 13/04/2011 в 18:11
источник пользователем
На других языках...                            


1 ответов

голоса
4

Дейкстра сделал это для вас уже :-)

Попробуйте шунтирующий двор алгоритм: http://en.wikipedia.org/wiki/Shunting-yard_algorithm

Вы можете создать RPN (Reverse Polish Notation) с использованием алгоритма сортировочной станции, и как только будет создан, вы можете сделать проход через него, чтобы создать бинарное дерево.

Как правило, RPN используется, чтобы сделать оценку, но вы можете создать дерево.

Например, вместо того, чтобы оценивать, создавать узлы дерева и толкать их в стек.

Так что если вы видите NODE1, NODE2, оператор. Вы можете создать новый узел

   Operator
   /     \
  node1   node2

и вставьте его обратно в стек.

Более подробный пример:

Скажем, выражение (apples AND oranges) OR kiwis

Постфиксного для этого kiwis oranges apples AND OR

Теперь ходить это при сохранении стека.

Сделайте узел из киви нажать на стек. Узел из апельсинов нажать на стек. То же самое с яблоками.

Так Стек

Node:Apples
Node:Oranges
Node:Kiwis

Теперь вы видите и в Росприроднадзор.

Вы выскочить два верхних из стека и создать новый узел с AND в качестве родителя.

Узел: И, [Node: яблоки, Node: Апельсины]

в основном дерево

       AND
     /    \
  Apples  Oranges

Теперь нажмите этот узел на стек.

Так стек

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

Теперь вы видите, или в Росприроднадзоре и создать узел с OR в качестве родителя и Node: ånd и Node Киви, как дети, получающих дерево

           OR 
         /   \
       AND   Kiwis
     /    \
  Apples  Oranges

Вы могли бы даже быть в состоянии изменить алгоритм сортировочной станции, чтобы создать дерево, но дело с RPN кажется проще.

Кроме того, вы можете попробовать использовать методы рекурсивного разбора. То, что вы спросите очень часто, и вы сможете найти грамматики и код даже, если вы будете искать в Интернете.

Кстати, вы просто означать бинарное дерево право? BST (Binary Search Tree) имеет дополнительное ограничение ...

Ответил 13/04/2011 в 18:14
источник пользователем

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