Δημιουργήστε μια ισορροπημένη δυαδικό δένδρο αναζήτησης από ένα ρεύμα ακεραίων

ψήφοι
10

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

Το ερώτημα ήταν: Γράψτε μια λειτουργία, η οποία δίνεται ένα ρεύμα ακεραίων (μη διατεταγμένη), χτίζει ένα ισορροπημένο δέντρο αναζήτησης. Τώρα, δεν μπορείτε να περιμένετε για την είσοδο στο τέλος (αυτό είναι ένα ρεύμα), οπότε θα πρέπει να ισορροπήσει το δέντρο on the fly.

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

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

Ευχαριστώ,

Ο dave

Δημοσιεύθηκε 29/08/2011 στις 22:25
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
3

Δέντρα ΑΑ είναι λίγο πιο απλό από ό, τι Κόκκινο-Μαύρο δέντρα, αλλά εγώ δεν θα μπορούσε να εφαρμόσει μία από την κορυφή του κεφαλιού μου.

Απαντήθηκε 29/08/2011 στις 22:28
πηγή χρήστη

ψήφοι
9

Προσωπικά πιστεύω ότι ο καλύτερος τρόπος για να γίνει αυτό θα ήταν να πάμε για ένα τυχαίο δυαδικό δέντρο αναζήτησης όπως ένα treap . Αυτό δεν είναι απολύτως εγγύηση ότι το δέντρο θα είναι ισορροπημένη, αλλά με μεγάλη πιθανότητα το δέντρο θα έχει μια καλή παράγοντα ισορροπίας. Μια treap λειτουργεί με αύξηση κάθε στοιχείο του δέντρου με ομοιόμορφα τυχαίο αριθμό, τότε εξασφαλίζει ότι το δέντρο είναι ένα δυαδικό δένδρο αναζήτησης σε σχέση με τα πλήκτρα και ένα σωρό σε σχέση με τις ομοιόμορφες τυχαίες τιμές. Εισαγωγή σε treap είναι εξαιρετικά εύκολη:

  1. Διαλέξτε έναν τυχαίο αριθμό για να αναθέσει στον πρόσφατα πρόσθετο στοιχείο.
  2. Τοποθετήστε το στοιχείο μέσα στο BST χρησιμοποιώντας πρότυπες εισαγωγής BST.
  3. Ενώ το κλειδί της πρόσφατα εισαχθεί στοιχείου είναι μεγαλύτερη από ό, τι το κλειδί της μητρικής της, να εκτελέσει μια περιστροφή δέντρο για να φέρει το νέο στοιχείο πάνω από τη μητρική της.

Αυτό το τελευταίο βήμα είναι η μόνη πραγματικά δύσκολη, αλλά αν είχε λίγο χρόνο για να το λειτουργήσει σε έναν πίνακα Είμαι απόλυτα βέβαιος ότι θα μπορούσατε να εφαρμόσει αυτό το on-the-fly σε μια συνέντευξη.

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

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

Η ελπίδα αυτό βοηθά!

Απαντήθηκε 29/08/2011 στις 22:33
πηγή χρήστη

ψήφοι
1

Ένα από τα πιο απλή ισορροπημένη δυαδικό δένδρο αναζήτησης είναι ΒΒ (α) -δέντρου. Μπορείτε να επιλέξετε τη σταθερά α, η οποία λέει πόσο ισορροπημένη μπορείτε να πάρετε το δέντρο. Σε κάθε περίπτωση, #descendants(child) <= (1-α) × #descendants(node)πρέπει να κατέχουν. Μπορείτε να το αντιμετωπίζουν ως κανονικό δυαδικό δένδρο αναζήτησης, αλλά όταν ο τύπος δεν εφαρμόζεται σε κάποιο κόμβο πια, απλά ανοικοδόμηση εκείνο το μέρος του δέντρου από το μηδέν, έτσι ώστε να είναι απόλυτα ισορροπημένη.

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

Απαντήθηκε 29/08/2011 στις 22:49
πηγή χρήστη

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