Συντομότερη υποκατάστημα σε ένα δυαδικό δέντρο;

ψήφοι
1

Ένα δυαδικό δέντρο μπορεί να κωδικοποιηθεί με δύο λειτουργίες lκαι r τέτοια ώστε για ένα node n, l(n)δίνουν το αριστερό παιδί του n, r(n) δίνουν το δικαίωμα του παιδιού της n.

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

Ας MinBranch(l,r,x)είναι μια απλή αναδρομικό αλγόριθμο για τη λήψη ενός δυαδικού δένδρου που κωδικοποιείται από τις λειτουργίες L και R μαζί με τον κόμβο ρίζα χ για το δυαδικό δέντρο και επιστρέφει το μήκος της συντομότερης κλαδί του δυαδικού δένδρου.

Δώστε τον ψευδοκώδικα για αυτόν τον αλγόριθμο.

Εντάξει, τόσο βασικά αυτό είναι ό, τι έχω καταλήξει μέχρι στιγμής:

MinBranch(l, r, x)
{
    if x is None return 0

    left_one = MinBranch(l, r, l(x))

    right_one = MinBranch(l, r, r(x))

    return {min (left_one),(right_one)}
}

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

Δημοσιεύθηκε 28/08/2009 στις 05:07
πηγή χρήστη
Σε άλλες γλώσσες...                            


5 απαντήσεις

ψήφοι
3

Αμφιβάλλω αν κάποιος θα λύσει το σπίτι σας ευθεία προς τα πάνω. Μια ιδέα: η τιμή επιστροφής πρέπει σίγουρα να αυξηθεί υψηλότερα καθώς το δέντρο μεγαλώνει, έτσι δεν είναι; Ωστόσο, δεν βλέπω κανένα αριθμητικό λεκτικές λειτουργία σας εκτός από το 0, και όχι φορείς προσθήκη είτε. Πώς θα σας επιστρέψουμε ποτέ μεγαλύτερους αριθμούς;

Μια άλλη οπτική γωνία για το ίδιο θέμα: οποτεδήποτε να γράψετε μια αναδρομική συνάρτηση, βοηθά να απαριθμήσει «ποιες είναι όλες οι συνθήκες υπό τις οποίες θα πρέπει να σταματήσει καλώντας τον εαυτό μου αυτό που επιστρέφουν σε κάθε περίσταση;»

Απαντήθηκε 28/08/2009 στις 05:15
πηγή χρήστη

ψήφοι
2

Είσαι για τη σωστή προσέγγιση, αλλά δεν είστε αρκετά εκεί? αναδρομικός αλγόριθμος θα επιστρέψει πάντα 0. (η λογική είναι σχεδόν σωστό, όμως ...)

Σημειώστε ότι το μήκος των υπο-κλάδους είναι ένα λιγότερο από το μήκος του υποκαταστήματος? οπότε left_oneκαι right_oneθα πρέπει να είναι 1 + MinBranch....

Steping με τον αλγόριθμο με μερικά δέντρα δείγμα θα βοηθήσει στην αποκάλυψη off-προς-ένα τα λάθη όπως αυτό ...

Απαντήθηκε 28/08/2009 στις 05:16
πηγή χρήστη

ψήφοι
0

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

Συμβουλή: να εξετάσει ένα εύρος-πρώτη προσέγγιση αναζήτησης.

Απαντήθηκε 28/08/2009 στις 05:19
πηγή χρήστη

ψήφοι
0

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

Απαντήθηκε 28/08/2009 στις 05:19
πηγή χρήστη

ψήφοι
1

Φαίνεται ότι σχεδόν το έχετε, αλλά σκεφτείτε αυτό το παράδειγμα:

      4

   3     5

Όταν εντοπίζουν μέσα MinBranch, θα δείτε ότι σας MinBranch(l,r,4)κλήση:

left_one = MinBranch(l, r, l(x))
         = MinBranch(l, r, l(4))
         = MinBranch(l, r, 3)
         = 0

Αυτό είναι λογικό, μετά από όλα, 3 είναι ένας κόμβος φύλλο, έτσι φυσικά η απόσταση από το πλησιέστερο κόμβο φύλλο είναι 0. Το ίδιο συμβαίνει και για right_one.

Αλλά τότε περατωθεί εδώ:

return {min (left_one),(right_one)}
     = {min (0), (0) }
     = 0

αλλά αυτό είναι σαφώς λάθος, γιατί αυτός ο κόμβος (4) δεν είναι ένας κόμβος φύλλο. Ο κωδικός σας ξέχασε να μετρήσει το τρέχον κόμβο (ουπς!). Είμαι βέβαιος ότι μπορείτε να καταφέρετε να διορθώσετε αυτό.


Τώρα, στην πραγματικότητα, αυτοί τρόπος που κάνετε αυτό δεν είναι ο πιο γρήγορος, αλλά δεν είμαι σίγουρος αν αυτό είναι σχετικό για αυτήν την άσκηση. Σκεφτείτε αυτό το δέντρο:

         4
       3   5
     2
   1

αλγόριθμος σας θα μετρήσει μέχρι το αριστερό κλαδί αναδρομικά, αν και θα μπορούσε, υποθετικά, ξεμπλέξουμε αν υπολογίζονται για πρώτη φορά το δεξιό κλάδο και σημείωσε ότι 3 έχει ένα αριστερό, έτσι του σαφώς περισσότερο από 5 (το οποίο είναι ένα φύλλο). Αλλά, φυσικά, μετρώντας το δικαίωμα υποκατάστημα πρώτη δεν λειτουργεί πάντα!

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

Απαντήθηκε 28/08/2009 στις 05:20
πηγή χρήστη

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