ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Κατακερµατισµός Κεφάλαιο 14. Ε. Μαρκάκης Επίκουρος Καθηγητής

Σχετικά έγγραφα
Δοµές Δεδοµένων. 16η Διάλεξη Κατακερµατισµός. Ε. Μαρκάκης

Δοµές Δεδοµένων. 15η Διάλεξη Δέντρα Δυαδικής Αναζήτησης και Κατακερµατισµός. Ε. Μαρκάκης

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Πίνακες Συµβόλων Κεφάλαιο 12 ( ) Ε. Μαρκάκης Επίκουρος Καθηγητής

Δοµές Δεδοµένων. 14η Διάλεξη Δέντρα Δυαδικής Αναζήτησης. Ε. Μαρκάκης

Οργάνωση αρχείων: πως είναι τοποθετηµένες οι εγγραφές ενός αρχείου όταν αποθηκεύονται στο δίσκο

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Εξωτερική Αναζήτηση και Β-δέντρα Κεφάλαιο 16. Ε. Μαρκάκης Επίκουρος Καθηγητής

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. Δοµές Δεδοµένων

Δοµές Δεδοµένων. 18η Διάλεξη Ισορροπηµένα δέντρα. Ε. Μαρκάκης

Δομές Δεδομένων και Αλγόριθμοι

Δοµές Δεδοµένων. 13η Διάλεξη Πίνακες Συµβόλων. Ε. Μαρκάκης

Δομές Δεδομένων. Δημήτρης Μιχαήλ. Κατακερματισμός. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Δοµές Δεδοµένων. 17η Διάλεξη Ισορροπηµένα δέντρα. Ε. Μαρκάκης

ΠΛΗ111. Ανοιξη Μάθηµα 8 ο. Αναζήτηση. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Δομές Αναζήτησης. εισαγωγή αναζήτηση επιλογή. εισαγωγή. αναζήτηση

Δυναμικά Σύνολα. Δυναμικό σύνολο. Tα στοιχεία του μεταβάλλονται μέσω εντολών εισαγωγής και διαγραφής. διαγραφή. εισαγωγή

Δυναμικά Σύνολα. Δυναμικό σύνολο. Tα στοιχεία του μεταβάλλονται μέσω εντολών εισαγωγής και διαγραφής. διαγραφή. εισαγωγή

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. Δοµές Δεδοµένων

Κατακερματισμός. 4/3/2009 Μ.Χατζόπουλος 1

Δοµές Δεδοµένων. 11η Διάλεξη Ταξινόµηση Quicksort και Ιδιότητες Δέντρων. Ε. Μαρκάκης

Πίνακες Συμβόλων. εισαγωγή αναζήτηση επιλογή. εισαγωγή. αναζήτηση

Δυναμικός Κατακερματισμός. Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1

Διάλεξη 22: Τεχνικές Κατακερματισμού I (Hashing)

Δυναμικός Κατακερματισμός. Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Ταξινόµηση Mergesort Κεφάλαιο 8. Ε. Μαρκάκης Επίκουρος Καθηγητής

Διάλεξη 18: Τεχνικές Κατακερματισμού I (Hashing)

Δομές Δεδομένων. Ενότητα 11: Τεχνικές Κατακερματισμού. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής.

Δυναμικός Κατακερματισμός. Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1

Δυναμικός Κατακερματισμός. Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1

Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα:

Τα δεδομένα (περιεχόμενο) μιας βάσης δεδομένων αποθηκεύεται στο δίσκο

Δυναμικά Σύνολα. Δυναμικό σύνολο. Tα στοιχεία του μεταβάλλονται μέσω εντολών εισαγωγής και διαγραφής. διαγραφή. εισαγωγή

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Δέντρα Δυαδικής Αναζήτησης Κεφάλαιο 12 ( ) Ε. Μαρκάκης Επίκουρος Καθηγητής

Δοµές Δεδοµένων. 9η Διάλεξη Ταξινόµηση - Στοιχειώδεις µέθοδοι. Ε. Μαρκάκης

Πίνακες (Μια παλιά άσκηση) Πίνακες Κατακερματισμού (Hash Tables) Πίνακες (Μια παλιά άσκηση) Εισαγωγή. A n

Advanced Data Indexing

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Ταξινόµηση Quicksort Κεφάλαιο 7. Ε. Μαρκάκης Επίκουρος Καθηγητής

Διάλεξη 23: Τεχνικές Κατακερματισμού II (Hashing)

Εξωτερική Αναζήτηση. Ιεραρχία Μνήμης Υπολογιστή. Εξωτερική Μνήμη. Εσωτερική Μνήμη. Κρυφή Μνήμη (Cache) Καταχωρητές (Registers) μεγαλύτερη ταχύτητα

Κατακερµατισµός. Οργάνωση Αρχείων (σύνοψη) Οργάνωση αρχείων: πως είναι τοποθετημένες οι εγγραφές ενός αρχείου όταν αποθηκεύονται στο δίσκο

Ουρά Προτεραιότητας (priority queue)

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές Δεδομένων. Ιωάννης Γ. Τόλλης Τμήμα Επιστήμης Υπολογιστών Πανεπιστήμιο Κρήτης

ΕΝΟΤΗΤΑ 8 KATAKEΡΜΑΤΙΣΜΟΣ (HASHING)

Δομές Δεδομένων. Κατακερματισμός. Δομές Δεδομένων & Αλγόριθμοι. Εργαστήριο Γνώσης και Ευφυούς Πληροφορικής 1

Δομές Αναζήτησης. κλειδί από ολικά διατεταγμένο σύνολο. Θέλουμε να υποστηρίξουμε δύο βασικές λειτουργίες: Εισαγωγή ενός νέου στοιχείου

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Ουρές προτεραιότητας Κεφάλαιο 9. Ε. Μαρκάκης Επίκουρος Καθηγητής

Δομές Αναζήτησης. κλειδί από ολικά διατεταγμένο σύνολο. Θέλουμε να υποστηρίξουμε δύο βασικές λειτουργίες: Εισαγωγή ενός νέου στοιχείου

10. Πίνακες Κατακερματισμού

ΠΛΗ111. Ανοιξη Μάθηµα 7 ο. έντρο. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Στοιχειώδεις Δομές Δεδομένων

ΕΝΟΤΗΤΑ 6 ΛΙΣΤΕΣ ΠΑΡΑΛΕΙΨΗΣ (SKIP LISTS)

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΛΥΣΗ ΣΤΗΝ ΕΥΤΕΡΗ ΑΣΚΗΣΗ

Δοµές Δεδοµένων. 10η Διάλεξη Ταξινόµηση. E. Μαρκάκης

Λίστες παράλειψης (skip lists)

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Βασικές Ιδιότητες και Διάσχιση Κεφάλαιο 5 ( και ) Ε. Μαρκάκης Επίκουρος Καθηγητής

Ν. Μ. Μισυρλής. Τµήµα Πληροφορικής και Τηλεπικοινωνιών, Πανεπιστήµιο Αθηνών. Καθηγητής: Ν. Μ. Μισυρλής 29 Μαΐου / 18

Δοµές Δεδοµένων. 6η Διάλεξη Αναδροµικές Εξισώσεις και Αφηρηµένοι Τύποι Δεδοµένων. Ε. Μαρκάκης

Διδάσκων: Κωνσταντίνος Κώστα

Ν!=1*2*3* *(N-1) * N => N! = (Ν-1)! * N έτσι 55! = 54! * 55

Ενότητα 6: Κατακερματισμός Ασκήσεις και Λύσεις

2.1. Εντολές Σχόλια Τύποι Δεδομένων

Προγραµµατισµός 1 Ταξινόµηση - Αναζήτηση

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ

Αλγόριθμοι Ταξινόμησης Μέρος 2

Συλλογές, Στοίβες και Ουρές

Κατακερματισμός (Hashing)

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Ουρές προτεραιότητας Κεφάλαιο 9. Ε. Μαρκάκης Επίκουρος Καθηγητής

ΠΡΑΞΕΙΣ ΜΕ ΕΚΑ ΙΚΟΥΣ

Διδάσκων: Παναγιώτης Ανδρέου

Κατ οίκον Εργασία 3 Σκελετοί Λύσεων

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Αρχές Ανάλυσης Αλγορίθµων Κεφάλαιο 2. Ε. Μαρκάκης Επικ. Καθηγητής

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ - ΤΜΗΥΠ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ ΙI

Προγραμματισμός Ι (ΗΥ120)

Συναρτήσεις Κατακερματισμού και Πίνακες Κατακερματισμού

Αριθμητική Ανάλυση & Εφαρμογές

Εργαστήριο ΨΗΦΙΑΚΗ ΛΟΓΙΚΗ. Εισαγωγή

Linear Hashing. Linear vs other Hashing

Κεφα λαιο 9 Κατακερματισμός

Ανάλυση αλγορίθμων. Χρόνος εκτέλεσης: Αναμενόμενη περίπτωση. - απαιτεί γνώση της κατανομής εισόδου

Δυαδικά Δένδρα Αναζήτησης, Δένδρα AVL

Τμήμα Χρηματοοικονομικής & Ελεγκτικής ΤΕΙ Ηπείρου Παράρτημα Πρέβεζας. Πληροφορική Ι. Αναπαράσταση αριθμών στο δυαδικό σύστημα. Δρ.

Διάλεξη 12: Δέντρα ΙΙ Δυαδικά Δέντρα

Προγραμματιστικές Τεχνικές

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Ισορροπηµένα Δέντρα Κεφάλαιο 13. Ε. Μαρκάκης Επίκουρος Καθηγητής

διεύθυνση πρώτου στοιχείου διεύθυνση i-οστού στοιχείου T t[n]; &t[0] είναι t &t[i] είναι t + i*sizeof(t)

5. Γεννήτριες Τυχαίων Αριθµών.

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

Προγραµµατισµός Ι (ΗΥ120)

Δοµές Δεδοµένων. 2η Διάλεξη Αλγόριθµοι Ένωσης-Εύρεσης (Union-Find) Ε. Μαρκάκης. Βασίζεται στις διαφάνειες των R. Sedgewick K.

Επαναληπτικές δοµές. µτ α.τ. Όχι. ! απαγορεύεται µέσα σε µία ΓΙΑ να µεταβάλλουµε τον µετρητή! διότι δεν θα ξέρουµε µετά πόσες επαναλήψεις θα γίνουν

Βασικές Έννοιες Δοµών Δεδοµένων

Κεφάλαιο 6 Ουρές Προτεραιότητας

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

Δυναμικός Κατακερματισμός

Διαίρει-και-Βασίλευε. Αλγόριθµοι & Πολυπλοκότητα (Χειµώνας 2011) Διαίρει-και-Βασίλευε 2

Ενώσεις δεδομένων Απαριθμητές Ψηφιακοί τελεστές Αναδρομικές συναρτήσεις

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Αλγόριθµοι Ένωσης-Εύρεσης (Union-Find) Κεφάλαιο 1. Ε. Μαρκάκης Επικ. Καθηγητής

Cuckoo Hashing. Αλγόριθμοι και Πολυπλοκότητα. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο

Διάλεξη 17: O Αλγόριθμος Ταξινόμησης HeapSort

Transcript:

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ Κατακερµατισµός Κεφάλαιο 14 Ε. Μαρκάκης Επίκουρος Καθηγητής

Περίληψη Εισαγωγή στον κατακερµατισµό Συναρτήσεις κατακερµατισµού Χωριστή αλυσίδωση Γραµµική διερεύνηση Διπλός κατακερµατισµός Δυναµικός κατακερµατισµός Προοπτική 14-2

Εισαγωγή Βασική ιδέα: άµεσος εντοπισµός στοιχείων Μέχρι τώρα υποθέταµε ότι τα κλειδιά έχουν κάποια διάταξη Οι αλγόριθµοι αναζήτησης που εξετάσαµε στηρίζονται σε λειτουργίες συγκρίσεων µεταξύ κλειδιών Υπάρχει µέθοδος less() Στα Δέντρα Δυαδικής Aναζήτησης εκµεταλλευόµαστε τον τρόπο που έχουµε διατάξει τα κλειδιά Το αριστερό υποδέντρο έχει κλειδιά µικρότερα ή ίσα της ρίζας 14-3

Εισαγωγή Βασική ιδέα: άµεσος εντοπισµός στοιχείων Στον κατακερµατισµό δεν εκµεταλλευόµαστε τη διάταξη Αρκεί να υπάρχει µέθοδος equals() Το κλειδί µετασχηµατίζεται σε θέση (αριθµοδείκτη) πίνακα Απαιτείται συνάρτηση κατακερµατισµού για µετασχηµατισµό Πολλά κλειδιά µπορεί να µετασχηµατίζονται στην ίδια θέση Απαιτείται µέθοδος διαχείρισης συγκρούσεων (collision resolution) για τις θέσεις Μπορεί να γίνει χρησιµοποιώντας λίστες 14-4

Εισαγωγή Ο κατακερµατισµός αναδεικνύει τον ανταγωνισµό χώρου-χρόνου (time-space tradeoff) Αν έχουµε πολλή µνήµη διαθέσιµη, µπορεί να απαιτεί λίγο χρόνο Αν έχουµε πολύ χρόνο διαθέσιµο, µπορεί να απαιτεί λίγη µνήµη Μπορούµε να επιτύχουµε όποια ισορροπία θέλουµε προσαρµόζοντας το µέγεθος του πίνακα κατακερµατισµού 14-5

Εισαγωγή Οι λειτουργίες εισαγωγής και αναζήτησης σε πίνακα συµβόλων µε χρήση κατακερµατισµού µπορεί να γίνουν ακόµα και σε σταθερό χρόνο, Ο(1), και οι 2 (υπό κάποιες προϋποθέσεις) Ο χρόνος εκτέλεσης όµως εξαρτάται και από το µέγεθος κλειδιού Ο κατακερµατισµός δεν παρέχει πολύ αποδοτικές υλοποιήσεις άλλων λειτουργιών όπως η επιλογή του k-οστού µικρότερου στοιχείου 14-6

Συναρτήσεις κατακερµατισµού Μορφή συνάρτησης κατακερµατισµού A: σύνολο αντικειµένων, Μ: µέγεθος πίνακα h: A [0, M-1] Συνήθως µετασχηµατίζουµε µόνο το κλειδί του αντικειµένου Δήλωση: int hash(key k, int M) Iδανικά η έξοδος πρέπει να φαίνεται τυχαία Δηλαδή: Για ένα τυχαία επιλεγµένο αντικείµενο κάθε θέση στον πίνακα θέλουµε να είναι εξίσου πιθανή Τύποι κλειδιών Κάθε τύπος απαιτεί διαφορετική συνάρτηση Στη C χρησιµοποιούµε τη δυαδική µορφή των κλειδιών Η πρακτική αυτή οδηγεί σε µη µεταφέρσιµο κώδικα Στη Java η δυαδική µορφή είναι κρυµµένη Πάντως όλα τα αντικείµενα έχουν µία µέθοδο hashcode! 14-7

Συναρτήσεις κατακερµατισµού Κλειδιά κινητής υποδιαστολής Έστω ότι ανήκουν στο διάστηµα [0,1) h(k) = floor(k*m) µε k [0, 1) Έστω ότι ανήκουν στο διάστηµα [s,t) h(k) = floor((k-s)/(t-s)*m) Παράδειγµα µε Μ = 97 3 collisions, 17, 53, 76 14-8

Συναρτήσεις κατακερµατισµού Ακέραια κλειδιά w bits Διαίρεση µε 2 w για µετατροπή σε [0,1) Συνεχίζουµε όπως για κλειδιά κινητής υποδιαστολής Απλή λύση: h(k) = (k*m)<<w //δεξιά ολίσθηση για τη διαίρεση µε 2 w Αγνοεί πολλά από τα bits του κλειδιού Μπορεί να δηµιουργηθούν έτσι πολλές συγκρούσεις Καλύτερη λύση: h(k)= k mod M (συνάρτηση κατακερµατισµού υπολοίπου) Το M συνίσταται να είναι πρώτος Επιτυγχάνει καλύτερη διασπορά Κάνει και για κινητή υποδιαστολή: h(k) = (k*2 w ) mod M Αν το k έχει w δυαδικά ψηφία στο δεκαδικό µέρος 14-9

Συναρτήσεις κατακερµατισµού Άλλα αντικείµενα Μετατρέπουµε το κλειδί σε δυαδική µορφή Κάθε αντικείµενο είναι ουσιαστικά µία ακολουθία από bits Χρησιµοποιούµε τη µέθοδο του υπολοίπου Γιατί θέλουµε το M να είναι πρώτος; Έστω ότι τα κλειδιά είναι συµβολοσειρές ASCII Τα αντιµετωπίζουµε ως ακεραίους µε βάση το 128 (7 bits) Ιδανικά θέλουµε να χρησιµοποιούµε όλα τα bits (ή το δυνατόν περισσότερα) του αντικειµένου στη συνάρτηση κατακερµατισµού Έστω ότι διαλέγουµε M = 64 = 2 6 Ουσιαστικά χρησιµοποιούµε µόνο τα τελευταία 6 bits µε την k mod M! Είναι καλό να αποφεύγουµε δυνάµεις του 2 Με M πρώτο αποφεύγουµε κοινούς παράγοντες 14-10

Συναρτήσεις κατακερµατισµού Χρήσιµοι πρώτοι αριθµοί Οι δυναµικοί πίνακες µε την πάροδο του χρόνου θα πρέπει να διπλασιάζονται ή να µειώνονται στο µισό ανάλογα µε το πλήθος των εγγραφών Αν το Μ όµως είναι πρώτος, για να διπλασιάσουµε τον πίνακα θα πρέπει να βρούµε κάποιον άλλον πρώτο «κοντά» στο 2Μ Συνήθης τακτική: επιλέγουµε πρώτους αριθµούς που είναι κοντά σε δυνάµεις του 2. π.χ. Mersenne primes: πρώτοι της µορφής 2 m -1 Για αρκετές (αλλά όχι για όλες) τις τιµές του m, o 2 m -1 είναι πρώτος αριθµός Χρησιµοποιούµε συνήθως τον πλησιέστερο πρώτο στο 2 n (από κάτω) 14-11

Συναρτήσεις κατακερµατισµού Εναλλακτική µέθοδος υπολοίπου h(k) = floor(k*a) mod M (για κάποιο πραγµατικό a) Με αυτή τη µέθοδο ο M δεν χρειάζεται πλέον να είναι πρώτος Αρκεί να επιλέξουµε το κατάλληλο a! Μία καλή επιλογή είναι φ = 0,618033 Ο φ είναι η χρυσή τοµή (golden ratio) Παράδειγµα Ακέραια κλειδιά των 16 bits σε δεκαδική µορφή Με h(k) = k % 97 έχουµε καλή κατανοµή Με h(k) = k % 100 έχουµε κακή κατανοµή Ουσιαστικά χρησιµοποιούµε τα 2 δεξιά δεκαδικά ψηφία Με h(k) = (int) (φ * k) % 100 έχουµε καλή κατανοµή Το φ αναιρεί τα προβλήµατα του 100 14-12

Συναρτήσεις κατακερµατισµού Σε πολλές περιπτώσεις, τα κλειδιά δεν είναι αριθµοί αλλά strings Αλφαριθµητικά κλειδιά µεγάλου µήκους Για να εφαρµόσουµε συνάρτηση κατακερµατισµού σε τέτοια κλειδιά, µπορούµε να τα γράψουµε σε δυαδική µορφή (7 bits για κάθε χαρακτήρα) Π.χ. now 110 (128) 2 + 111(128) 1 + 119 (128) 0 Για µεγάλα κλειδιά όµως θα έχουµε υπερχείλιση πριν πάµε να υπολογίσουµε το υπόλοιπο mod M 14-13

Συναρτήσεις κατακερµατισµού Ιδέα: Αν k = k n k n-1 k 3 k 2 k 1 k 0 128 0 k 0 + 128 1 k 1 + 128 2 k 2 + 128 3 k 3 + Ξαναγράφουµε σύµφωνα µε τον αλγόριθµο του Horner (δείτε Κεφ. 4) ( (((k n 128 + k n-1 ) 128 +k n-2 ) 128 + k n-3 ) ) 128 +k 1 )128 +k 0 Υπολογίζουµε το υπόλοιπο mod M σε κάθε βήµα (µετά τον πολλαπλασιασµό και την πρόσθεση) Δεν αλλάζει το τελικό αποτέλεσµα 14-14

Συναρτήσεις κατακερµατισµού Καθολικός κατακερµατισµός (universal hashing) Βασίζεται στην παραπάνω µέθοδο Η ιδέα είναι να ελαχιστοποιήσουµε την πιθανότητα σύγκρουσης κλειδιών Χρήση τυχαίων παραγόντων για κάθε ψηφίο (αντί για το 128 που είδαµε πριν) Συνήθως οι αριθµοί είναι ψευδοτυχαίοι Παράγονται από γεννήτρια τυχαίων αριθµών Πιθανότητα σύγκρουσης 1/M για πίνακα µεγέθους M static int hashu(string s, int M) { int h = 0, a = 31415, b = 27183; for (int i = 0; i < s.length(); i++) { h = (a*h + s.charat(i)) % M; a = a*b % (M-1); } return h; } Η γεννήτρια τυχαίων αριθµών είναι µέσα στον κώδικα 14-15

Χωριστή αλυσίδωση (Separate Chaining) Πώς διαχειριζόµαστε τις συγκρούσεις? Διαχείριση συγκρούσεων µε λίστες Σε κάθε θέση του πίνακα ξεκινάει µία λίστα Τα αντικείµενα που συγκρούονται τοποθετούνται στη λίστα Διατεταγµένη ή µη διατεταγµένη λίστα Συνήθως µη διατεταγµένη λόγω µικρού µήκους Πιθανόν µεγάλη σπατάλη χώρου Κάθε θέση απαιτεί έναν δείκτη σε λίστα 14-16

Χωριστή αλυσίδωση Κόστος πράξεων Εισαγωγή: σταθερό κόστος Ο(1) σε µη διατεταγµένη λίστα Η εισαγωγή γίνεται στην αρχή της λίστας Αναζήτηση: N/M κατά µέσο όρο για N στοιχεία σε M λίστες Το µέσο µήκος των λιστών είναι N/M Άρα Ο(1) κατά µέσο όρο όταν Ν = Ο(Μ) (π.χ. όταν Ν = 5Μ ή πιο γενικά όταν Ν = c M για κάποια σταθερά c) Μπορεί βέβαια µία λίστα να έχει N στοιχεία και όλες οι άλλες κανένα! (πάρα πολύ µικρή πιθανότητα για κάτι τέτοιο αν είµαστε προσεκτικοί) Πόσο µεγάλες είναι οι λίστες στην πράξη; Είναι σχεδόν πάντα πολύ κοντά στο N/M! (αν είναι καλή η συνάρτηση κατακερµατισµού) 14-17

Χωριστή αλυσίδωση Υλοποίηση χωριστής αλυσίδωσης private Node[] heads; private int N, M; ST(int maxn) {//maxn = εκτίµηση πλήθους στοιχείων N = 0; M = maxn/5; heads = new Node[M]; } ITEM search(key key) { return searchr(heads[hash(key, M)], key); } //αναδροµική αναζήτηση σε αταξινόµητη λίστα (Κεφ. 12) void insert(item x) { int i = hash(x.key(), M); heads[i] = new Node(x, heads[i]);//εισαγωγή N++; } //στην αρχή 14-18

Χωριστή αλυσίδωση Ιδιότητα 1: Η πιθανότητα µία λίστα να έχει µήκος πολύ κοντά στο Ν/Μ µετά την εισαγωγή Ν στοιχείων τείνει στο 1 Απόδειξη µε χρήση Poisson approximation Τέτοιου είδους προβλήµατα αναφέρονται συνήθως ως occupancy problems Ιδιότητα 2: Κατά µέσο όρο η πρώτη σύγκρουση συµβαίνει όταν έχουµε εισάγει περίπου 1.25 Μ στοιχεία Birthday paradox! Iδιότητα 3: Οι λίστες ουσιαστικά συµπεριφέρονται σαν στοίβες (αφού κάνουµε εισαγωγή στην αρχή) Πολύ χρήσιµη ιδιότητα για τον πίνακα συµβόλων ενός compiler 14-19

Χωριστή αλυσίδωση Ανταγωνισµός χώρου-χρόνου Ο παράγοντας α = N/M παίζει κεντρικό ρόλο Αυξάνοντας το M µειώνεται το µήκος των λιστών Ταχύτερη αναζήτηση, αλλά περισσότερος χώρος για δείκτες Στην πράξη διαλέγουµε συνήθως M = Ν/5 ή N/10 Όταν το N µεταβάλλεται χρησιµοποιούµε δυναµικούς πίνακες Χειρισµός διπλών κλειδιών Αν επιτρέπονται, η εισαγωγή δεν αλλάζει Στην αναζήτηση πρέπει να ψάχνουµε όλη τη λίστα Αν δεν επιτρέπονται, η αναζήτηση δεν αλλάζει Στην εισαγωγή πρέπει να ψάχνουµε όλη τη λίστα Μειονεκτήµατα κατακερµατισµού Ακατάλληλος για επιλογή k-οστού µικρότερου/µεγαλύτερου στοιχείου και για ταξινόµηση 14-20

Γραµµική διερεύνηση (Linear Probing) Κατακερµατισµός ανοιχτής διευθυνσιοδότησης (open addressing) Αντίθετη προσέγγιση από τη χωριστή αλυσίδωση Διαχείριση συγκρούσεων χωρίς λίστες Τα στοιχεία τοποθετούνται µέσα στον πίνακα Πρέπει να ισχύει πάντα ότι M > N Διάφορες µέθοδοι εντοπισµού µιας θέσης 14-21

Γραµµική διερεύνηση (Linear Probing) Γραµµική διερεύνηση Χρήση της πρώτης κενής θέσης Ξεκινάµε στο σηµείο που µας λέει η συνάρτηση Σαρώνουµε κυκλικά τον πίνακα (µε φορά προς τα δεξιά) Εισαγωγή: εισάγουµε το στοιχείο στο πρώτο κενό Μπορεί να είναι η αρχική θέση αν δεν έχουµε σύγκρουση Αναζήτηση: επιτυχία αν βρούµε το στοιχείο Αποτυχία αν φτάσουµε σε κενή θέση (υπάρχει πάντα επειδή Μ > Ν) 14-22

Γραµµική διερεύνηση Υλοποίηση γραµµικής διερεύνησης private ITEM[] st; private int N, M; ST(int maxn) { N = 0; M = 2*maxN; st = new ITEM[M]; } void insert(item x) { int i = hash(x.key(), M); while (st[i]!= null) i = (i+1) % M; st[i] = x; N++; } ITEM search(key key) { int i = hash(key, M); while (st[i]!= null) if (equals(key, st[i].key())) return st[i]; else i = (i+1) % M; return null; } 14-23

Γραµµική διερεύνηση Ανταγωνισµός χώρου-χρόνου Ο παράγοντας α = N/M παίζει πάλι κεντρικό ρόλο Εδώ όµως α < 1 ενώ στην χωριστή αλυσίδωση α > 1 Το α εδώ ονοµάζεται συντελεστής πλήρωσης (load factor) Όσο το α προσεγγίζει το 1 τόσο επιβραδύνονται οι πράξεις Τόσο όµως µειώνεται η επιβάρυνση σε χώρο Το κόστος εξαρτάται και από τα clusters στον πίνακα Cluster (συστοιχία) = µία ακολουθία συνεχόµενων µη κενών θέσεων Μέσο κόστος πράξεων (Knuth 1962) Επιτυχής αναζήτηση: (1+1/(1-α))/2 Ανεπιτυχής αναζήτηση: (1+1/(1-α) 2 )/2 Πολύ καλή προσέγγιση όσο το α είναι µακριά από το 1 Στην πράξη προσπαθούµε να κρατάµε το α κοντά στο ½ Τα παραπάνω κόστη γίνονται 1,5 και 2,5 14-24

Γραµµική διερεύνηση Χειρισµός διπλών κλειδιών Παρόµοιος µε αυτόν της χωριστής αλυσίδωσης Αφαίρεση κλειδιών: αφήνει κενό στη συστοιχία! Μπορεί να προκαλέσει λάθη σε µελλοντικές αναζητήσεις Επανεισαγωγή των επόµενων κλειδιών της συστοιχίας public void remove(item x) { int i = hash(x.key(), M); while (st[i]!= null) if (equals(x.key(), st[i].key())) break; else i = (i+1) % M; if (st[i] == null) return; st[i] = null; N--; for (int j = i+1; st[j]!= null; j = (j+1) % M) { x = st[j]; st[j] = null; insert(x); N--; } } //προσοχή στην ενηµέρωση του Ν 14-25

Διπλός κατακερµατισµός Παραλλαγή της γραµµικής διερεύνησης Η γραµµική διερεύνηση µπορεί να δηµιουργήσει µεγάλα clusters Για αποφυγή των clusters: Χρήση δεύτερης συνάρτησης κατακερµατισµού g Αναζήτηση: προχωράµε δεξιόστροφα όπως στη γραµµική διερεύνηση, αλλά µε βήµα αναζήτησης το g(k) Κοιτάµε πρώτα τη θέση h(k) Αν δεν υπάρχει εκεί (και δεν είναι null) κοιτάµε τη θέση h(k) + g(k) Μετέπειτα τη θέση h(k) + g(k) + g(k) κ.o.κ. Στην απλή γραµµική διερεύνηση το βήµα είναι ίσο µε 1 14-26

Διπλός κατακερµατισµός Επιλογή της δεύτερης συνάρτησης g(k) > 0 για να µην έχουµε άπειρο βρόχο g(k) πρώτο σε σχέση µε το M Παράδειγµα: (k % 97) + 3 Μέσο κόστος πράξεων (Guibas & Szemeredi) Επιτυχής αναζήτηση: ln(1/(1-α))/α Ανεπιτυχής αναζήτηση: 1/(1-α) 14-27

Διπλός κατακερµατισµός Υλοποίηση διπλού κατακερµατισµού void insert(item x) { KEY key = x.key(); int i = hash(key, M); int k = hashtwo(key); //2 η συνάρτηση κατακερµατισµού while (st[i]!= null) i = (i+k) % M; //βήµα = k st[i] = x; N++; } ITEM search(key key) { int i = hash(key, M); int k = hashtwo(key); while (st[i]!= null) if (equals(key, st[i].key())) return st[i]; else i = (i+k) % M; return null; } 14-28

Διπλός κατακερµατισµός Κέρδος χρόνου για σταθερή επιβάρυνση µνήµης Για α = 0,5 µέσο κόστος επιτυχούς/ανεπιτυχούς αναζήτησης είναι 1,4 και 1,5 αντίστοιχα Στη γραµµική διερεύνηση ήταν 1,5 και 2,5 αντίστοιχα Κέρδος µνήµης για σταθερό κόστος χρόνου Έστω ότι θέλουµε το πολύ t διερευνήσεις ανά πράξη Οι ανεπιτυχείς αναζητήσεις είναι πάντα πιο αργές Στη γραµµική διερεύνηση πρέπει α 1-1/sqrt(2t-1) (από τύπους του Knuth) Στο διπλό κατακερµατισµό πρέπει α 1-1/t Για t=10 οι τιµές είναι α = 68% και α = 90% αντίστοιχα Άρα µε φιξαρισµένο το t, κερδίζουµε σε µνήµη στον διπλό κατακερµατισµό Αφαίρεση στοιχείων Δεν λειτουργεί η µέθοδος της γραµµικής διερεύνησης Δεν ξέρουµε ποια στοιχεία πέρασαν από το αφαιρούµενο! Χρήση ειδικών στοιχείων φρουρών αντί για κενά 14-29

Δυναµικός κατακερµατισµός Χειρισµός δυναµικού πλήθους κλειδιών Προσπαθούµε να διατηρήσουµε ένα κατάλληλο α Αλλαγή µεγέθους πίνακα ανάλογα µε τα κλειδιά Παράδειγµα µε γραµµική διερεύνηση Όταν το α περάσει το 50% διπλασιάζουµε τον πίνακα Όταν το α πέσει κάτω από 12,5% υποδιπλασιάζουµε τον πίνακα Διατήρηση του α ανάµεσα στο 25% και το 50% Τα κλειδιά επανεισάγονται σε κάθε αλλαγή Κάποιες πράξεις κοστίζουν πολύ περισσότερο από τις άλλες (π.χ. η εισαγωγή όταν συνοδεύεται από διπλασιασµό) Το µέσο κόστος όµως είναι σταθερό! Μετά από αλλαγή µεγέθους ο πίνακας έχει Μ/4 κλειδιά Θα διπλασιαστεί µετά από Μ/4 τουλάχιστον εισαγωγές Θα υποδιπλασιαστεί µετά από Μ/8 τουλάχιστον διαγραφές 14-30

Δυναµικός κατακερµατισµός Υλοποίηση δυναµικού κατακερµατισµού Ο υποδιπλασιασµός είναι παρόµοιος µε τον διπλασιασµό private ITEM[] st; private int N, M; ST(int maxn) { N = 0; M = 4; st = new ITEM[M]; } private void expand() { ITEM[] t = st; N = 0; M = M+M; st = new ITEM[M]; for (int i = 0; i < M/2; i++) if (t[i]!= null) insert(t[i]); } void insert(item x) { int i = hash(x.key(), M); while (st[i]!= null) i = (i+1) % M; st[i] = x; if (N++ >= M/2) expand(); } 14-31

Προοπτική Γραµµική διερεύνηση ή διπλός κατακερµατισµός; Η γραµµική διερεύνηση είναι ταχύτερη αλλά ο διπλός κατακερµατισµός είναι πιο οικονοµικός σε µνήµη Απαιτεί όµως τον υπολογισµό µιας δεύτερης συνάρτησης Χωριστή αλυσίδωση ή γραµµική διερεύνηση; Η χωριστή αλυσίδωση παρέχει απλές υλοποιήσεις Εξαρτάται όµως και από το κόστος των συνδέσµων Έστω σύστηµα χωριστής αλυσίδωσης, µε Μ λίστες των 4 στοιχείων Έστω ότι κάθε σύνδεσµος απαιτεί µία λέξη µηχανης Το κόστος µνήµης είναι 9Μ λέξεις (4Μ στοιχεία + 5Μ δείκτες) Μέσος χρόνος επιτυχούς αναζήτησης: 2 διερευνήσεις (µισή λίστα) Έστω γραµµική διερεύνηση σε πίνακα 9Μ θέσεων (ίδια µνήµη µε χωρ. αλυσ.) Έχουµε α = 4Μ στοιχεία / 9Μ θέσεις = 4/9 Μέσος χρόνος επιτυχούς αναζήτησης: (1+1/(1-4/9))/2 = 1,4 < 2, άρα καλύτερα Για 2 διερευνήσεις αρκεί να έχουµε πίνακα 6Μ (δηλ. λιγότερη µνήµη από 9Μ) 14-32