Ontleden en het gebouw S-Uitdrukkingen behulp Sets en binaire zoekboom

stemmen
1

Dit is pseudo huiswerk (het is extra krediet). Ik heb een BST die een index van woorden die verwijzen naar de lijnen (ergens anders opgeslagen), die de woorden bevatten kreeg. Ik moet een manier uit te voeren om te zoeken met behulp van s-uitingen, dus ik kan combineren en (&) en of (|).

Bij de opdrachtprompt een gebruiker kan iets als het type:

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

In wezen dat moeten alle lijnen die de woorden vuur, bos en water, alsmede alle lijnen die oceaan, boot en water bevatten terugkeren.

Wat ik echt nodig te helpen met de logica voor het ontleden en het plaatsen van de knooppunten in de boom om de expressie meer dan de werkelijke code correct weer te geven. Het enige wat ik heb uit die werkte zinvol is voor mij het terugsturen van een set van regels voor elk woord in de expressie. Dan afhankelijk van of het een of of en operatie zou ik een vakbond of het type kruising bewerking uit te voeren op die sets om een ​​nieuwe set te maken en dat doorgeven van de boom.

Ik ben soort van verloren op hoe de lijn die de expressie bevat ontleden. Na enig nadenken blijkt dat de verder uit een van de sub-uitdrukkingen is des te hoger zou moeten zijn in mijn s-expressie boom? Ik denk dat als ik een duw in de goede richting zou kunnen krijgen voor zover het ontleden en het plaatsen van de uitdrukkingen in de boom moet ik OK.

Mijn boom in de steekproef die ik bedacht voor de query hierboven ziet er ongeveer zo;

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

Dit is logisch als het vuur van een set van regels die bevatten allemaal vuur en het bos zou een set van regels die bevatten allemaal bos terug zou terugkeren. Dan de & niveau zou ik die twee sets te nemen en een andere set die alleen de lijnen die in beide sets waardoor me een set die slechts lijnen die zowel vuur en bos bevatten waren bevatte.

Mijn andere struikelblok is hoe alles in de boom te vertegenwoordigen nadat ik de horde van parsing overwinnen. Ik heb een ExpTreeNode klasse die als knooppunten voor mijn ExpTree (het BST) zal dienen en dan heb ik 2 subklassen, operator en operand, maar ik ben niet zeker of dit is een goede aanpak.

De vraag is gesteld op 13/04/2011 om 18:11
bron van user
In andere talen...                            


1 antwoorden

stemmen
4

Dijkstra heeft het voor u al gedaan :-)

Probeer het rangeerterrein algoritme: http://en.wikipedia.org/wiki/Shunting-yard_algorithm

U kunt de RPN (Reverse Polish Notation) maken gebruik van het rangeerterrein algoritme, en zodra dat wordt gemaakt, kunt u een pas te maken door het naar de binaire boom te creëren.

Normaal gesproken is de RPN wordt gebruikt om de evaluatie te doen, maar je kunt eigenlijk een boom te creëren.

Bijvoorbeeld, in plaats van het evalueren, creëer je boom knopen en duw ze op de stapel.

Dus als je ziet node1, clustnode2, operator. U maakt een nieuw knooppunt

   Operator
   /     \
  node1   node2

en duw hem weer op de stapel.

Een meer gedetailleerd voorbeeld:

Zeggen dat de uitdrukking (apples AND oranges) OR kiwis

Het RPN hiervoor is kiwis oranges apples AND OR

Loop nu dit met behoud van een stapel.

Voeg een knooppunt uit kiwi duwen op stack. Knooppunt van sinaasappelen duwen op stack. Zelfde met appels.

Dus wordt de stapel

Node:Apples
Node:Oranges
Node:Kiwis

Nu zie je de AND in de RPN.

Je pop de bovenste twee van de stapel en het creëren van een nieuw knooppunt met en als ouder.

Node: AND, [Node: appels, Node: Sinaasappelen]

in principe de boom

       AND
     /    \
  Apples  Oranges

Schuif nu dit knooppunt op stack.

Dus stapel

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

Nu is het u zie, hetzij in de RPN en het creëren van een knooppunt met de OR als ouder en Knooppunt: AND en Node Kiwis als kinderen het krijgen van de boom

           OR 
         /   \
       AND   Kiwis
     /    \
  Apples  Oranges

Je zou zelfs in staat zijn om het rangeerterrein algoritme te wijzigen om de boom te creëren, maar het omgaan met de RPN lijkt gemakkelijker.

Als alternatief kunt u proberen met behulp van recursive descent parsertechnieken. Wat je vraagt ​​is heel gebruikelijk en u in staat om grammatica en code ook vinden, als je zoeken op het web zal zijn.

By the way, je bedoelt Binary boom toch? BST (Binary Search Boom) heeft een extra beperking ...

antwoordde op 13/04/2011 om 18:14
bron van user

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