Πώς να συγχωνεύσει δύο BST είναι αποτελεσματικά;

ψήφοι
23

Πώς να συγχωνεύσει δύο δυαδικά δέντρα αναζήτησης διατηρώντας την ιδιότητα του BST;

Αν αποφασίσουμε να πάρει κάθε στοιχείο από ένα δέντρο και τοποθετήστε το στην άλλη, η πολυπλοκότητα αυτής της μεθόδου θα είναι O(n1 * log(n2)), όπου n1είναι ο αριθμός των κόμβων του δέντρου (ας πούμε T1), το οποίο έχουμε χωρίσει, και n2είναι ο αριθμός των κόμβων του το άλλο δέντρο (ας πούμε T2). Μετά από αυτή τη λειτουργία μόνο ένα BST έχει n1 + n2κόμβους.

Το ερώτημά μου είναι: μπορούμε να κάνουμε κάτι καλύτερο από O (n1 * log (n 2));

Δημοσιεύθηκε 17/06/2009 στις 18:35
πηγή χρήστη
Σε άλλες γλώσσες...                            


6 απαντήσεις

ψήφοι
8

Τι γίνεται με την ισοπέδωση των δύο δέντρα σε ταξινομημένο καταλόγους, τη συγχώνευση των καταλόγων και, στη συνέχεια, δημιουργώντας ένα νέο δέντρο;

Απαντήθηκε 17/06/2009 στις 18:43
πηγή χρήστη

ψήφοι
18
  • Ισιώστε τα δέντρα σε ταξινομημένο καταλόγους.
  • Συγχώνευση ταξινομημένων λιστών.
  • Δημιουργήστε το δέντρο έξω από νέα λίστα.

IIRC, ότι είναι Ο (n1 + n2).

Απαντήθηκε 17/06/2009 στις 18:43
πηγή χρήστη

ψήφοι
26

απάντηση Naaff με μια μικρή περισσότερες λεπτομέρειες:

  • Flattening μια BST σε μια ταξινομημένη λίστα είναι Ο (Ν)
    • Είναι απλά επανάληψη «σε σειρά» σε όλο το δέντρο.
    • Κάνοντας αυτό και για τα δύο είναι Ο (n1 + n2)
  • Συγχώνευση δύο ταξινομημένων λιστών είναι σε μία ταξινομημένη λίστα είναι Ο (n1 + n2).
    • Κρατήστε δείκτες προς τους επικεφαλής των δύο λίστες
    • Διαλέξτε το μικρότερο κεφάλι και να προωθήσει το δείκτη του
    • Αυτό είναι το πώς η συγχώνευση των εργασιών συγχώνευσης-sort
  • Η δημιουργία ενός απόλυτα ισορροπημένη BST από μια ταξινομημένη λίστα είναι O (N)
    • Η τιμή στη μέση θα είναι η ρίζα, και αναδρομή.
    • Στην περίπτωσή μας η ταξινομημένη λίστα είναι του μεγέθους n1 + n2. έτσι O (n1 + n2)
    • Το δέντρο θα είναι η εννοιολογική BST των δυαδικών αναζήτηση στη λίστα

Τρία στάδια O (n1 + n2) αποτέλεσμα σε O (n1 + n2)

Για Ν1 και Ν2 της ίδιας τάξης μεγέθους, αυτό είναι καλύτερο από το O (n1 * log (n 2))

Απαντήθηκε 18/06/2009 στις 01:14
πηγή χρήστη

ψήφοι
1

Ιωαναθάν,

Μετά τη διαλογή, έχουμε μια λίστα με μήκος n1 + n2. Η οικοδόμηση ενός δυαδικού δέντρου έξω από αυτό θα συνδεθείτε (n1 + n2) χρόνο. Αυτή είναι ίδια με την συγχώνευση είδος, μόνο που σε κάθε επαναληπτικό βήμα που συνηθίζει να έχει O (n1 + n2) όρος, όπως έχουμε αλγόριθμο συγχώνευσης είδος. Έτσι, η χρονική πολυπλοκότητα είναι log (n1 + n2).

Τώρα, η πολυπλοκότητα του όλου προβλήματος είναι Ο (n1 + n2).

Επίσης, θα ήθελα να πω αυτή η προσέγγιση είναι καλό, αν δύο λίστες είναι συγκρίσιμο μέγεθος. Εάν τα μεγέθη δεν είναι συγκρίσιμα τότε το καλύτερο είναι να τοποθετήσετε σε κάθε κόμβο του μικρού δέντρου σε ένα μεγάλο δέντρο. Αυτό θα πάρει O (n1 * log (n 2)) χρόνο. Για παράδειγμα, αν έχουμε δύο δέντρα ένα από μέγεθος 10 και ένα άλλο από το μέγεθος 1024. Εδώ n1 + n2 = 1034, όπου, όπως n1log (n2) = 10 * 10 = 100. Έτσι προσέγγιση πρέπει να εξαρτάται από τα μεγέθη των δύο δέντρα.

Απαντήθηκε 27/07/2010 στις 22:08
πηγή χρήστη

ψήφοι
0

O (n1 * log (n 2)) είναι το μέσο σενάριο, ακόμη και αν έχουμε 2 συγχώνευσης οποιαδήποτε μη ταξινομημένα λίστα σε ένα BST. Εμείς δεν χρησιμοποιούν το γεγονός ότι η λίστα είναι ταξινομημένη λίστα ή ένα BST.

Κατά τη γνώμη μου Ας υποθέσουμε ένα BST έχει n1 στοιχεία και άλλα έχει n2 στοιχεία. Τώρα μετατρέψτε ένα BST σε ένα ταξινομημένο πίνακα Λίστα L1 σε O (n1).

Συγχωνεύεται BST (BST, Array)

εάν (Array.size == 0) επιστροφής BST εάν (Array.size == 1) τοποθετήστε το στοιχείο της BST. επιστρέψει BST?

Βρείτε το δείκτη του πίνακα με το αριστερό στοιχείο <BST.rootnode και δεξιά στοιχείο> = BST.rootnode λένε Index. εάν (BST.rootNode.leftNode == null) // δηλαδή αριθ αριστερή κόμβο {εισαγάγετε όλη τη συστοιχία από Index έως 0 σε αριστερό του BST και} αλλού {Συγχωνεύεται BST (BST.leftNode, Array {0 έως Index})}

εάν (BST.rootNode.rightNode == null) // δηλαδή αριθ δεξιά κόμβος {εισαγάγετε όλη τη συστοιχία από Index να Array.size σε δεξιά της BST} else {Συγχωνεύεται BST (BST.rightNode, Array {Index να Array.size} )}

επιστρέψει BST.

Ο αλγόριθμος αυτός θα πάρει << χρόνο από O (n1 * log (n 2)), όπως κάθε φορά που κατακερματισμό της συστοιχίας και BST για να χειριστεί το υποπρόβλημα.


Απαντήθηκε 30/08/2010 στις 11:12
πηγή χρήστη

ψήφοι
-1

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

Απαντήθηκε 08/01/2013 στις 07:04
πηγή χρήστη

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