Διάλεξθ 22: Τεχνικζσ Κατακερματιςμοφ I (Hashing) Στθν ενότθτα αυτι κα μελετθκοφν τα εξισ επιμζρουσ κζματα: - Αναςκόπθςθ Προβλιματοσ και Προκαταρκτικϊν Λφςεων Bit-Διανφςματα - Τεχνικζσ Κατακερματιςμοφ & Συναρτιςεισ Κατακερματιςμοφ - Διαχείριςθ Συγκροφςεων με Αλυςίδωςθ ΕΠΛ231 Δομζσ Δεδομζνων και Αλγόρικμοι 1
Ειςαγωγι Το πρόβλθμα Το Πρόβλθμα Ζχουμε ζνα ςτοιχείο u. Θζλουμε κάποια αποδοτικι δομι θ οποία κα μασ επιτρζψει να εκτελζςουμε τισ ακόλουκεσ δυο πράξεισ ςε ςτακερό χρόνο Ο(1). Εφρεςθ ςτοιχείου u ςε μια ςυλλογι S (δθλ. Find(u,S)). Ειςαγωγι του u ςτθν ςυλλογι S (δθλ. Insert(u, S)) Παράδειγμα Η ςυλλογι S περιζχει μια μεγάλθ λίςτα φοιτθτϊν. Θζλουμε να βροφμε αν ο u= Νεόφυτοσ Χαραλάμπουσ είναι μζροσ αυτισ τθσ λίςτασ. Aν δεν είναι ςτθν λίςτα, τότε κζλουμε να τον ειςάγουμε. ΕΠΛ231 Δομζσ Δεδομζνων και Αλγόρικμοι 2
Ειςαγωγι Αναςκόπθςθ Λφςεων Ακατάλλθλεσ Υλοποιιςεισ 1. Συνδεδεμζνθ λίστα Insert: Ο(1), Find: O(n) Προχποκζτει τθν εκτζλεςθ τθσ find, για να επιβεβαιϊςουμε ότι δεν ζγινε ιδθ θ ειςαγωγι Marios Costas Maria 2. Iσοηυγισμζνο δζνδρο αναηιτθσθς Insert: O(log m n), Find: O(log m n) n: o αρικμόσ των κόμβων και m: o βακμόσ (branching factor) κάκε κόμβου. ΕΠΛ231 Δομζσ Δεδομζνων και Αλγόρικμοι 3
Ειςαγωγι Αναςκόπθςθ Λφςεων II Υπάρχει πιο αποδοτικι μζκοδοσ από τθ χριςθ ιςοηυγιςμζνων δζνδρων; Ναι, δεδομζνου ότι υπάρχει μια ςυνάρτθςθ θ οποία μασ επιτρζπει για κάκε ςτοιχείο u, να βροφμε τθν ακριβι κζςθ του u ςτον πίνακα. Μια απλι λφςθ είναι να απεικονίςουμε το ςφνολο S U (όπου U είναι το πεδίο οριςμοφ τθσ S) με ζνα διάνυςμα διφίων (διάνυςμα δυαδικϊν ψθφίων, bit-vector). Παρόμοια δομι χρθςιμοποιιςαμε και ςτον αλγόρικμο ταξινόμθςθσ bucketsort. ΕΠΛ231 Δομζσ Δεδομζνων και Αλγόρικμοι 4
Bit vectors (Διανφςματα Διφφων) Ζνα bit-vector είναι μονοδιάςτατοσ πίνακασ με n bits, Bits[1..n], τζτοιοσ ϊςτε: Bits[u] = 1, αν u S και Bits[u] = 0, αν u S Για παράδειγμα αν U =,1,,9- τότε το ςφνολο S = {1, 3, 7} αναπαρίςταται ωσ το bit-vector: Bits = [1,0,1,0,0,0,1,0,0] Ο χρόνοσ εφρεςθσ και ειςαγωγισ / αναηιτθςθσ κάποιου ςτοιχείου είναι ςε χρόνο Ο(1)! Πρόβλθμα: Αν το U είναι πολφ μεγαλφτερο από το S τότε ςπαταλάμε πάρα πολφ χϊρο! Λφςθ: ο Κατακερματιςμόσ (hashing) που είναι μια οικογζνεια μεκόδων που αντιςτοιχεί ζνα κλειδί ςε μία κζςθ ενόσ πίνακα (keyto-address transformation). ΕΠΛ231 Δομζσ Δεδομζνων και Αλγόρικμοι 5
Βαςικι Ιδζα Κατακερματιςμοφ Ζςτω το ςφνολο ακεραίων S από το πεδίο οριςμοφ U S= {0, 1, 2, 3, 4, 5, 8, 30, 57} (U=[0..99]) Θα φτιάξουμε ζνα Πίνακα Κατακερματιςμοφ (Hash Table), o οποίοσ ςτο παράδειγμα μασ ζχει μζγεκοσ hsize=5 (το μζγεκοσ είναι ςυνικωσ ςυναρτιςει του διακζςιμου χϊρου) Χρθςιμοποιϊντασ κάποια ςυνάρτθςθ κατακερματιςμοφ (hashing function) h(key), κα ειςάγουμε τα ςτοιχεία του S ςτο hashtable. Παράδειγμα (hsize: 5) H data Hash Function h(key): key mod hsize 0 0, 5, 30 To mod (%) είναι το υπόλοιπο τθσ διαίρεςθσ Κλειδί u h(u) Αν ψάχνουμε το key=21, τότε ξζρω ότι πρζπει να ψάξω ςτθν κζςθ 1 (21 mod 5) Αν ψάχνω το key=4; 1 1, 2 2, 57 3 3, 8 4 4, ΕΠΛ231 Δομζσ Δεδομζνων και Αλγόρικμοι 6
Κατακερματιςμόσ Οριςμοί Πίνακασ κατακερματιςμοφ (hash table) είναι μια δομι δεδομζνων που υποςτθρίηει τισ διαδικαςίεσ insert και find ςε (ςχεδόν) ςτακερό χρόνο O(1). Ζνασ πίνακασ κατακερματιςμοφ χαρακτθρίηεται από 1. το μζγεκοσ του, hsize, και 2. κάποια ςυνάρτθςθ κατακερματιςμοφ h θ οποία αντιςτοιχεί κλειδιά ςτο ςφνολο των ακεραίων *0,, hsize 1+ (εφόςον εφαρμοςτεί το MOD) Tα δεδομζνα αποκθκεφονται ςτον πίνακα H*0,, hsize 1]: το κλειδί k αποκθκεφεται ςτον H ςτθ κζςθ H[h(k)]. ΕΠΛ231 Δομζσ Δεδομζνων και Αλγόρικμοι 7
Κατακερματιςμόσ Ερωτιματα Ωςτόςο τo hashtable δεν είναι ιδανικό για να ανακτοφμε τα ςτοιχεία ταξινομθμζνα, ι γενικότερα, για αναηθτιςεισ ςε κάποιο εφροσ (range queries). π.χ. Αν ψάχνω κλειδιά μεταξφ 2-10 (range query); κα πρζπει δυςτυχϊσ να κοιτάξω ςε όλεσ τισ κζςεισ του πίνακα. Επίςθσ, δθμιουργοφνται δφο νζα ςθμαντικά ερωτιματα: 1. ποια είναι καλι επιλογι για τθ ςυνάρτθςθ κατακερματιςμοφ h; 2. τι κα πρζπει να γίνεται αν πολλά κλειδιά είναι ςτο ίδιο bucket (κάδο). Τζτοιου είδουσ ςυγκροφςεισ (collisions), είναι πολφ πικανό να ςυμβοφν. Δθλαδι για δφο κλειδιά k 1, k 2, με k 1 k 2, το bucket να είναι ο ίδιοσ h(k 1 ) = h(k 2 ) ; ΕΠΛ231 Δομζσ Δεδομζνων και Αλγόρικμοι 8
1) Επιλογι Συνάρτθςθσ Κατακερματιςμοφ Ιδιότθτεσ μιασ καλισ ςυνάρτθςθσ κατακερματιςμοφ: 1. Θα πρζπει να χρθςιμοποιεί ολόκλθρο τον πίνακα *0 hsize 1]. 2. Θα πρζπει να ςκορπίηει ομοιόμορφα τα κλειδιά ςτον πίνακα Η. 3. Θα πρζπει να υπολογίηεται εφκολα. Η ςυνάρτθςθ h αρχικά αντιςτοιχίηει το κλειδί ςε κάποιο ακζραιο αρικμό a και ςτθ ςυνζχεια παίρνει τθν τιμι «a mod hsize». Πρζπει επίςθσ να μποροφμε να υπολογίηουμε τθν ςυνάρτθςθ κατακερματιςμοφ για ςυμβολοςειρζσ! ΕΠΛ231 Δομζσ Δεδομζνων και Αλγόρικμοι 9
Παράδειγμα Συνάρτθςθσ Κατακερματιςμοφ // Η ζσνάρηηζη καηακερμαηιζμού αθροίζει όλοσς ηοσς ταρακηήρες ηοσ string s, και ζηην ζσνέτεια βρίζκει ηο σπόλοιπο από ηην διαίρεζη με ηο hsize int hash(char *s, int hsize) { int hash = 0; } while ((*s)!= '\0') { hash += (*s); s++; } return (hash % hsize); int main() { char *name1 = "cat"; char *name2 = "car"; char *name3 = "cap"; Κλειδί u h(u) H data 0 car printf("%s hashes to bucket %d\n", name1, hash(name1, 5)); printf("%s hashes to bucket %d\n", name2, hash(name2, 5)); printf("%s hashes to bucket %d\n", name3, hash(name3, 5)); 1 2 cat 3 cap 4 } return 0; Output> car hashes to bucket 2 cat hashes to bucket 0 cap hashes to bucket 3 ΕΠΛ231 Δομζσ Δεδομζνων και Αλγόρικμοι 10
1) Επιλογι Συνάρτθςθσ Κατακερματιςμοφ Ζςτω ότι το κλειδί είναι αλυςίδα από 3 χαρακτιρεσ s[0]..s[2]. Παραδείγματα ςυνάρτθςθσ κατακερματιςμοφ είναι: A) Function 1 (Απλι ςυνάρτθςθ): Tο άκροιςμα των κωδικϊν ASCII των χαρακτιρων s[0] + s[1] + s[2] Πρόβλθμα: Λζξεισ μποροφν να ζχουν το ίδιο άκροιςμα π.χ. Οι λζξεισ cat και tac κα ζχουν το άκροιςμα 99+97+116 == 116+97+99 B) Function 2 (Βελτιωμζνθ Λφςθ): (Υποκζςτε ότι οι χαρακ. είναι Ascii-7bit) (s[0]+127*0) + (s[1]+127*1) + (s[1]+127*2) Τϊρα κάκε επί-μζρουσ άκροιςμα απζχει το πιο λίγο κατά 128 από το επόμενο. Ωςτόςο εάν ζχουμε χαρακτιρεσ ςε κάποια άλλθ κωδικοποίθςθ π.χ. UNICODE-16bit τότε αυτό μασ δίδει πολφ μεγάλουσ αρικμοφσ. C) Function 3 (Η ςυνάρτθςθ hashcode() ςτθν γλϊςςα JAVA) s[n-1] * 31 0 + s[n-2] * 31 1 +. + s*1+*31 (n-2) + s[0]*31 (n-1) Όπου n είναι to μικοσ του string. Tο hash κάποιου κενοφ string είναι 0. π.χ. cat => n=3 => (t)99 + (a)97*31 1 + (c)116* 31 2 = 114,582 H επιλογι του 31 δεν είναι τυχαία. Είναι Prime & επίςθσ υπολογίηεται αποδοτικά με ζνα shift (a * 31 == (a << 5-1) (Άλλοι αρικμοί που ζχουν τζτοιεσ ιδιότθτεσ 17,31,127, ) ΕΠΛ231 Δομζσ Δεδομζνων και Αλγόρικμοι 11
1. Συνάρτθςθ Κατακερματιςμοφ (ςυνζχεια) Συνάρτθςθ Κατακερματιςμοφ Πολλζσ φορζσ οι ςυμβολοςειρζσ μπορεί να είναι πολφ μεγάλεσ «1304 Lincoln Ave, Alameda, 94501, CA, USA», που κα κάνει ακριβό τον υπολογιςμό τθσ ςυνάρτθςθσ κατακερματιςμοφ. Για αυτό μπορεί να χρθςιμοποιοφνται επιλεκτικά κάποιοι χαρακτιρεσ (π.χ. κάκε 10οσ) Μζγεκοσ Πίνακα Κατακερματιςμοφ Αν το μζγεκοσ του πίνακα κατακερματιςμοφ είναι πολφ μεγάλο (π.χ. 10,000) και οι τιμζσ παράγονται όλεσ ςε κάποιο μικρό-διάςτθμα τότε κα υπάρχουν πολλζσ ςυγκροφςεισ. Παράδειγμα: Ζνα ςφνολο λζξεων όπου κάκε λζξθ αποτελείται από 10 χαρακτιρεσ ASCII- 7bit. Το ςυνολικό άκροιςμα τθσ κάκε λζξθσ είναι το πολφ 10x127=1,270. Άρα όλεσ οι πικανζσ 127^10 γραμματοςειρζσ κα βρίςκονται ςτισ πρϊτεσ 1270%10000=1270 κζςεισ του πίνακα και οι υπόλοιπεσ 10000-1270=8730 κα είναι άδειεσ παρόλο που χρθςιμοποιιςαμε το MODulo. To κζμα τθσ εφρεςθσ τθσ πιο κατάλλθλθσ ςυνάρτθςθσ κατακερματιςμοφ είναι δφςκολο. Πάντοτε κα είναι πικανι θ φπαρξθ ςυγκροφςεων! Πωσ γίνεται θ διαχείριςθ ςυγκρουόμενων κλειδιϊν; Οι τεχνικζσ λφςεισ διακρίνονται ςε 2 κατθγορίεσ: μζκοδοι με Αλυςίδωςθ (Chaining) και μζκοδοι Ανοικτισ Διεφκυνςθσ (Open Addressing) ΕΠΛ231 Δομζσ Δεδομζνων και Αλγόρικμοι 12
Διαχείριςθ ςυγκροφςεων με Αλυςίδωςθ (Chaining) Αφοφ περιςςότερα από ζνα κλειδιά μποροφν να πάρουν τθν ίδια τιμι από τθ ςυνάρτθςθ κατακερματιςμοφ, μποροφμε να κεωριςουμε ότι κάκε κζςθ του πίνακα δείχνει ςε μια ευκφγραμμθ απλά ςυνδεδεμζνθ λίςτα. Για κάκε i, ςτθ κζςθ Η*i+ του πίνακα βρίςκουμε λίςτα που περιζχει όλα τα κλειδιά που απεικονίηονται από τθ ςυνάρτθςθ h ςτθ κζςθ αυτι. Για να βροφμε κάποιο κλειδί k, πρζπει να ψάξουμε ςτθ λίςτα που δείχνεται ςτθ κζςθ H[h(k)]. Ειςαγωγζσ και εξαγωγζσ ςτοιχείων μποροφν να γίνουν εφκολα με βάςθ τισ διαδικαςίεσ ςυνδεδεμζνων λιςτϊν. ΕΠΛ231 Δομζσ Δεδομζνων και Αλγόρικμοι 13
Παράδειγμα Διαχείριςθσ με Αλυςίδωςθ 0 1 2 3 4 5 6 7 8 9 10 34 67 46 114 26 17 85 hsize = 11 ΕΠΛ231 Δομζσ Δεδομζνων και Αλγόρικμοι 14
Ανάλυςθ τθσ Τεχνικισ Αλυςίδωςθσ Ειςαγωγι Στοιχείου: απαιτεί χρόνο Ο(1). (προςκικθ ςτθν αρχι) Εφρεςθ/διαγραφι Κλειδιοφ k ςυνεπάγεται τθ διζλευςθ τθσ λίςτασ H[h(k)]. Για να αναλφςουμε τον χρόνο εκτζλεςθσ των πιο πάνω διαδικαςιϊν ορίηουμε τον ςυντελεςτι φορτίου (load factor) λ του πίνακα H ωσ τον λόγο λ = (αρικμόσ των ςτοιχείων που αποκθκεφει ο πίνακασ ) / hsize π.χ. 100 τιμζσ ςε 5 buckets => λ=20.0 Δθλαδι, κατά μζςο όρο, κάκε λίςτα του πίνακα ζχει μικοσ λ. Εφρεςθ bucket To ςτοιχείο δεν υπάρχει (χειρίςτθ περίπτωςθ): O(1+λ) Αναηιτθςθ Λίςτασ To ςτοιχείο υπάρχει (μζςθ περίπτωςθ): O(1+λ/2) Όπου Ο(1) κόςτοσ για εφρεςθ του bucket και Ο(λ) & Ο(λ/2) αντίςτοιχα για ανάλυςθ των ςτοιχείων τθσ λίςτασ. Ιδανικά κα κζλαμε ο λόγοσ λ να ζχει ςτακερι τιμι (ςυνικωσ κοντά ςτο 1), ϊςτε οι διαδικαςίεσ να εκτελοφνται ςε ςτακερό χρόνο. Στθν ςυνζχεια κα δοφμε τεχνικζσ δυναμικισ αφξθςθσ / μείωςθσ του πίνακα ςε ςυνδυαςμό με διαδικαςίεσ επανακερματιςμοφ, ζτςι ϊςτε το μζγεκοσ του πίνακα να είναι πάντα ανάλογο του αρικμοφ των ςτοιχείων. ΕΠΛ231 Δομζσ Δεδομζνων και Αλγόρικμοι 15
Διάλεξθ 23: Τεχνικζσ Κατακερματιςμοφ II (Hashing) Στθν ενότθτα αυτι κα μελετθκοφν τα εξισ επιμζρουσ κζματα: - Διαχείριςθ Συγκροφςεων με Ανοικτι Διεφκυνςθ a) Linear Probing, b) Quadratic Probing c) Double Hashing - Διατεταγμζνοσ Κατακερματιςμόσ (Ordered Hashing) - Επανακατακερματιςμόσ (Rehashing) - Εφαρμογζσ Κατακερματιςμοφ ΕΠΛ231 Δομζσ Δεδομζνων και Αλγόρικμοι 16
Διαχείριςθ Συγκροφςεων με ανοικτι διεφκυνςθ H αντιμετϊπιςθ ςυγκροφςεων με αλυςίδωςθ περιλαμβάνει επεξεργαςία δεικτϊν και δυναμικι χοριγθςθ μνιμθσ. Επίςθσ δθμιουργοφνται overflow chains, τα οποία κα κάνουν τισ αναηθτιςεισ ακριβότερεσ ςτθν ςυνζχεια Η ςτρατθγικι ανοικτισ διεφκυνςθσ επιτυγχάνει τθν αντιμετϊπιςθ ςυγκροφςεων χωρίσ τθ χριςθ δεικτϊν. Τα ςτοιχεία αποκθκεφονται κατ ευκείαν ςτον πίνακα κατακερματιςμοφ ωσ εξισ: Για να ειςαγάγουμε το κλειδί k ςτον πίνακα: 1. υπολογίηουμε τθν τιμι i=h(k), και 2. αν θ κζςθ Η*i+ είναι κενι τότε αποκθκεφουμε εκεί το k, 3. διαφορετικά, δοκιμάηουμε τισ κζςεισ f(i), f(f(i)),, για κάποια ςυνάρτθςθ f, μζχρισ ότου βρεκεί κάποια κενι κζςθ όπου και τοποκετοφμε το k. Για τθν αναηιτθςθ κάποιου κλειδιοφ k μζςα ςτον πίνακα: 1. υπολογίηουμε τθν τιμι i=h(k), και 2. κάνουμε διερεφνθςθ τθσ ακολουκίασ, i, f(i), f(f(i)),, μζχρι, είτε να βροφμε το κλειδί, είτε να βροφμε κενι κζςθ, ι να περάςουμε από όλεσ τισ κζςεισ του πίνακα. ΕΠΛ231 Δομζσ Δεδομζνων και Αλγόρικμοι 17
Γραμμικι Αναηιτθςθ Ανοικτισ Διεφκυνςθσ (Linear Probing) H αρχικι ςυνάρτθςθ κατακερματιςμοφ είναι f(x) = x mod hsize Όταν υπάρξει ςφγκρουςθ (collision) δοκιμάηουμε αναδρομικά τθν επόμενθ ςυνάρτθςθ μζχρι να βρεκεί κενι κζςθ: f(x)= (f(x) +i) mod hsize (i=1,2,3, ) Δθλαδι θ αναηιτθςθ κενισ κζςθσ γίνεται ςειριακά, και θ αναηιτθςθ ονομάηεται γραμμικι (linear probing). Παράδειγμα: hsize = 11, ειςαγωγι 11, 12, 15, 19, 26, 48. 0 1 2 3 4 5 6 7 8 9 10 11 12 15 26 48 19 collision 26 collision 48 collision 48 ΕΠΛ231 Δομζσ Δεδομζνων και Αλγόρικμοι 18
Σχόλια για το Linear Probing Ειςαγωγι Εφόςον ο πίνακασ κατακερματιςμοφ δεν είναι γεμάτοσ, είναι πάντα δυνατό να ειςάγουμε κάποιο καινοφριο κλειδί. Αν γεμίςει κα κάνουμε rehash τον πίνακα (κα το δοφμε ςτθν ςυνζχεια) Αν οι γεμάτεσ κζςεισ του πίνακα είναι μαηεμζνεσ (clustered) τότε ακόμα και αν ο πίνακασ είναι ςχετικά άδειοσ, πικανόν να χρειαςτοφν πολλζσ δοκιμζσ για εφρεςθ κενισ κζςθσ (κατά τθν εκτζλεςθ διαδικαςίασ insert), ι για εφρεςθ ςτοιχείου. Αναηιτθςθ Η αναηιτθςθ γίνεται όπωσ και τθν ειςαγωγι (ςταματάμε όταν βροφμε κενι κζςθ). Μπορεί να αποδειχκεί ότι για ζνα πίνακα μιςογεμάτο (δθλαδι λ = 0.5) και μια ομοιόμορφθ κατανομι τότε: 1. Ανεπιτυχι Διερεφνθςθ: O αρικμόσ βθμάτων είναι ~2.5 2. Επιτυχι Διερεφνθςθ: O αρικμόσ βθμάτων είναι ~1.5. Αν το λ πλθςιάηει το 1, τότε οι πιο πάνω αναμενόμενοι αρικμοί βθμάτων αυξάνονται εκκετικά. ΕΠΛ231 Δομζσ Δεδομζνων και Αλγόρικμοι 19
Σχόλια για το Linear Probing Εξαγωγι Πρζπει να είμαςτε προςεκτικοί με τισ εξαγωγζσ ςτοιχείων 1. μια κζςθ από τθν οποία ζχει αφαιρεκεί ςτοιχείο δεν μπορεί να κεωρθκεί ωσ άδεια (γιατί;) διότι ςτην find δεν θα ξζρουμε που να ςταματήςουμε 2. ζτςι μαρκάρουμε τθ κζςθ ωσ deleted, και 3. κατά τθ διαδικαςία find, αγνοοφμε κζςεισ deleted, και προχωροφμε μζχρισ ότου είτε να βροφμε το κλειδί που ψάχνουμε, είτε να βροφμε (πραγματικά) μια άδεια κζςθ είτε να ςαρϊςουμε ολόκλθρο τον πίνακα). ΕΠΛ231 Δομζσ Δεδομζνων και Αλγόρικμοι 20
Δευτεροβάκμια Αναηιτθςθ Ανοικτισ Διεφκυνςθσ Δευτεροβάκμια Αναηιτθςθ Ανοικτισ Διεφκυνςθσ (Quadratic Probing) H αρχικι ςυνάρτθςθ κατακερματιςμοφ είναι και πάλι: f(x) = x mod hsize Όταν υπάρξει ςφγκρουςθ (collision) δοκιμάηουμε αναδρομικά τθν επόμενθ ςυνάρτθςθ μζχρι να βρεκεί κενι κζςθ: f(x)= (f(x) + i²) mod hsize (i=1,2,3, ) Στόχοσ: αποφυγι των μαηεμζνων κλειδιϊν (clusters) ΕΠΛ231 Δομζσ Δεδομζνων και Αλγόρικμοι 21
Παράδειγμα Quadratic Probing Παράδειγμα: hsize = 11, ειςαγωγι 11, 12, 15, 19, 26, 48 0 1 2 3 4 5 6 7 8 9 10 11 12 48 15 26 19 collision 26 48 OK collision 48 collision 48 collision 48 ((X+3 2 )% 11) d (X % 11) ((X+1 2 )% 11) ((X+2 2 )% 11) a b c Στο linear probing ιταν εγγυθμζνθ θ ειςαγωγι (εφόςον ο πίνακασ δεν ζχει γεμίςει) Και εδϊ μπορεί να αποδειχκεί ότι : Θεϊρθμα: Αν το μζγεκοσ hsize είναι πρϊτοσ (prime) αρικμόσ (>3) τότε οποιοδιποτε καινοφριο κλειδί μπορεί να ειςαχκεί ςτον πίνακα εφόςον ο πίνακασ ζχει λ 0.5. ΕΠΛ231 Δομζσ Δεδομζνων και Αλγόρικμοι 22
Σθμαντικότθτα Μεγζκουσ Πίνακα Αν το μζγεκοσ του πίνακα δεν είναι prime τότε μπορεί να δθμιουργθκεί το φαινόμενο του Funneling Ασ υποκζςουμε ότι κζλουμε να ειςάγουμε το {0,1,4,8} ςε ζνα πίνακα μεγζκουσ hsize = 8. Η ειςαγωγι του 0,1,4 γίνεται κανονικά. Το 8 ωςτόςο δεν μπορεί να ειςαχκεί χρθςιμοποιϊντασ το quadratic probing. Συγκεκριμζνα ζχουμε αλλεπάλλθλεσ ςυγκροφςεισ (collisions) : 1) 8%8=0 (X) 2) (8+1)%8=1 (X) 3) (8+4)%8=4 (X) 4) (8+9)%8=1 (X) 4) (8+16)%8=0 (X) 5) (8+25)%8=1 (X) 6) (8+36)%8=4 (X) 7) (8+49)%8=1 (X).. Τϊρα ασ υποκζςουμε ότι κζλουμε να ειςάγουμε το {0,1,4,8} ςε ζνα πίνακα μεγζκουσ hsize = 7 (PRIME). Πάλι θ ειςαγωγι του 0,1,4 γίνεται κανονικά Επίςθσ το 8 μετά από ζνα collision τοποκετείται ςτον πίνακα 1) 8%7=1 (X) 2) (8+1)%7=2 (OK!) ΕΠΛ231 Δομζσ Δεδομζνων και Αλγόρικμοι 23
Διπλόσ Κατακερματιςμόσ Ανοικτισ Διεφκυνςθσ Διπλόσ Κατακερματιςμόσ Ανοικτισ Διεφκυνςθσ (Double Hashing) O τελευταίοσ τρόποσ αποφυγισ ςυγκροφςεων χρθςιμοποιεί δυο ςυναρτιςεισ κατακερματιςμοφ. Δθλαδι ςε περίπτωςθ αρχικισ αποτυχίασ ειςαγωγισ / εφρεςθσ ςτοιχείου οι κζςεισ που επιλζγουμε για να διερευνιςουμε ςτθ ςυνζχεια (probe sequence) είναι ανεξάρτθτεσ από τθν πρϊτθ. f(x,0) = h 1 (x) // θ αρχικι συνάρτθσθ κατακερματισμοφ Αυτό επιτυγχάνεται με τθ χριςθ μιασ δεφτερθσ ςυνάρτθςθσ κατακερματιςμοφ, h 2, ωσ εξισ: f(x,n) = ( h 1 (x) + n h 2 (x) ) mod hsize Στθν πράξθ δουλεφει αποδοτικά ωςτόςο είναι πιο ακριβό να υπολογίηουμε δυο ςυναρτιςεισ κάκε φορά ΕΠΛ231 Δομζσ Δεδομζνων και Αλγόρικμοι 24
Άλλεσ Τεχνικζσ Ordered Hashing Διατεταγμζνοσ Κατακερματιςμόσ (Ordered Hashing) H μζκοδοσ αυτι χρθςιμοποιείται ςε ςυνδυαςμό με οποιαδιποτε από τισ άλλεσ τεχνικζσ με ςτόχο τθν ελάττωςθ του χρόνου εκτζλεςθσ τθσ διερεφνθςθσ. Η βαςικι ιδζα είναι να εξαςφαλίηεται ότι τα κλειδιά που ςυναντοφμε κατά τθ διερεφνθςθ μιασ probing sequence είναι ςε αφξουςα ςειρά. Ζτςι, αν ςυναντιςουμε κλειδί που είναι μεγαλφτερο από αυτό που ψάχνουμε, τότε ςυμπεραίνουμε πωσ δεν υπάρχει ςτον πίνακα. Μζκοδοσ υλοποίθςθσ Μζκοδοσ υλοποίθςθσ: κατά τθν ειςαγωγι κλειδιοφ k ςε ζνα πίνακα, αν βροφμε κλειδί kϋ> k, τότε ειςάγουμε το k ςτθ κζςθ του kϋ και αναλαμβάνουμε να ειςάγουμε το kϋ ςε κάποια μετζπειτα κζςθ. Σαν αποτζλεςμα ζχουμε βελτιωμζνθ διαδικαςία ανεπιτυχοφσ αναηιτθςθσ. ΕΠΛ231 Δομζσ Δεδομζνων και Αλγόρικμοι 25
Επανακατακερματιςμόσ (Rehashing) Αν ο hash πίνακασ αρχίςει να γεμίηει, παρατθρείται μεγάλοσ αρικμόσ ςυγκροφςεων (collisions) με αποτζλεςμα τθ μειωμζνθ επίδοςθ. H μειωμζνθ επίδοςθ παρατθρείται και ςε πράξεισ ειςαγωγισ αλλά ςτισ πράξεισ αναηιτθςθσ. Σε τζτοιεσ περιπτϊςεισ, όταν θ τιμι λ υπερβεί κάποιο όριο, πολλζσ υλοποιιςεισ hash-πινάκων, αυτόματα εφαρμόηουν επανάκατακερματιςμό. Αυτό το όριο ςε τυπικζσ υλοποιιςεισ είναι ςυνικωσ λ=0.7 (π.χ. Java) Επανακατακερματιςμόσ (rehashing) Δθμιοφργθςε ζνα καινοφριο πίνακα μεγαλφτερου (διπλάςιου) μεγζκουσ. Ειςιγαγε όλα τα ςτοιχεία του παλιοφ πίνακα ςτον καινοφριο. Επζςτρεψε τθ μνιμθ του παλιοφ πίνακα. Ακριβι διαδικαςία, αλλά καλείται ςπάνια. ΕΠΛ231 Δομζσ Δεδομζνων και Αλγόρικμοι 26
Επανακατακερματιςμόσ (Rehashing) Σε ςυςτιματα πραγματικοφ χρόνου (real-time systems) το rehashing μπορεί να πάρει περιςςότερο χρόνο από ότι υπάρχει! Εκεί το rehashing γίνεται ςταδιακά (δθλαδι κρατοφμε το παλιό και νζο HashTable), και ςε κάκε ειςαγωγι μετακινοφμε K ςτοιχεία ςτο νζο table μζχρι να μετακινθκοφν όλα τα ςτοιχεία (οπόταν διαγράφεται το παλιό table) Σε βάςεισ δεδομζνων (databases), ο όγκοσ των δεδομζνων είναι πολφ μεγάλοσ και τα δεδομζνα είναι αποκθκευμζνα ςτον δίςκο. Άρα το re-hashing, κα ζπαιρνε παρά πολφ χρόνο μζχρι να ολοκλθρωκεί. Για αυτό χρθςιμοποιοφνται dynamic hashing techniques (π.χ. Linear and extendible hashing) Σε αυτζσ τισ τεχνικζσ, μόνο ζνα πολφ μικρό ποςοςτό δεδομζνων χρειάηεται να γίνει rehashed. ΕΠΛ231 Δομζσ Δεδομζνων και Αλγόρικμοι 27
Μερικζσ Εφαρμογζσ του Κατακερματιςμοφ Εφαρμογζσ Κατακερματιςμοφ (Μνιμθσ &Μαγνθτ. Δίςκου) Unique: Ζχετε ζνα αρχείο από strings και κζλετε με ζνα πζραςμα (χρόνοσ O(n)), να βρείτε όλεσ τισ μοναδικζσ λζξεισ ςε αυτό. Ευρετιρια Λζξεων ςε Μθχανζσ Αναηιτθςθσ: Ψάχνουμε ςε μια μθχανι αναηιτθςθσ τθν λζξθ car + rental. H μθχανι μασ επιςτρζφει τθν τομι των αποτελεςμάτων (ςυνόλων) car και rental ςε χρόνο O(1). Find Function: Σε εργαλεία επεξεργαςίασ κειμζνου (text editors, word, κτλ) το πρόγραμμα προςφζρει τθν δυνατότθτα εφρεςθσ λζξεων. Πολλζσ φορζσ θ πρϊτθ εκτζλεςθ του find είναι αργι (πχ. Microsoft Help) διότι χρειάηεται χρόνοσ για τθν δθμιουργία του hash table). Σε μεταγλωττιςτζσ, πίνακεσ κατακερματιςμοφ που ονομάηονται Symbol Tables αποκθκεφουν πλθροφορίεσ για όλεσ τισ μεταβλθτζσ. Διερεφνθςθ γράφων που δεν είναι εξ αρχισ γνωςτοί. ΕΠΛ231 Δομζσ Δεδομζνων και Αλγόρικμοι 28
Bloom Filter Πολφ διαδεδομζνθ δομι δεδομζνων που βαςίηεται ςτον κατακερματιςμό Μπορεί αποδοτικά να ελζγχει αν ζνα ςτοιχείο ΔΕΝ αποτελεί μζλοσ κάποιου ςυνόλου (όχι το αντίκετο) Πάντα επιςτρζφει false αν το ςτοιχείο δεν ανικει ςτο ςφνολο ΝΟ false negatives Μπορεί να επιςτρζψει true για ζνα ςτοιχείο που δεν ανικει ςτο ςφνολο false positives Υλοποιείται με: ζνα BitArray k hash functions (ζνα ι πολλά) Καινοφρια ςτοιχεία μποροφν να προςτεκοφν Η Εξαγωγι ςτοιχείων δεν επιτρζπεται ΕΠΛ231 Δομζσ Δεδομζνων και Αλγόρικμοι 31
Bloom Filter: Υλοποίθςθ Ζςτω ότι το BitArray ζχει μζγεκοσ m. Αρχικά, όλεσ οι κζςεισ (bits) ζχουν τθν τιμι 0 Η ειςαγωγι ςτοιχείου σ γίνεται ωσ εξισ: Υπολόγιςε το hash value του ς για κάκε ζνα από τα k hash functions Αυτό δθμιουργεί k k κζςεισ ςτον πίνακα (k αν τα functions είναι τζλεια!) Θζςε τισ κζςεισ k ίςεσ με 1 Η επερϊτθςθ για κάποιο ςτοιχείου q γίνεται ωσ εξισ: Υπολόγιςε το hash value του q για κάκε ζνα από τα k hash functions Ζλεγξε αν τουλάχιςτον μία κζςθ =0 επζςτρεψε true ι false αντίςτροφα Παράδειγμα m=18, k=3 ΕΠΛ231 Δομζσ Δεδομζνων και Αλγόρικμοι 32
Bloom Filter: Παρατθριςεισ To Bloom Filter παρουςιάηει πολλά πλεονεκτ. και κάποια μειονεκτ. + Πολφ αποδοτικι: Ο(k), (k 5 ~O(1)), άςχετο με τον αρικμό των αντικείμενων που υπάρχουν ςτο ςφνολο + Πολφ μικρι χριςθ χϊρου μνιμθσ ςε ςχζςθ με πίνακεσ κατακερματιςμοφ, λίςτεσ και δζντρα Για 1,048,576 (1MB) ςτοιχεία: BloomFilter-132KB, HasTable 1MB, Λίςτα 8ΜΒ, Δζντρα 12ΜΒ + Αν το ποςοςτό των false positives δεν είναι ικανοποιθτικό τότε μποροφμε απλά να προςκζςουμε extra bits, π.χ., n bits=1% false positives, n+5 bits = 0.1% false positives! - Τα false positives αυξάνονται ραγδαία με τθν είςοδο καινοφριων ςτοιχείων - Υπάρχει πικανότθτα μεγάλοσ χϊροσ του πίνακα να είναι ςυνεχϊσ αχρθςιμοποίθτοσ ΕΠΛ231 Δομζσ Δεδομζνων και Αλγόρικμοι 33