Διάλεξη Ε7: Επανάληψη Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Hashing, Final Exam Διδάσκων: Κωνσταντίνος Κώστα ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. Ε7-1
Άσκηση 1 'Έστω το σύνολο {9, 21, 8, 25, 26, 12, 13). Οι αριθμοί του συνόλου έχουν εισαχθεί σε ένα πίνακα κατακερματισμού μεγέθους 13 χρησιμοποιώντας τη συνάρτηση κατακερματισμού h(x) = x mod 13, και αντιμετωπίζοντας οποιεσδήποτε συγκρούσεις με τη μέθοδο της γραμμικής αναζήτησης ανοικτής διεύθυνσης. Το αποτέλεσμα των εισαγωγών, των οποίων η σειρά δεν μας είναι γνωστή, φαίνεται πιο κάτω Θεωρήστε τις πιο κάτω προτάσεις: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 26 25 8 21 9 12 (α) Ο αριθμός 25 εισάχθηκε τελευταίος. (β) Τουλάχιστον δυο αριθμοί εισάχθηκαν πριν από τον αριθμό 25. (γ) Ο αριθμός 8 εισάχθηκε πριν από τον αριθμό 12. (δ) Ο αριθμός 9 εισάχθηκε πριν από τον αριθμό 8. Για κάθε μια από τις πιο πάνω προτάσεις, να αποφασίσετε κατά πόσον ισχύει (i) σε οποιαδήποτε σειρά εισαγωγής των στοιχείων που δημιουργεί τον πιο πάνω πίνακα. (ii) σε καμία σειρά εισαγωγής των στοιχείων που δημιουργεί τον πιο πάνω πίνακα. (iii) σε κάποιες αλλά όχι όλες τις σειρές εισαγωγής των στοιχείων που δημιουργούν τον πιο πάνω πίνακα. Να αιτιολογήσετε τις απαντήσεις σας. ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. Ε7-2
Άσκηση 1 Κατ' αρχήν σημειώνουμε το υπόλοιπο κάθε διαίρεσης 9 % 13 = 9 21 % 13 = 8 8 % 13 = 8 25 % 13 = 12 26 % 13 = 0 12 % 13 = 12 13 % 13 = 0 Μετά βρίσκουμε ποια στοιχεία βρίσκονται ήδη στο σωστό bucket Αυτά τα στοιχεία είναι το : 8, 12, 13. Μετά βρίσκουμε ποια εξαρτώνται από αυτά τα στοιχεία. Καταλήγουμε στα εξής συμπεράσματα (σχέσεις) (όπου x=>y δηλώνει ότι ο x εισήχθη πριν το y) Α) 8 => 21 => 9 Β) 12 => 13 => 26 => 25 (Εφόσον ο 26 αναγκάζεται να δημιουργήσει τέσσερα collision προτού εισαχθεί) ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. Ε7-3
Άσκηση 1 a) Ο αριθμός 25 εισάχθηκε τελευταίος. Ισχύει το (iii) Δηλαδή ο 25 είναι τελευταίος σε κάποιες σειρές εισαγωγής. a) 25 τελευταίος : { 8,21,9,12,13,26,25 } b) 25 μη-τελευταίος: { 12,13,26,25, 8,21,9 } b) Τουλάχιστον δυο αριθμοί εισάχθηκαν πριν τον αριθμό 25. Ισχύει το (i) Δηλαδή πάντα θα έχουν εισαχθεί τουλάχιστο 2 στοιχεία πριν το 25. Εξάγεται κατευθείαν από την σχέση: a) 13 => 26 => 25 b) 12=>25 Θα πρέπει να έχουμε 3 conflicts αλλά μπορούμε να έχουμε μόνο 2! ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. Ε7-4
Άσκηση 1 c) Ο αριθμός 8 εισάχθηκε πριν τον αριθμό 12 Ισχύει το (iii) δηλαδή ο 8 μπορεί να εισήχθη πριν το 12 ή μετά το 12. a) 8 πριν 12 : { 8,21,9,12,13,26,25 } b) 8 μετά 12 : { 12,13,26,25,8,21,9 } d) Ο αριθμός 9 εισάχθηκε πριν τον αριθμό 8 Ισχύει το (ii) σε καμία σειρά εισαγωγής δεν μπορεί ο 9 να εισήχθη πριν το 8. Εξάγεται κατευθείαν από την σχέση: a) 8 => 21 => 9 ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. Ε7-5
Άσκηση 2 α) Να δείξετε το αποτέλεσμα της διαδοχικής εισαγωγής των κλειδιών {5, 28, 19, 15, 20, 33, 12, 17, 29} σε ένα πίνακα κατακερματισμού μεγέθους 9 με συνάρτηση κατακερματισμού h(k) = k mod 9, χρησιμοποιώντας τις ακόλουθες μεθόδους διαχείριση συγκρούσεων: 1) Αλυσίδωση (Chaining) 2) Γραμμική Αναζήτηση ανοικτής διεύθυνσης (Linear Probing) 3) Δευτεροβάθμια αναζήτηση ανοικτής διεύθυνσης (Quadratic Probing), όπου το μέγεθος του πίνακα είναι 11 και η αρχική συνάρτηση κατακερματισμού h(k)=k mod 11. β) Τι εναλλακτικές δομές (αντί για συνδεδεμένες λίστες) θα μπορούσατε να χρησιμοποιήσετε στην τεχνική κατακερματισμού με αλυσίδωση. Ποια είναι τα πλεονεκτήματα και μειονεκτήματα της εναλλακτικής σας λύσης. Εκφράσετε τον χρόνο εκτέλεσης των διαδικασιών εισαγωγής και αναζήτησης συνάρτηση του load factor λ (όπου χρειάζεται) ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. Ε7-6
Άσκηση 2 a) Κατ' αρχήν σημειώνουμε το υπόλοιπο κάθε διαίρεσης 5%9=5 28%9=1 19%9=1 15%9=6 20%9=2 33%9=6 12%9=3 17%9=8 29%9=2 1) Αλυσίδωση (Chaining): 0 x 1 19, 28, x 2 29, 20, x 3 12, x 4 x 5 5, x 6 33, 15, x 7 x 8 17, x ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. Ε7-7
Άσκηση 2 a) Κατ' αρχήν σημειώνουμε το υπόλοιπο κάθε διαίρεσης 5%9=5 28%9=1 19%9=1 15%9=6 20%9=2 33%9=6 12%9=3 17%9=8 29%9=2 2) Γραμμική Αναζήτηση ανοικτής διεύθυνσης (Linear Probing): Σημείωση: (cl:) = collision 0 29 1 28 (cl:19) 2 19 (cl:20,cl:29) 3 20 (cl:12,cl:29) 4 12 (cl:29) 5 5 (cl:29) 6 15 (cl:33,cl:29) 7 33 (cl:29) 8 17 (cl:29) ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. Ε7-8
a) Κατ' αρχήν σημειώνουμε το υπόλοιπο κάθε διαίρεσης 5%11=5 28%11=6 19%11=8 15%11=4 20%11=9 33%11=0 12%11=1 17%11=6 29%11=7 Άσκηση 2 3) Δευτεροβάθμια αναζήτηση ανοικτής διεύθυνσης (Quadratic Probing): 0 33 ([X+4] cl:29) 1 12 ([X+16] cl:29) 2 3 4 15 5 5 ([X+9] cl:29) 6 28 (cl:17) 7 17 ([X] cl:29) 8 19 ([X+1] cl:29) 9 20 10 29 [X+25] ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. Ε7-9
Άσκηση 2 b) Τι εναλλακτικές δομές (αντί για συνδεδεμένες λίστες) θα μπορούσατε να χρησιμοποιήσετε στην τεχνική κατακερματισμού με αλυσίδωση. Ποια είναι τα πλεονεκτήματα και μειονεκτήματα της εναλλακτικής σας λύσης. Εκφράσετε τον χρόνο εκτέλεσης των διαδικασιών εισαγωγής και αναζήτησης συνάρτηση του load factor λ (όπου χρειάζεται) m-ary tree : Εισαγωγή=O(1+log m λ) Αναζήτηση=O(1+log m λ) Μειονέκτημα: Η χρήση δυο pointers ανά κόμβο στοιχίζει ακόμη περισσότερη μνήμη από την μονά-συνδεδεμένη υλοποίηση της αλυσίδωσης. Sorted Array (using realloc): Εισαγωγή=O(1+log 2 λ) Αναζήτηση=O(1+log 2 λ) (Αυτό μπορεί να υλοποιηθεί με την χρήση binary search) Μειονέκτημα: Η χρήση realloc μπορεί να στοιχίσει O(1+λ) κόστος αν το λειτουργικό σύστημα δεν μπορεί να μας δώσει συνεχόμενα blocks μνήμης και αναγκαστεί να αντιγράψει τα στοιχεία σε νέα τοποθεσία μνήμης. ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. Ε7-10
Άσκηση 3 Έχοντας ως είσοδο 2 πίνακες: arr1[0..m-1] και arr2[0..n-1] βρέστε κατά πόσο ο arr2[] είναι υποσύνολο του arr1[]. Θεωρείστε ότι και οι 2 πίνακες δεν είναι ταξινομημένοι. Θεωρείστε ότι οι πίνακες μας περιέχουν μοναδικά στοιχεία (δεν παρουσιάζεται το ίδιο στοιχείο περισσότερο από 1 φορά). Παραδείγματα: Input: arr1[] = {11, 1, 13, 21, 3, 7}, arr2[] = {11, 3, 7, 1}Output: arr2[] is a subset of arr1[] Input: arr1[] = {1, 2, 3, 4, 5, 6}, arr2[] = {1, 2, 4}Output: arr2[] is a subset of arr1[] Κι όλο αυτό σε χρόνο που η αναζήτηση ενός στοιχείου να έχει άνω φράγμα πολυπλοκότητας O( n ) και κάτω φράγμα Ω(1) ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. Ε7-11
Άσκηση 3 int issubset(int arr1[], int arr2[], int m, int n) { int HashSet[hsize] = { }; //αρχικοποίηση // έστω ότι έχουμε μια συνάρτηση add2hashtable(hashtable, element) for(int i = 0; i < m; i++) // για όλα τα στοιχεία του arr1 { add2hashtable(hashset, arr1[i]); //πρόσθεσε το στοιχείο στο hashtable! } // Διαπέρασε όλα τα στοιχεία του 2ου πίνακα και δες αν υπάρχουν μέσα στο hashtable for(int i = 0; i < n; i++) { if(hashtablecontains(hashset, arr2[i])) return false; //αν βρεις έστω και για ένα στοιχείο του arr2 ότι δεν //υπάρχει μέσα στο hashtable επέστρεψε λάθος } return true; //αν έφτασες ως εδώ σημαίνει ότι } ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. Ε7-12
Τελική Εξέταση Επισκόπηση Απορίες ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. Ε7-13