Πίνακες (Μια παλιά άσκηση) Πίνακες Κατακερματισμού (Hash Tables) Ορέστης Τελέλης telelis@unipi.gr Τμήμα Ψηφιακών Συστημάτων, Πανεπιστήμιο Πειραιώς A n O(1) (στην πρώτη ελέυθερη θέση στο τέλος του πίνακα). O(n) (διατρέχουμε τον πίνακα γραμμικά). O(n) (προϋποθέτει αναζήτηση + μετακίνηση στοιχείων). Μπορούμε καλύτερα αν θέλουμε να αποθηκεύσουμε υποσύνολο του {0, 1,..., n 1? Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 1 / 59 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 2 / 59 Πίνακες (Μια παλιά άσκηση) Εισαγωγή Απάντηση: Ναι! Χρησιμοποιούμε έναν πίνακα n δυαδικών στοιχείων (με τιμές true/false) Εισαγωγή του a { 0, 1,..., n 1 : A[a] = true ( χρόνος O(1) ). Διαγραφή του a { 0, 1,..., n 1 : A[a] = false ( χρόνος O(1) ). Αναζήτηση του a { 0, 1,..., n 1 : return A[a]; ( χρόνος O(1) ). Μπορούμε να επιτύχουμε το ίδιο για οποιοδήποτε υποσύνολο οποιουδήποτε συνόλου δεδομένων n στοιχείων? Προσφέρει πολύ γρήγορη και., (μερικές φορές και η ) O(1) Πολύ πιο ταχύς από τα δέντρα (που αποδίδουν σε χρόνο O(log n)). Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 3 / 59 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 4 / 59
Μειονεκτήματα Πίνακες/Συναρτήσεις Κατακερματισμού Βασίζονται σε πίνακες: δύσκολη η επέκταση μετά την δημιουργία τους. Η απόδοσή τους μειώνεται σημαντικά όταν ο πίνακας υπερκορεστεί. Δεν υπάρχει τρόπος επίσκεψης στοιχείων με συγκεκριμένη σειρά. Βασικό στοιχείο: ο μετασχηματισμός κλειδιών σε δείκτες πίνακα. Επιτυγχάνεται με μία Απλή περίπτωση, χωρίς χρήση συνάρτησης κατακερματισμού. Τιμές κλειδιών δείκτες πίνακα Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 5 / 59 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 6 / 59 Τρόπος Λειτουργίας Παράδειγμα Τρόπου Λειτουργίας: Τηλεφωνικός Κατάλογος Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 7 / 59 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 8 / 59
Παραδείγματα Χρήσης Παραδείγματα Χρήσης (Συνέχεια) ( ) Πρόσβαση σε εγγραφές υπαλλήλων. Αριθμοί υπαλλήλων 1-1000. Οι αριθμοί υπαλλήλων κλειδιά στην προσπέλαση εγγραφών. Τί είδους δομή πρέπει να χρησιμοποιηθεί σ αυτή την περίπτωση? _1 _2 _72 Προσπέλαση στοιχείου πίνακα: emprecord rec = databasearray[72]; emprecord rec = databasearray[72]; databasearray[totalemployees++] = newrecord; Προσθήκη στοιχείου:...... _1000 1 2 72 1000 databasearray[totalemployees++] = newrecord;, 3 8 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 9 / 59 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 10 / 59 Παραδείγματα Χρήσης (Συνέχεια) Εφαρμογές Πινάκων Κατακερματισμού Πίνακας: απλή & αποδοτική δομή για προσπέλαση στοιχείων. Περιορισμοί: Καλά τακτοποιημένα κλειδιά. Περιορισμένος αριθμός διαγραφών οδηγούν σε κενά στην μνήμη. Στοιχεία μπορούν να προστίθενται μόνο στο τέλος του πίνακα. Μέγεθος πίνακα σταθερό. Αν τα κλειδιά δεν πληρούν τους περιορισμούς του πίνακα? Ο πίνακας κατακερματισμού είναι μία κατάλληλη δομή δεδομένων. Μεταγλωττιστές γλωσσών προγραμματισμού. Διατήρηση πίνακα συμβόλων σε πίνακα κατακερματισμού: ονόματα μεταβλητών, ονόματα συναρτήσεων, διευθύνσεις στη μνήμη. Λεξικό όρων: Κάθε λέξη καταλαμβάνει ένα κελί σε έναν πίνακα. Προσπέλαση της λέξης χρησιμοποιώντας έναν αριθμό δείκτη. Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 11 / 59 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 12 / 59
Συνάρτηση Κατακερματισμού Ιδιότητες Συνάρτησης Κατακερματισμού Κατανομή κλειδιών ομοιόμορφα στο χώρο δεικτών του πίνακα. Μετατρέπει το αντικείμενο σε ακέραιο για δεικτοδότηση θέσης πίνακα: h : O {0, 1,..., M 1 όπου είναι αποθηκευμένο (ή θα αποθηκευθεί) το αντικείμενο. Αν h 1-1, προσπέλαση αντικειμένου με το δείκτη του στον πίνακα., = ( ) ( ) = ( ) ( ). Δύσκολο να βρεθεί μία τέτοια συνάρτηση κατακερματισμού. Δύο ή περισσότερα διαφορετικά αντικείμενα/κλειδιά αντιστοιχίζονται μέσω της συνάρτησης στην ίδια θέση: = ( ) = ( ) Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 13 / 59 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 14 / 59 Πρωτογενείς Τύποι Δεδομένων Συνάρτηση Κατακερματισμού Εστω ο αριθμός 1234: είναι μία συλλογή από ψηφία 1, 2, 3 και 4, όπου: Μπορούμε να αντιστοιχίσουμε κάθε τιμή βασικού τύπου σε τιμή. Τιμή τύπου : κατακερματίζεται σε μοναδικό θετικό ακέραιο (όπως ορίζεται στο U ). Αφηρημένοι τύποι δεδομένων δεν έχουν προκαθορισμένες τιμές. Υπολογισμός τιμής κατακερματισμού για κάθε αντικείμενο με πολυωνυμική συνάρτηση. 1 10 3 + 2 10 2 + 3 10 1 + 4 10 0 Εστω το string «junk» συλλογή από χαρακτήρες j, u, n, k. ASCII αναπαράσταση με 7 bits σαν ένας αριθμός μεταξύ 0 και 127: 128 3 j + 128 2 u + 128 1 n + 128 0 k Για αντιστοίχιση μεγάλων αριθμών (όπως προκύπτουν από μετατροπή strings σε αριθμούς) χρειαζόμαστε συνάρτηση κατακερματισμού. Αν το μέγεθος του πίνακα και x ακέραιος: x mod παράγει αριθμό στο διάστημα {0, 1,..., 1. Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 15 / 59 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 16 / 59
Κατακερματισμός Αντικειμένων Διαχείριση Συγκρούσεων Εστω αντικείμενα της κλάσης που έχουν k πεδία τύπου : O = ( x 0,..., x k 1 ) Η τιμή κατακερματισμού για κάθε αντικείμενο O επιλέγοντας μία θετική σταθερά α, υπολογίζεται ως: h(x 0 )α k 1 + h(x 1 )α k 2 + + h(x k 2 )α + h(x k 1 ) ή: h(x k 1 ) + α(h(x k 2 ) + α(h(x k 2 ) + + α(h(x 1 ) + αh(x 0 ))... )) Εχοντας μία συνάρτηση κατακερματισμού, τι θα κάνουμε σε περίπτωση σύγκρουσης (collision)? Εάν το στοιχείο X κατακερματιστεί σε θέση που είναι ήδη κατειλημμένη, πού θα το τοποθετήσουμε? Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 17 / 59 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 18 / 59 Ανοιχτή Διευθυνσιοδότηση Γενική Μορφή Ανοιχτής Διευθυνσιοδότησης Οταν ένα στοιχείο δεν μπορεί να τοποθετηθεί στο δείκτη που υπολογίστηκε από τη συνάρτηση κατακερματισμού, το πρόγραμμα ψάχνει για άλλη θέση στον πίνακα. : ( ). ( ). ( ) k k με h(k) = h(k ) και η θέση h(k) έχει δοθεί στο k. Δεδομένης F : {0,..., tablesize 1 N, αναζητείται διαθέσιμη θέση: ( h(k ) + F (i) ) mod tablesize, για i = 1, 2, 3,... ( h(k ) + F (i) ) mod tablesize, i = 0, 1, 2,..., όπου F (0) = 0 ( ). Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 19 / 59 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 20 / 59
Ανοιχτή Διεύθυνση: Γραμμική Διερεύνηση Παράδειγμα Γραμμικής Διερεύνησης Τυπικά: ( ) = Τότε, αναζητείται σειριακά ελεύθερη θέση στον πίνακα, μεταξύ των: ( ( ) + ) mod tablesize, i = 0, 1, 2,... h(89) = 89 mod 10 = 9 h(18) = 18 mod 10 = 8 h(49) = 49 mod 10 = 9 h(58) = 58 mod 10 = 8 h(9) = 9 mod 10 = 9 Θέση Μετά το 89 Μετά το 18 Μετά το 49 Μετά το 58 Μετά το 9 0 49 49 49 1 58 58 2 9 3 4 5 6 7 8 18 18 18 18 9 89 89 89 89 89 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 21 / 59 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 22 / 59 Ανοιχτή Διεύθυνση: Γραμμική Διερεύνησης Κλάση DataItem (μέσω της Γραμμικής Διερεύνησης). ανάλογος του μέγιστου «μήκους» γραμμικής διερεύνησης. ανάλογος του μέγιστου «μήκους» γραμμικής διερεύνησης. O(1), (δεν ελευθερώνεται θέση): αν ελευθερωθεί θέση, η αναζήτηση στον πίνακα μπορεί να αποτύχει. j a v a. i o. * ; DataItem { i D a t a ; DataItem ( i i ) { i D a t a = i i ; getkey ( ) { i D a t a ; Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 23 / 59 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 24 / 59
Υλοποίηση Πίνακα Κατακερματισμού (1/4) HashTable { DataItem [ ] h a s h A r r a y ; a r r a y S i z e ; DataItem nonitem ; HashTable ( s i z e ) { a r r a y S i z e = s i z e ; h a s h A r r a y = DataItem [ a r r a y S i z e ] ; nonitem = DataItem ( 1) ; d i s p l a y T a b l e ( ) { System. out. p r i n t ( T a b l e : ) ; ( j = 0 ; j < a r r a y S i z e ; j ++) { ( h a s h A r r a y [ j ]! = ) System. out. p r i n t ( h a s h A r r a y [ j ]. getkey ( ) + ) ; System. out. p r i n t ( ** ) ; System. out. p r i n t l n ( ) ; Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 25 / 59 Υλοποίηση Πίνακα Κατακερματισμού (2/4) hashfunc ( key ) { key % a r r a y S i z e ; i n s e r t ( DataItem item ) { key = item. getkey ( ) ; hashval = hashfunc ( key ) ; ( h a s h A r r a y [ h ashval ]!= && h a s h A r r a y [ hashval ]. getkey ( )!= 1) { ++ hashval ; hashval %= a r r a y S i z e ; h a s h A r r a y [ hashval ] = item ; Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 26 / 59 Υλοποίηση Πίνακα Κατακερματισμού (3/4) Υλοποίηση Πίνακα Κατακερματισμού (4/4) DataItem d e l e t e ( key ) { h a s h V a l = hashfunc ( key ) ; ( h a s h A r r a y [ h ashval ]!= ) { ( h a s h A r r a y [ h ashval ]. getkey ( ) == key ) { DataItem temp = h a s h A r r a y [ hashval ] ; h a s h A r r a y [ hashval ] = nonitem ; temp ; ++ h a s h Val ; h a s h V a l %= a r r a y S i z e ; ; DataItem f i n d ( key ) { hashval = hashfunc ( key ) ; ( h a s h A r r a y [ h ashval ]!= ) { ( h a s h A r r a y [ h ashval ]. getkey ( ) == key ) h a s h A r r a y [ hashval ] ; ++ hashval ; hashval %= a r r a y S i z e ; ; Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 27 / 59 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 28 / 59
Γραμμική Διερεύνηση: Δημιουργία Δεσμών Οι δεσμοί δημιουργούν μεγάλες ακολουθίες διερεύνησης. Αργή προσπέλαση κελιών στο τέλος της ακολουθίας. Το πρόβλημα δεσμών μεγαλώνει καθώς γεμίζει ο πίνακας. (primary clustering) Οχι σημαντικό όσο ο πίνακας είναι το πολύ κατά το ήμισυ γεμάτος. = / Επέκταση Πίνακα Ανακατακερματισμός insert. (όχι ακριβώς ) i s P r i m e ( n ) { ( j = 2 ; ( j * j <= n ) ; j ++) ( n % j == 0 ) ( ) ; ( ) ; Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 29 / 59 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 30 / 59 Ανοιχτή Διεύθυνση: Δευτεροβάθμια Διερεύνηση Παράδειγμα Δευτεροβάθμιας Διερεύνησης ( ) Εξετάζει συγκεκριμένα κελιά μακριά από το αρχικό σημείο σύγκρουσης., τυπικά: ( ) = Για κάθε εισαγωγή κλειδιού, k, αναζητά ελεύθερη θέση στον πίνακα, εξετάζοντας σειριακά τις ακόλουθες θέσεις: ( ( ) + ) mod tablesize, =,,,... h(89) = 89 mod 10 = 9 h(18) = 18 mod 10 = 8 h(49) = 49 mod 10 = 9 h(58) = 58 mod 10 = 8 h(9) = 9 mod 10 = 9 Θέση Μετά το 89 Μετά το 18 Μετά το 49 Μετά το 58 Μετά το 9 0 49 49 49 1 2 58 58 3 9 4 5 6 7 8 18 18 18 18 9 89 89 89 89 89 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 31 / 59 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 32 / 59
Απόδοση Δευτεροβάθμιας Διερεύνησης Απόδειξη (1/2) Εστω M το μέγεθος του πίνακα:, M > 3. Οταν χρησιμοποιείται δευτεροβάθμια διερεύνηση και το μέγεθος του πίνακα είναι πρώτος αριθμός, πάντα μπορεί να εισαχθεί ένα νέο κλειδί, αν ο πίνακας είναι το πολύ κατά το ήμισυ γεμάτος (δηλαδή αν. ). ΘΔΟ οι πρώτες M/2 θέσεις είναι διαφορετικές. Για κάποια i, j με 0 < i, j M/2, δύο τέτοιες θέσεις είναι οι: h(k) + i 2 mod M h(k) + j 2 mod M Θα θεωρήσουμε (με στόχο την απαγωγή σε άτοπο), ότι i j, αλλά: h(k) + i 2 mod M = h(k) + j 2 mod M Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 33 / 59 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 34 / 59 Απόδειξη (2/2) Πρόβλημα με Δευτεροβάθμια Διερεύνηση Τότε: [ (h(k) + i 2 ) (h(k) + j 2 ) ] mod M = 0 (i j)(i + j) mod M = 0 Ομως, ο M δε μπορεί να διαιρεί τον i + j, διότι 0 < i + j < M 1. Επειδή 0 < i j M/2 (άρα, αν π.χ. j = M/2, πρέπει i j 1). Επίσης, ο M δε διαιρεί τον i j (εκτός κι αν i = j): Διότι i j < M/2. Και, επίσης, i j, από υπόθεση. Τέλος, o M δε διαιρεί το γινόμενο, γιατί είναι πρώτος: θα έπρεπε να διαιρεί κάποιον από τους i + j, i j. οι πρώτες M/2 εναλλακτικές θέσεις του πίνακα είναι διαφορετικές. Οδηγεί σε ( ) Ο αλγόριθμος που παράγει την ακολουθία βημάτων στη δευτεροβάθμια διερεύνηση παράγει πάντα τα ίδια βήματα: 1, 4, 9, 16 Π.χ. 184, 302, 420, 544 μετασχηματίζονται στο 7 και εισάγονται στον πίνακα με αυτήν τη σειρά 302 διερεύνηση ενός βήματος. 420 διερεύνηση 4 βημάτων. 544 διερευνηση 9 βημάτων. Κάθε επιπλέον στοιχείο με κλειδί που μετασχηματίζεται σε 7 θα χρειάζεται μία ακόμα μακρύτερη διερεύνηση. Μαζί με την πρώτη θέση κατακερματισμού του κλειδιού: M/2. Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 35 / 59 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 36 / 59
Ανοιχτή Διεύθυνση: Διπλός Κατακερματισμός (1) Παραγωγή σειράς «διερευνήσεων» που εξαρτώνται από το κλειδί: αντί η ίδια σειρά για κάθε κλειδί. (, ) = ( ) Αναζητείται σειριακά η επόμενη ελεύθερη θέση, μεταξύ των: Ανοιχτή Διεύθυνση: Διπλός Κατακερματισμός (2) 0 (αλλιώς, ατέρμονος βρόχος από διερευνήσεις ίδιου κελιού). Εχει δειχθεί ότι συναρτήσεις της παρακάτω μορφής αποδίδουν καλά: ( ) = ( mod ) όπου πρώτος αριθμός και μικρότερος από το μέγεθος πίνακα. ( ( ) + (, ) ) mod tablesize, =,,,... Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 37 / 59 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 38 / 59 Παράδειγμα Διπλού Κατακερματισμού Υλοποίηση Διπλού Κατακερματισμού ( ) = mod. ( ) = ( mod ). Θέση Μετά το 89 Μετά το 18 Μετά το 49 Μετά το 58 Μετά το 69 0 69 1 2 3 58 58 4 5 6 49 49 49 7 8 18 18 18 18 9 89 89 89 89 89 hashfunc1 ( key ) { key % a r r a y S i z e ; hashfunc2 ( key ) { 5 key % 5 ; i n s e r t ( key, DataItem item ) { hashval = hashfunc1 ( key ) ; s t e p S i z e = hashfunc2 ( key ) ; ( h a s h A r r a y [ h ashval ]!= && h a s h A r r a y [ hashval ]. getkey ( )!= 1) { hashval += s t e p S i z e ; hashval %= a r r a y S i z e ; h a s h A r r a y [ hashval ] = item ; Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 39 / 59 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 40 / 59
Το Μέγεθος Πίνακα να είναι Πρώτος Αριθμός Χωριστή Αλυσίδωση (1) Εστω πίνακας 15 θέσεων (δείκτες 0 ως 14). Εστω κλειδί που κατακερματίζεται στη θέση 0 με βήμα 5. Τότε η ακολουθία διερευνήσεων θα είναι: 0, 5, 10, 0, 5, 10,... Εάν το μέγεθος πίνακα ήταν 13 (πρώτος): 0, 5, 10, 2, 7, 12, 4, 9, 1, 6, 11, 3,.... Το κλειδί ενός στοιχείου μετασχηματίζεται στο δείκτη με βάση τη συνάρτηση κατακερματισμού και το στοιχείο εισάγεται στη συνδεδεμένη λίστα. Στοιχεία που κατακερματίζονται στον ίδιο δείκτη εισάγονται στη λίστα. Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 41 / 59 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 42 / 59 Χωριστή Αλυσίδωση (2) Παράδειγμα Χωριστής Αλυσίδωσης Αποθηκεύονται οσαδήποτε στοιχεία σε πίνακα n κελιών. 906 881 Ο χρόνος προσπέλασης στοιχείων αυξάνει με το μήκος των λιστών. 807 458 383 333 559, 3 35 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 43 / 59 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 44 / 59
Υλοποίηση με Χωριστή Αλυσίδωση (1/2) HashTable { S o r t e d L i s t [ ] h a s h A r r a y ; a r r a y S i z e ; HashTable ( s i z e ) { a r r a y S i z e = s i z e ; h a s h A r r a y = S o r t e d L i s t [ a r r a y S i z e ] ; ( j = 0 ; j < a r r a y S i z e ; j ++) h a s h A r r a y [ j ] = S o r t e d L i s t ( ) ; d i s p l a y T a b l e ( ) { ( j = 0 ; j < a r r a y S i z e ; j ++) { System. out. p r i n t ( j +. ) ; h a s h A r r a y [ j ]. d i s p l a y L i s t ( ) ; Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 45 / 59 Υλοποίηση με Χωριστή Αλυσίδωση (2/2) hashfunc ( key ) { key % a r r a y S i z e ; i n s e r t ( L i n k t h e L i n k ) { key = t h e L i n k. getkey ( ) ; hashval = hashfunc ( key ) ; h a s h A r r a y [ hashval ]. i n s e r t ( t h e L i n k ) ; d e l e t e ( key ) { hashval = hashfunc ( key ) ; h a s h A r r a y [ hashval ]. d e l e t e ( key ) ; L i n k f i n d ( key ) { hashval = hashfunc ( key ) ; L i n k t h e L i n k = h a s h A r r a y [ h ashval ]. f i n d ( key ) ; t h e L i n k ; Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 46 / 59 Καλές Επιλογές για Συναρτήσεις Κατακερματισμού Απόδοση Κατακερματισμού Η συνάρτηση κατακερματισμού πρέπει να: Υπολογίζεται γρήγορα. Κατανέμει με τυχαία & ομοιόμορφα τα κλειδιά στις θέσεις του πίνακα. Μη χρησιμοποιεί άχρηστη πληροφορία. Π.χ. Κωδικοί της μορφής 033-400-03-94-05-0-535. Χρησιμοποιεί όλα τα δεδομένα. Αν είναι η mod (%), πρώτο αριθμό για το διαιρέτη. Η και η προσεγγίζουν χρόνο O(1) (αν δε συμβεί καμία σύγκρουση). Αν συμβούν συγκρούσεις, ο χρόνος εξαρτάται από το μήκος της ακολουθίας διερευνήσεων. Το μέσο μήκος διερεύνησης εξαρτάται από το συντελεστή φόρτου. Εστω P το μήκος διερεύνησης (probes) και L ο συντελεστής φόρτου. Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 47 / 59 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 48 / 59
Απόδοση Γραμμικής Διερεύνησης Απόδοση Δευτεροβάθμιας Διερεύνησης και Διπλού Κατακερματισμού : P = ( 1 + 1 / (1 L) 2 ) / 2 P = ( 1 + 1 / (1 L) 2 ) / 2 : P = ( 1 + 1 / (1 L) ) / 2 P = ( 1 + 1 / (1 L) ) / 2 2/3 1/2 Ο συντελεστής φόρτου πρέπει να διατηρείται κάτω από το 2/3 και, ιδανικά, κάτω από το 1/2. 1.0 Donald E. Knuth: «The Art of Computer Programming», Τόμος 3, Sor ng and Searching : P = - log ( 1 L ) / L : P = 1 / ( P 1 = L) log(1 L) / L P = 1 / (1 L) 0.5 2 Με συντελεστή φόρτου 0.5 επιτυχείς και ανεπιτυχείς αναζητήσεις απαιτούν κατά μέσο όρο 2 διερευνήσεις. 2 0.5 1.0 Donald E.Knuth: The Art of Computer Programming 3: Sorting and Searching Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές, Δεδομένων 3 - Κατακερματισμός 40 49 / 59 Απόδοση Χωριστής Αλυσίδωσης, 3 41 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 50 / 59 Συμπερασματικά arraysize n = AverageListLength AVGListLength = N = / n/ arraysize tablesize L = N / arraysize L = n/ tablesize : 1 + L / 2 : 1 + L1 + L/2. 1 + L. : (1) : 1 + L / 2 Μη ταξινομημένες λίστες: O(1) 1.0 Διπλός Κατακερματισμός καλύτερος τύπος ανοιχτής διεύθυνσης. Με μικρή υπεροχή ως προς τη δευτεροβάθμια διερεύνηση. Αν υπάρχει άφθονη μνήμη, πιο απλή η Γραμμική Διερεύνηση (μικρή επιβάρυνση για συντελεστή φόρτου μικρότερο από 0.5). Για άγνωστο πλήθος στοιχείων: προτιμότερη η Χωριστή Αλυσίδωση. Η απόδοσή της μειώνεται γραμμικά με την αύξηση συντελεστή φόρτου Προτιμάται για δεδομένα αβέβαιου πλήθους και ποιότητας (εύρους κλειδιών). Ταξινομημένες λίστες: 1 + L/2., 3 42 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 51 / 59 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 52 / 59
Εξωτερικός Κατακερματισμός: (External Hashing) Πίνακες Κατακερματισμού στη Java Απαιτείται: java. u l.hashmap; Constructor HashMap() HashMap( size ) HashMap( size, lf ) HashMap(HashMap m) Αδειο πίνακα 16 θέσεων με μέγιστο συντελεστή φόρτου 0.75. Αδειο πίνακα size θέσεων με μέγιστο συντελεστή φόρτου 0.75. Αδειο πίνακα size θέσεων με μέγιστο συντελεστή φόρτου lf. Πίνακα με χαρακτηριστικά και τα στοιχεία του m. Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 53 / 59 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 54 / 59 Δημιουργία Πίνακα Κατακερματισμού στη Java Παραδείγματα Στη δήλωση αναφοράς σε αντικείμενο τύπου HashMap δηλώνουμε: Τον τύπο των κλειδιών, (αυτά κατακερματίζονται) Τον τύπο των δεδομένων (τιμών), Με δήλωση του είδους: HashMap<K,V> hmap; Πίνακας για κλειδιά τύπου Integer, τιμές τύπου String : HashMap<Integer,String> hm = HashMap<Integer,String>(); Πίνακας για κλειδιά τύπου String, τιμές τύπου MyClass: HashMap<String,MyClass> hm = HashMap<String,MyClass>(20); Υποκαθιστούνται από σύνθετους τύπους Integer, Float, Double (με κεφαλαίο το πρώτο γράμμα) Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 55 / 59 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 56 / 59
Μέθοδοι Πινάκων Κατακερματισμού στη Java Παράδειγμα Μέθοδος V put(k key, V value) V remove(object key) V get(object key) isempty() containskey(object key) Εισάγει το ζεύγος key, value Διαγράφει την εγγραφή για κλειδί key Επιστρέφει την τιμή για κλειδί key Επιστρέφει αν ο πίνακας είναι άδειος Επιστρέφει αν ο πίνακας περιέχει ζεύγος για το κλειδί key j a v a. u t i l. HashMap ; HashMapDemo { main ( S t r i n g a r g s [ ] ) { HashMap< S t r i n g, I n t e g e r > hm = HashMap< S t r i n g, I n t e g e r > ( ) ; hm. put ( O r e s t i s, I n t e g e r ( 3 7 ) ) ; containsvalue (Object value) size () Επιστρέφει αν ο πίνακας περιέχει ζεύγος με την τιμή value Επιστρέφει πλήθος ζευγών System. out. p r i n t l n (hm. get ( O r e s t i s ) ) ; Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 57 / 59 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 58 / 59 Ασκηση Δεδομένης εισόδου { 4371, 1323, 6173, 4199, 4344, 9679, 1989 και: Συνάρτηση Κατακερματισμού: h(k) = k mod 10 να βρεθούν οι πίνακες κατακερματισμού: με ξεχωριστή αλυσίδα. με ανοιχτή διευθυνσιοδότηση γραμμικής διερεύνησης. με ανοιχτή διευθυνσιοδότητη δευτεροβάθμιας διερεύνησης. με ανοιχτή διευθυνσιοδότηση δευτερεύουσας συνάρτησης κατακερματισμού: h 1 (k) = 7 (k mod 7) Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Δομές Δεδομένων - Κατακερματισμός 59 / 59