Analýzu a stavební S-výrazy používají Sady a strom binárního vyhledávání

hlasů
1

To je pseudo domácí (je to kreditu navíc). Mám BST což je index slov, které ukazují na tratích (uložené někde jinde), které obsahují slova. Potřebuji implementovat způsob, jak vyhledávat pomocí S-výrazy, takže mohu kombinovat a (a) a nebo (|).

Na příkazovém řádku si uživatel mohl zadat něco jako:

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

Zásadě, že by se měly vrátit všechny řádky, které obsahují slova oheň, lesní a vodní, jakož i všechny řádky, které obsahují oceán, loď a vodu.

To, co jsem opravdu potřebují pomoc s je logika pro analýzu a vkládání uzlů do stromu správně reprezentovat výraz více než skutečný kód. Jediná věc, kterou jsem pracoval na to, že má smysl, aby mi vrací sadu řádků pro každé slovo ve výrazu. Pak v závislosti na tom, zda se jedná o „nebo“ nebo „a“ Provoz bych provést unii nebo operace typu křižovatka v těchto souborech vytvořit novou sadu a předat že dále až do stromu.

Jsem trochu ztratil na tom, jak analyzovat řádek, který obsahuje výraz. Poté, co někteří si mysleli, zdá se, že „dále“ se jeden z dílčích projevů je tím vyšší by měl být podle mého s expresí stromu? Myslím, že kdybych mohl dostat push správným směrem, pokud jde o analýzu a vkládání výrazů do stromu bych měl být v pořádku.

Můj vzorek strom, který jsem přišel s pro výše uvedené dotaz vypadá podobně jako;

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

To dává smysl, protože oheň se vrátí sadu řádků, které všechny obsahují oheň a lesy by se vrátil sadu řádků, které všechny obsahují les. Pak na „&“ level bych, aby tyto dva soubory a vytvořit další sadu, která obsahovala pouze řádky, které byly v obou sadách tím, že mi sadu, která má pouze řádky, které obsahují jak oheň a les.

Moje další kámen úrazu, jak reprezentovat vše ve stromu poté, co jsem překonat překážku rozebrat. Mám třídu ExpTreeNode, který bude sloužit jako uzly pro můj ExpTree (BST), a pak mám 2 podtřídy, operátory a operandy, ale nejsem si jistý, jestli je to dobrý přístup.

Položena 13/04/2011 v 18:11
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
4

Dijkstra to udělal za vás již :-)

Zkuste algoritmus yard posunovací: http://en.wikipedia.org/wiki/Shunting-yard_algorithm

Můžete vytvořit RPN (reverzní polská notace) s použitím shunting-yard, a jakmile je vytvořen, můžete si projít k vytvoření binárního stromu.

Za normálních okolností je RPN se používá k tomu hodnocení, ale můžete skutečně vytvořit strom.

Například, namísto hodnocení, vytvářet uzly stromu a tlačit je do zásobníku.

Takže pokud uvidíte UZEL1 NODE2 operátora. Je-li vytvořit nový uzel

   Operator
   /     \
  node1   node2

a zatlačte jej zpět do zásobníku.

Podrobnější příklad:

Řekněme, že je výraz (apples AND oranges) OR kiwis

THe RPN je to, kiwis oranges apples AND OR

Nyní chodí to při zachování stoh.

Make uzel z kiwi tlačit na stoh. Uzel z pomerančů tlačit na stoh. Stejné je to s jablky.

Takže Zásobník je

Node:Apples
Node:Oranges
Node:Kiwis

Nyní máte možnost vidět AND v RPN.

Pop dva vrchní ze zásobníku a vytvořit nový uzel s AND as rodiči.

Uzel: AND [Uzel: Jablka, Node: Pomeranče]

podstatě strom

       AND
     /    \
  Apples  Oranges

Nyní tlačit tento uzel do zásobníku.

Takže stoh

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

Nyní máte možnost vidět OR v RPN a vytvořit uzel s OR jako rodič a Node A a Uzel Kiwi jako děti dostat na strom

           OR 
         /   \
       AND   Kiwis
     /    \
  Apples  Oranges

Může se dokonce stát schopen modifikovat shunting-yard vytvořit strom, ale jednání s RPN zdá být jednodušší.

Případně můžete zkusit pomocí rekurzivní sestup parsování techniky. To, co se ptáte, je velmi časté, a budete moci najít gramatiky a kód i, pokud budete hledat na internetu.

Mimochodem, kterou jste právě na mysli binární strom v pořádku? BST (Binární vyhledávací strom) má zvláštní omezení ...

Odpovězeno 13/04/2011 v 18:14
zdroj uživatelem

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