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


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


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

 
Καλύτερη αυτο-εξισορρόπησης BST για γρήγορη εισαγωγή μεγάλου αριθμού των κόμβων
===============================================================================



[Κόκκινο-μαύρο](http://en.wikipedia.org/wiki/Red-black_tree) είναι καλύτερο από το AVL για την εισαγωγή-βαριές εφαρμογές. Αν έχετε προβλέψει σχετικά ομοιόμορφη εμφάνιση-up, στη συνέχεια, κόκκινο-μαύρο είναι ο τρόπος να πάει. Αν έχετε προβλέψει μια σχετικά ισορροπημένη ματιά-up, όπου θεωρείται πιο πρόσφατα στοιχεία είναι πιο πιθανό να είναι ορατό και πάλι, θέλετε να χρησιμοποιήσετε [τα δέντρα άτεχνος](http://en.wikipedia.org/wiki/Splay_tree) .

 

Γιατί να χρησιμοποιήσετε ένα `BST`σε όλα; Από την περιγραφή σας λεξικό θα λειτουργούν το ίδιο καλά, αν όχι καλύτερα.


Ο μόνος λόγος για τη χρήση ενός `BST`θα ήταν αν θέλατε να απαριθμήσω τα περιεχόμενα του δοχείου σε βασικούς σειρά. Σίγουρα δεν ακούγεται σαν θέλετε να το κάνετε αυτό, οπότε πάμε για τον πίνακα κατακερματισμού. `O(1)`εισαγωγή και αναζήτηση, υπάρχουν ανησυχίες σχετικά με τη διαγραφή, τι θα μπορούσε να είναι καλύτερο;

 

Οι δύο αυτο-εξισορρόπησης `BST`s είμαι πιο εξοικειωμένος με τα κόκκινα-μαύρα και `AVL`, γι 'αυτό δεν μπορώ να πω για ορισμένους εάν υπάρχουν άλλες λύσεις είναι καλύτερες, αλλά από όσο θυμάμαι, κόκκινο-μαύρο έχει ταχύτερη εισαγωγή και πιο αργή ανάκτηση σε σύγκριση με `AVL`.


Έτσι, αν η εισαγωγή είναι μεγαλύτερη προτεραιότητα από την ανάκτηση, κόκκινο-μαύρο μπορεί να είναι μια καλύτερη λύση.

 


> 
> [Πίνακες hash έχουν] O (1) εισαγωγή και αναζήτηση
> 
> 
> 


Νομίζω ότι αυτό είναι λάθος.


Πρώτα απ 'όλα, αν περιοριστεί η keyspace να είναι πεπερασμένο, μπορείτε να αποθηκεύσετε τα στοιχεία σε μια σειρά και να κάνει μια O (1) γραμμική σάρωση. Ή θα μπορούσατε να shufflesort τον πίνακα και στη συνέχεια να κάνει μια γραμμική σάρωση σε O (1) με την αναμενόμενη ώρα. Όταν η ουσία είναι πεπερασμένο, τα πράγματα είναι εύκολα O (1).


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


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


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

 