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

Σχετικά έγγραφα
10. Πίνακες Κατακερματισμού

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

Σύνοψη Προηγούμενου. Πίνακες (Arrays) Πίνακες (Arrays): Βασικές Λειτουργίες. Πίνακες (Arrays) Ορέστης Τελέλης

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

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

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

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

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

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

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

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

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

Ταξινόμηση: Εισαγωγικά. Ταξινόμηση (Sor ng) Αλγόριθμοι Απλής Ταξινόμησης. Βασικά Βήματα των Αλγορίθμων

Ο ΑΤΔ Λεξικό. Σύνολο στοιχείων με βασικές πράξεις: Δημιουργία Εισαγωγή Διαγραφή Μέλος. Υλοποιήσεις

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

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

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

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

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

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

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

Πίνακες Διασποράς. Χρησιμοποιούμε ένα πίνακα διασποράς T και μια συνάρτηση διασποράς h. Ένα στοιχείο με κλειδί k αποθηκεύεται στη θέση

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

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

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

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

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

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

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

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

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

Advanced Data Indexing

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

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

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

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

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

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

Σύνοψη Προηγούμενου. Λίστες (Lists) Συνδεδεμένες Λίστες: Εισαγωγή (1/2) Συνδεδεμένες Λίστες. Ορέστης Τελέλης

Advanced Data Indexing

Σύνοψη Προηγούμενου (1/2) Στοίβες, Ουρές, Ουρές Προτεραιότητας. Σύνοψη Προηγούμενου (2/2) Σημερινό Μάθημα. Πίνακες. Εισαγωγή, σε χρόνο O(1).

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

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

Αλγόριθμοι και Δομές Δεδομένων (IΙ) (γράφοι και δένδρα)

Στόχοι και αντικείμενο ενότητας. Πέρασμα Πίνακα σε Συνάρτηση (συν.) Πέρασμα Πίνακα σε Συνάρτηση. #8.. Ειδικά Θέματα Αλγορίθμων

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

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

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

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

Ουρές Προτεραιότητας: Υπενθύμιση. Σωροί / Αναδρομή / Ταξινόμηση. Υλοποίηση Σωρού. Σωρός (Εισαγωγή) Ορέστης Τελέλης

Πίνακες Κατακερματισμού. Hash Tables. Προγραμματισμός II 1

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

Κεφ.11: Ευρετήρια και Κατακερματισμός

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

Standard Template Library (STL) C++ library

ΚΑΤΑΚΕΡΜΑΤΙΣΜΟΣ HASHING

ΗΥ240: οµές εδοµένων Χειµερινό Εξάµηνο Ακαδηµαϊκό Έτος Παναγιώτα Φατούρου. Προγραµµατιστική Εργασία 3 ο Μέρος

HY240 : Δομές Δεδομένων. Φροντιστήριο Προγραμματιστικής Εργασίας 2 ο και 3 ο Μέρος

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΕΠΛ231: Δομές Δεδομένων και Αλγόριθμοι. Εαρινό Εξάμηνο Φροντιστήριο 10 ΛΥΣΕΙΣ

Οι βασικές λειτουργίες (ή πράξεις) που γίνονται σε μια δομή δεδομένων είναι:

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

Προγραμματισμός Η/Υ (ΤΛ2007 )

Ενότητα 3: ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ

Πληροφορική 2. Δομές δεδομένων και αρχείων

Δομημένος Προγραμματισμός (ΤΛ1006)

Εισαγωγή στο Bison. Μεταγλωττιστές, Χειμερινό εξάμηνο

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

Δομές Δεδομένων Standard Template Library (STL) 23/3/2017 ΜΠΟΜΠΟΤΑΣ ΑΓΟΡΑΚΗΣ

Εισαγωγή στην Επεξεργασία Ερωτήσεων. Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1

Προγραμματισμός Η/Υ. Ενότητα 8: Ειδικά Θέματα Αλγορίθμων

Άσκηση 1. με κόκκινο χρώμα σημειώνονται οι κρίσιμοι κόμβοι

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

Τι είναι αλγόριθμος; Υποπρογράμματα (υποαλγόριθμοι) Βασικές αλγοριθμικές δομές

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Περιεχόμενα. Περιεχόμενα

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

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

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

Κεφάλαιο 13. Αποθήκευση σε ίσκους, Βασικές οµέςαρχείων, και Κατακερµατισµός. ιαφάνεια 13-1

Βασικές δοµές δεδοµένων. Ορολογία λιστών. 8.1 Βασικές έννοιες δοµών δεδοµένων 8.2 Υλοποίηση δοµών δεδοµένων 8.3 Μια σύντοµη υπόθεση εργασίας

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

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

Ταξινόμηση κάδου και ταξινόμηση Ρίζας Bucket-Sort και Radix-Sort

Εργαστήριο 2 Δυναμικές Δομές Δεδομένων Διδάσκοντες: Δρ. Γεώργιος Δημητρίου Δρ. Άχμεντ Μάχντι

Οργάνωση Αρχείων. Βάσεις Δεδομένων : Οργάνωση Αρχείων 1. Blobs

ΤΕΙ ΙΟΝΙΩΝ ΝΗΣΩΝ ΣΧΟΛΗ ΔΙΟΙΚΗΣΗΣ ΚΑΙ ΟΙΚΟΝΟΜΙΑΣ ΤΜΗΜΑ ΔΙΟΙΚΗΣΗΣ ΕΠΙΧΕΙΡΗΣΕΩΝ - ΕΙΣ

Επιµέλεια Θοδωρής Πιερράτος

Αριθμοθεωρητικοί Αλγόριθμοι

Διάλεξη 16: Σωροί. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας - Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις

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

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ

Μεταγλωττιστές. Συντακτικός Αναλυτής Κατασκευή Πίνακα Συμβόλων (ΠΣ) Εργαστήριο 7. Διδάσκοντες: Δρ. Γεώργιος Δημητρίου Δρ. Άχμεντ Μάχντι

ΚΕΦΑΛΑΙΟ 2: Τύποι δεδομένων και εμφάνιση στοιχείων...33

Κεφάλαιο 2 ο Βασικές Έννοιες Αλγορίθμων (σελ )

HY-252 Αντικειμενοστραφής Προγραμματισμός. Χειμερινό Εξάμηνο 2012 Διδάσκων: Χριστοφίδης Βασίλης. Ημερομηνία Παράδοσης: 16/11/2012

ΗΥ240: Δομές Δεδομένων Εαρινό Εξάμηνο Ακαδημαϊκό Έτος 2017 Διδάσκουσα: Παναγιώτα Φατούρου Προγραμματιστική Εργασία - 2o Μέρος

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

H κλάση ArrayList. Γιώργος Θάνος. Γραφείο Γ. Γκλαβάνη 37. Αντικει ενοστραφής Προγρα. ος όροφος

Άσκηση 1 (ανακοινώθηκε στις 20 Μαρτίου 2017, προθεσμία παράδοσης: 24 Απριλίου 2017, 12 τα μεσάνυχτα).

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

Transcript:

Πίνακες (Μια παλιά άσκηση) Πίνακες Κατακερματισμού (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