Την ανάλυση και την οικοδόμηση S-εκφράσεις που χρησιμοποιούν σύνολα και δυαδικό δένδρο αναζήτησης

ψήφοι
1

Αυτό είναι ψευδο εργασία (είναι επιπλέον πίστωση). Έχω μια BST που είναι ένας δείκτης των λέξεων που δείχνουν τις γραμμές (αποθηκευμένα κάπου αλλού) που περιέχουν τις λέξεις. Θα πρέπει να εφαρμόσει ένα τρόπο για να κάνετε χρήση της s-εκφράσεις ώστε να μπορώ να συνδυάσει και (&) ή (|).

Στη γραμμή εντολών σε ένα χρήστη να πληκτρολογήσετε κάτι σαν:

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

Ουσιαστικά αυτό θα πρέπει να επιστρέψει όλες τις γραμμές που περιέχουν τις λέξεις φωτιά, τα δάση και το νερό, καθώς και όλες τις γραμμές που περιέχουν ωκεανό, βάρκα και το νερό.

Αυτό που πραγματικά χρειάζεται βοήθεια με είναι η λογική για την ανάλυση και την εισαγωγή των κόμβων στο δέντρο για να αντιπροσωπεύουν σωστά την έκφραση περισσότερο από το πραγματικό κώδικα. Το μόνο πράγμα που έχω εργαστεί ότι έχει νόημα για μένα επιστρέφει ένα σύνολο γραμμών για κάθε λέξη στην έκφραση. Στη συνέχεια, ανάλογα με το αν πρόκειται για ένα «ή» ή «και» λειτουργία θα εκτελέσει μια ένωση ή τη λειτουργία του τύπου διασταύρωση σε αυτές τις ομάδες για να δημιουργήσετε ένα νέο σύνολο και να περάσει ότι στις μέχρι το δέντρο.

Είμαι το είδος του έχασε σχετικά με το πώς να αναλύσει τη γραμμή που περιέχει την έκφραση. Μετά από κάποια σκέψη φαίνεται ότι το «πιο μακριά» από μια από τις επιμέρους εκφράσεις είναι η υψηλότερη θα πρέπει να είναι σε δέντρο s-έκφραση μου; Νομίζω ότι αν θα μπορούσα να πάρω μόνο μια ώθηση προς τη σωστή κατεύθυνση όσον αφορά την ανάλυση και εισάγοντας τις εκφράσεις στο δέντρο θα πρέπει να είναι εντάξει.

δείγμα δέντρο μου που ήρθε με για το ερώτημα παραπάνω φαίνεται κάτι σαν?

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

Αυτό είναι λογικό, η φωτιά θα επιστρέψει ένα σύνολο γραμμών που περιέχουν όλα φωτιά και τα δάση θα επιστρέψει ένα σύνολο γραμμών που όλα περιέχουν δάσος. Στη συνέχεια, η «&» επίπεδο θα λάβουν αυτές τις δύο ομάδες και να δημιουργήσει ένα άλλο σύνολο που περιέχει μόνο τις γραμμές που ήταν σε δύο ομάδες έτσι μου έδωσε ένα σύνολο που έχει μόνο τις γραμμές που περιέχουν και φωτιά και το δάσος.

άλλο εμπόδιο μου είναι πώς να εκπροσωπεί τα πάντα στο δέντρο αφού ξεπεραστεί το εμπόδιο της ανάλυσης. Έχω μια τάξη ExpTreeNode που θα χρησιμεύσουν ως κόμβοι για ExpTree μου (η BST) και, στη συνέχεια, έχω 2 υποκατηγορίες, χειριστή και τελεστή, αλλά δεν είμαι σίγουρος αν αυτό είναι μια καλή προσέγγιση.

Δημοσιεύθηκε 13/04/2011 στις 18:11
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
4

Dijkstra έχει κάνει για σας ήδη :-)

Δοκιμάστε τους ελιγμούς αλγόριθμο αυλή: http://en.wikipedia.org/wiki/Shunting-yard_algorithm

Μπορείτε να δημιουργήσετε το RPN (reverse polish συμβολισμός) χρησιμοποιώντας τον αλγόριθμο ελιγμών αυλή, και μια φορά που δημιουργείται, μπορείτε να κάνετε ένα πέρασμα μέσα από αυτό να δημιουργήσει το δυαδικό δέντρο.

Κανονικά, η RPN χρησιμοποιείται για να κάνει την αξιολόγηση, αλλά μπορείτε πραγματικά να δημιουργήσετε ένα δέντρο.

Για παράδειγμα, αντί για αξιολόγηση, μπορείτε να δημιουργήσετε κόμβους του δέντρου και σπρώξτε τους στη στοίβα.

Έτσι, αν δείτε node1, Node2, χειριστή. Μπορείτε να δημιουργήσετε ένα νέο κόμβο

   Operator
   /     \
  node1   node2

και σπρώξτε πίσω στη στοίβα.

Ένα πιο λεπτομερές παράδειγμα:

Λένε ότι η έκφραση είναι (apples AND oranges) OR kiwis

THe RPN για αυτό είναι kiwis oranges apples AND OR

Τώρα με τα πόδια αυτό, διατηρώντας παράλληλα μια στοίβα.

Κάντε ένα κόμβο έξω από τα ακτινίδια ωθήσει σε στοίβα. Κόμβος έξω από τα πορτοκάλια ωθήσει σε στοίβα. Ίδιο με τα μήλα.

Έτσι, η στοίβα είναι

Node:Apples
Node:Oranges
Node:Kiwis

Τώρα μπορείτε να δείτε το και στο RPN.

Θα εμφανιστεί το δύο επάνω από το σωρό και να δημιουργήσετε ένα νέο κόμβο με και ως γονέας.

Κόμβος: ΚΑΙ, [Κόμβος: Μήλα, Κόμβος: Πορτοκάλια]

ουσιαστικά το δέντρο

       AND
     /    \
  Apples  Oranges

Τώρα πιέστε αυτό το κόμβο σε στοίβα.

Έτσι στοίβα είναι

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

Τώρα βλέπετε το Ή στην RPN και να δημιουργήσει ένα κόμβο με ή ως μητρική και Κόμβος: και Κόμβος Ακτινίδια τα παιδιά να πάρει το δέντρο

           OR 
         /   \
       AND   Kiwis
     /    \
  Apples  Oranges

Ίσως ακόμη να είναι σε θέση να τροποποιήσει τους ελιγμούς αλγόριθμο αυλή για να δημιουργήσει το δέντρο, αλλά ασχολούνται με την RPN φαίνεται πιο εύκολο.

Εναλλακτικά, μπορείτε να δοκιμάσετε τη χρήση τεχνικών Αναδρομική Κάθοδος ανάλυσης. Αυτό που ζητάμε είναι πολύ συχνές και θα είστε σε θέση να βρείτε γραμματικές και τον κωδικό ακόμα, αν κάνετε αναζήτηση στο διαδίκτυο.

Με την ευκαιρία, να σας πω ακριβώς Binary σωστά δέντρο; 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