Διαδικασία διαγραφής για Binary Search Tree

ψήφοι
7

Εξετάστε τη διαδικασία διαγραφής σε ένα BST, όταν ο κόμβος να διαγράψετε έχει δύο παιδιά. Ας πούμε εγώ να το αντικαταστήσει πάντα με τον κόμβο που κατέχουν το ελάχιστο κλειδί στο δεξιό υποδέντρο του.

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

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

ΕΠΕΞΕΡΓΑΣΙΑ:

Ίσως έχω να είναι σαφέστερη.

Εξετάστε το transplant(node x, node y)διαδικασία: το αντικαταστήσει x με y (και υποδένδρο του). Έτσι, αν θέλω να διαγράψετε ένα κόμβο (ας πούμε Χ), η οποία έχει δύο παιδιά i αντικαταστήστε το με τον κόμβο που κατέχουν το ελάχιστο κλειδί στο δεξιό υποδέντρο του:

y = minimum(x.right)
transplant(y, y.right) // extracts the minimum (it doesn't have left child)
y.right = x.right
y.left = x.left
transplant(x,y)

Το ερώτημα ήταν πώς να αποδειχθεί η παραπάνω διαδικασία δεν είναι αντιμεταθετική.

Δημοσιεύθηκε 07/06/2010 στις 15:46
πηγή χρήστη
Σε άλλες γλώσσες...                            


4 απαντήσεις

ψήφοι
17

Η διαγραφή (γενικά) δεν είναι αντιμεταθετική. Εδώ είναι ένα αντιπαράδειγμα:

    4
   / \
  3   7
     /
    6

Τι και αν διαγράψετε 4 και στη συνέχεια 3;

Όταν διαγράφετε 4, παίρνουμε 6 ως νέα ρίζα:

   6
  / \
 3   7

Διαγραφή 3 δεν αλλάζει το δέντρο, αλλά μας δίνει αυτό:

  6
   \
    7

Τι θα συμβεί αν έχουμε διαγράψει 3 και στη συνέχεια 4;

Όταν διαγράφετε 3 το δέντρο δεν αλλάζει:

 4
  \
   7
  /
 6

Ωστόσο, όταν έχουμε τώρα τη διαγραφή 4, η νέα ρίζα γίνεται 7:

  7
 /
6

Οι δύο προκύπτουσες δέντρα δεν είναι τα ίδια, ως εκ τούτου, διαγραφή δεν είναι αντιμεταθετική.

ΕΚΣΥΓΧΡΟΝΙΖΩ

Δεν είχα διαβάσει τον περιορισμό ότι αυτό είναι όταν διαγράφετε πάντα έναν κόμβο με 2 παιδιά. Η λύση μου είναι για τη γενική περίπτωση. Θα ενημερώσετε αν / όταν μπορώ να βρω ένα αντι-παράδειγμα.

ΑΛΛΗ ΕΝΗΜΕΡΩΣΗ

Δεν έχω συγκεκριμένες αποδείξεις, αλλά Πάω να τολμούσα να πω:

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

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

Σκεφτείτε δύο κόμβους Α και Β, όπου Α είναι ένας πρόγονος του B. Στη συνέχεια, μπορείτε να βελτιώσετε ακόμη περισσότερο την ερώτηση είναι:

Είναι διαγραφή αντιμεταθετική όταν σκέφτεστε τη διαγραφή των δύο κόμβων από ένα δυαδικό Αναζήτηση Δέντρο που έχουν σχέση προγόνου-απογόνου μεταξύ τους (αυτό σημαίνει ότι είναι στο ίδιο υπο-δέντρο);

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

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

Το ερώτημα λοιπόν είναι βελτιώθηκε περαιτέρω:

Μπορώ να σας εγγυηθεί ότι θα έχετε πάντα την ίδια κόμβο αντικατάσταση ανεξάρτητα από τη σειρά της διαγραφής (όταν διαγράφετε πάντα έναν κόμβο με δύο παιδιά);

Η απάντηση (νομίζω) είναι ναι. Γιατί; Εδώ είναι μερικές παρατηρήσεις:

  • Ας πούμε ότι έχετε διαγράψει την απόγονο κόμβο πρώτο και το δεύτερο κόμβο πρόγονο. Η υπο-δέντρο που τροποποιήθηκε όταν έχετε διαγράψει τον κόμβο απόγονο είναι όχι στο αριστερό υπο-δέντρο του δικαιώματος των παιδιών του κόμβου προγόνου του. Αυτό σημαίνει ότι αυτό το υπο-δέντρο παραμένει ανεπηρέαστη. Αυτό σημαίνει, επίσης, είναι ανεξάρτητα από τη σειρά της διαγραφής, δύο διαφορετικά οι υπο-δέντρα τροποποιηθεί και ως εκ τούτου η λειτουργία είναι αντιμεταθετική.
  • Και πάλι, ας υποθέσουμε ότι έχετε διαγράψει την απόγονο κόμβο πρώτο και το δεύτερο κόμβο πρόγονο. Η υπο-δέντρο που τροποποιήθηκε κατά τη διαγραφή του κόμβου απόγονος είναι στο αριστερό υπο-δέντρο του δικαιώματος των παιδιών του κόμβου προγόνου του. Αλλά ακόμη και εδώ, δεν υπάρχει επικάλυψη. Ο λόγος είναι, όταν διαγράφετε τον κόμβο απόγονο πρώτο, θα δείτε στο αριστερό υπο-δέντρο του κόμβου απόγονος του δικαιώματος του παιδιού. Όταν στη συνέχεια, διαγράψτε τον κόμβο πρόγονο, θα ποτέ δεν πάει κάτω η υπο-δέντρο από τη στιγμή που θα είναι πάντα να πηγαίνει προς τα αριστερά μετά την εισαγωγή αριστερό υπο-δέντρο δεξί παιδί του κόμβου προγόνου του. Έτσι και πάλι, ανεξάρτητα από το τι διαγράψετε την πρώτη σας τροποποίηση διαφορετικές υπο-δέντρα και έτσι φαίνεται να μην έχει σημασία.
  • Μια άλλη περίπτωση είναι αν διαγράψετε τον κόμβο πρόγονο πρώτη και θα διαπιστώσετε ότι το ελάχιστο κόμβος είναι παιδί του κόμβου απόγονος. Αυτό σημαίνει ότι ο κόμβος απόγονος θα καταλήξετε με ένα παιδί, και τη διαγραφή του ένα παιδί είναι ασήμαντο. Τώρα εξετάσει την περίπτωση κατά την οποία σε αυτό το σενάριο, θα διαγραφεί το απόγονο κόμβο πρώτα. Στη συνέχεια, θα αντικαταστήσει την αξία του απόγονου κόμβου με το δεξί παιδί του και στη συνέχεια να διαγράψετε το δικαίωμα του παιδιού. Στη συνέχεια, όταν διαγράφετε τον κόμβο πρόγονο, θα καταλήξετε να βρεθεί η ίδια ελάχιστη κόμβο (αριστερά παιδί της παλιάς διαγραφή κόμβου, που είναι και το αριστερό παιδί του κόμβου αντικατασταθεί). Είτε έτσι είτε αλλιώς, θα καταλήξετε με την ίδια δομή.

Αυτό δεν είναι μια αυστηρή απόδειξη? Αυτές είναι μερικές μόνο παρατηρήσεις που έχω κάνει. Με όλα τα μέσα, μην διστάσετε να σακί τρύπες!

Απαντήθηκε 07/06/2010 στις 18:32
πηγή χρήστη

ψήφοι
0

Απαντήσω εδώ για δεύτερη ενημέρωση Vivin του.

Νομίζω ότι αυτή είναι μια καλή αναδιατύπωση της ερώτησης:

Είναι διαγραφή αντιμεταθετική όταν σκέφτεστε τη διαγραφή των δύο κόμβων από ένα δυαδικό Αναζήτηση Δέντρο που έχουν σχέση προγόνου-απογόνου μεταξύ τους (αυτό σημαίνει ότι είναι στο ίδιο υπο-δέντρο);

αλλά αυτή η τολμηρή πρόταση παρακάτω δεν είναι αλήθεια:

Όταν διαγράφετε ένα κόμβο (ας πούμε Α), που διασχίζουν το δικαίωμα υπο-δέντρο για να βρείτε το ελάχιστο στοιχείο. Αυτός ο κόμβος θα είναι ένας κόμβος φύλλο και ποτέ δεν μπορεί να είναι ίσο με Β

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

Θα προσπαθήσω να συνοψίσω.

υπόθεση :

  1. Α και Β έχουν δύο παιδιά η κάθε μία.
  2. Α και Β είναι στην ίδια υποδένδρο.

Άλλα πράγματα που μπορούμε να συμπεράνουμε από την υπόθεση:

  1. Β δεν είναι successor(A), ούτε είναι successor(B).

Τώρα, δεδομένου ότι, νομίζω ότι υπάρχουν 4 διαφορετικές περιπτώσεις (όπως συνήθως, ας είναι ένα πρόγονος του Β):

  1. Β είναι στην αριστερή υποδένδρο Α
  2. Β είναι ένας πρόγονος του successor(A)
  3. successor(A) είναι ένας πρόγονος του Β
  4. Β και διάδοχος (Α) δεν έχουν καμία σχέση. (Που βρίσκονται σε διαφορετικές υποδένδρων Α)

Νομίζω (αλλά φυσικά δεν μπορώ να το αποδείξει) ότι οι περιπτώσεις 1, 2 και 4 δεν έχουν σημασία. Έτσι, μόνο στην περίπτωση successor(A)είναι ένας πρόγονος της διαδικασίας διαγραφής Β δεν θα μπορούσε να είναι αντιμεταθετική. Ή μήπως θα μπορούσε;

Έχω περάσει την μπάλα:)

Χαιρετισμοί.

Απαντήθηκε 11/06/2010 στις 18:45
πηγή χρήστη

ψήφοι
2

Μου φαίνεται ότι το αντιπαράδειγμα φαίνεται στην απάντηση Vivin είναι η μόνη περίπτωση μη αντιμεταθετικότητα, και ότι πράγματι εξαλειφθεί από τον περιορισμό που κόμβους μόνο με μπορούν να διαγραφούν δύο παιδιά.

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

    7
   /
  6
Ποτέ δεν επιτυγχάνεται αν ξεκινήσει στις

    4
   / \
  3 7
     /
    6

Αντ 'αυτού, θα διαγραφεί πρώτα 3 (χωρίς διάδοχο) και, στη συνέχεια, διαγράψτε 4 (με 6 ως διάδοχο), αποδίδοντας

    6
     \
      7

το οποίο είναι το ίδιο όπως εάν είχαν αντιστραφεί η σειρά της διαγραφής.

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

Δεν έχω επίσημη απόδειξη για να προσφέρουν, απλώς μια απαρίθμηση των περιπτώσεων:

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

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

  2. Απόγονος στο αριστερό υποδένδρο του προγόνου. Η κατάσταση αυτή δεν θα επηρεάσει αντιμεταθετικότητα επειδή ο διάδοχος έρχεται από τα δεξιά υποδέντρο και δεν μπορεί να επηρεάσει το αριστερό υποδένδρο καθόλου.

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

Απαντήθηκε 06/04/2011 στις 19:34
πηγή χρήστη

ψήφοι
0

Νομίζω ότι υπάρχουν δύο εξίσου βιώσιμο τρόποι για να διαγράψετε έναν κόμβο, όταν έχει 2 παιδιά:
Μεταφορά στην υπόθεση 4 ...

Περίπτωση 1: διαγραφή 3 (Φύλλο κόμβου)
 2 3
 / \ -> / \
1 3 1


Περίπτωση 2: διαγραφή 2 (αριστερά κόμβο παιδί)
 2 3
 / \ -> / \
1 3 1


Περίπτωση 3: διαγραφή 2 (Δεξιά κόμβο παιδί)
 2 2
 / \ -> / \
1 3 3

______________________________________________________________________
Περίπτωση 4: διαγραφή 2 (Αριστερά και Δεξιά κόμβους παιδί)
 2 2 3
 / \ -> / \ / ή \      
1 3 1 3
εργασία και έχουν διαφορετικές με αποτέλεσμα τα δέντρα :) ______________________________________________________________________
Όπως αλγόριθμο εξηγείται εδώ: http: // www .mathcs.emory.edu / ~ Cheung / Μαθήματα / 323 / Syllabus / Δέντρα / AVL-delete.html Deleting a node with 2 children nodes: 1) Replace the (to-delete) node with its in-order predecessor or in-order successor 2) Then delete the in-order predecessor or in-order successor

Απαντήθηκε 10/10/2016 στις 01:02
πηγή χρήστη

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