ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΠΛ231: Δομές Δεδομένων και Αλγόριθμοι Εαρινό Εξάμηνο 2017-2018 Φροντιστήριο 3 - Λύσεις 1. Εστω ο πίνακας Α = [12, 23, 1, 5, 7, 19, 2, 14]. i. Να δώσετε την κατάσταση του πίνακα σε κάθε τερματισμό του εξωτερικού βρόγχου του αλγορίθμου ταξινόμησης με επιλογή. 1η εκτέλεση. 2η εκτέλεση. 3η εκτέλεση. 4η εκτέλεση. 5η εκτέλεση. 6η εκτέλεση. 7η εκτέλεση. 1 23 12 5 7 19 2 14 1 2 12 5 7 19 23 14 1 2 5 12 7 19 23 14 1 2 5 7 12 14 23 19 ii. Να δώσετε την κατάσταση του πίνακα σε κάθε τερματισμό του εξωτερικού βρόγχου του αλγορίθμου ταξινόμησης με εισαγωγή. 1η εκτέλεση. 2η εκτέλεση. 3η εκτέλεση. 4η εκτέλεση. 5η εκτέλεση. 1 12 23 5 7 19 2 14 1 5 12 23 7 19 2 14 1 5 7 12 23 19 2 14 1
6η εκτέλεση. 7η εκτέλεση. 1 5 7 12 19 23 2 14 iii. Να δώσετε την κατάσταση του πίνακα σε κάθε τερματισμό των αναδρομικών εκτελέσεων του αλγορίθμου ταξινόμησης με συγχώνευση. Αρχικά καλείται η MergeSort(A,temp,0,7) η οποία καλεί τις MergeSort(A,temp,0,3) και MergeSort(A,temp,4,7). Η πρώτη καλεί τις MergeSort(A,temp,0,1) και MergeSort(A,temp,2,3), και η δεύτερη καλεί τις MergeSort(A,temp,4,5) και MergeSort(A,temp,6,7). Η κάθε εκτέλεση της MergeSort(A,temp,x,y) όπου y=x+1 καλεί τις διαδικασίες MergeSort(A,temp,x,x) και MergeSort(A,temp,y,y) όπου και τερματίζουν αμέσως χωρίς να πραγματοποιούν όποια αλλαγή στον πίνακα. Οι υπόλοιπες εκτελέσεις της Mergesort έχουν τα εξής αποτελέσματα. Mergesort(A,temp,0,1) Mergesort(A,temp,2,3) Mergesort(A,temp,0,3) Mergesort(A,temp,4,5) Mergesort(A,temp,6,7) Mergesort(A,temp,4,7) Mergesort(A,temp,0,7) 1 5 12 23 7 19 2 14 12 23 1 5 2 7 14 19 iv. Να δώσετε την κατάσταση του πίνακα σε κάθε τερματισμό των αναδρομικών εκτελέσεων του αλγορίθμου ταξινόμησης quicksort. Αρχικά καλείται η QuickSort(A,0,7). Υποθέτωντας πως το άξον στοιχείο υπολογίζεται ως ο μισός του μεγέθους του πίνακα εισόδου, δηλαδή 7/2 = 3 (άξιον στοιχείο 5), η διαδικασία Partition(A,0,7,3) έχει το εξής αποτέλεσμα στον πίνακα. 2 1 23 14 7 19 12 5 και επιστρέφει την ϑέση 2 ως την ϑέση διαχωρισμού του πίνακα σε στοιχεία μικρότερα και μεγαλύτερα του 5. Ανταλλάζοντας το άξιον στοιχείο με το στοιχείο της ϑέσης 2 έχουμε το εξής. 2 1 5 14 7 19 12 23 Επειτα καλείται η QuickSort(A,0,1) η οποία δίνει: 1 2 5 14 7 19 12 23 Στην συνέχεια καλείται η QuickSort(A,3,7) η οποία χρησιμοποιώντας ως άξιον στοιχείο το στοιχείο (3 + 7)/2 = 5 έχει ως αποτέλεσμα 1 2 5 14 7 12 19 23 2
με ϑέση διαχωρισμού (ο αριθμός επιστροφής της Partition(A,3,7,5)) την ϑέση 6. Ετσι και μετά καλείται η QuickSort(A,3,5) και έπειτα η QuickSort(A,7,7) η οποία τερματίζει χωρίς να επεξεργαστεί τον πίνακα. Η QuickSort(A,3,5) δίνει με ϑέση διαχωρισμού την ϑέση 3. Καθώς ο πίνακας έχει ήδη ταξινομηθεί οι υπόλοιπες εκτελέσεις της διαδικασίας δεν ϑα επιφέρουν αλλαγές στον πίνακα. 2. Εστω πίνακας ακεραίων [a 0,... a n 1 ] για κάποιο n. Επιπλέον γνωρίζουμε ότι για 0 i < n τότε a i m για κάποιο m. Προτίνετε τον αποδοτικότερο αλγόριθμο ταξινόμησης αν i. m = c 1 n + c 2 για κάποια c 1 > 0, c 2 > 0. ii. m c 1 n + c 2 και m c 3 n log 2 n + c 4 για κάποια c 1 > 0, c 2 > 0, c 3 > 0, c 4 > 0. iii. m c 1 n + c 2 και m c 3 n 2 + c 4 n + c 5 για κάποια c 1 > 0, c 2 > 0, c 3 > 0, c 4 > 0, c 5 > 0. iv. m Θ(log n). v. m O(n n ). Δικαιολογήστε τις απαντήσεις σας. i. m = c 1 n + c 2 για κάποια c 1 > 0, c 2 > 0. Ο αλγόριθμος ταξινόμησης bucketsort επιτυγχάνει ταξινόμηση σε χρόνο T(n) O(n + m) δηλαδή υπάρχει c > 0, n 0 0 έτσι ώστε για κάθε n n 0 ισχύει ότι T(n) c(n + c 1 n + c 2 ) = T(n) c (c 1 + 1) n + c c 2 = Προτίνεται ο αλγόριθμος ταξινόμησης bucketsort γιατί επιτυγχάνει καλύτερο χρόνο ταξινόμησης από τους αλγόριθμους mergesort και quicksort που έχουν χρόνο ταξινόμησης O(n log 2 (n)). ii. m c 1 n + c 2 και m c 3 n log 2 n + c 4 για κάποια c 1 > 0, c 2 > 0, c 3 > 0, c 4 > 0. Στη χείριστη περίπτωση ο αλγόριθμος ταξινόμησης bucketsort επιτυγχάνει ταξινόμηση σε χρόνο T(n) O(n + m) με m = c 3 n log 2 n + c 4. δηλαδή υπάρχει c > 0, n 0 0 έτσι ώστε για κάθε n n 0 ισχύει ότι T(n) c(n + c 3 n log 2 n + c 4 ) = T(n) c n + c c 3 n log 2 n + c c 4 = T(n) O(n log 2 n) Στην καλύτερη περίπτωση ο αλγόριθμος ταξινόμησης bucketsort επιτυγχάνει ταξινόμηση σε χρόνο T(n) O(n + m) με m = c 1 n + c 2. Δηλαδή υπάρχει c > 0, n 0 0 έτσι ώστε για κάθε n n 0 ισχύει ότι T(n) c(n + c 1 n + c 2 ) = T(n) c (c 1 + 1) n + c c 2 = 3
Προτίνεται ο αλγόριθμος ταξινόμησης bucketsort γιατί ενώ επιτυγχάνει ίδιο χρόνο ταξινόμησης, O(n log 2 (n)), με τους αλγόριθμους mergesort και quicksort στη χείριστη περίπτωση, υπερέχει στην ταξινόμηση καλύτερης περίπτωσης με χρόνο O(n). iii. m c 1 n + c 2 και m c 3 n 2 + c 4 n + c 5 για κάποια c 1 > 0, c 2 > 0, c 3 > 0, c 4 > 0, c 5 > 0. Στην χείριστη περίπτωση ο αλγόριθμος ταξινόμησης bucketsort επιτυγχάνει ταξινόμηση σε χρόνο T(n) O(n + m) με m = c 3 n 2 + c 4 n + c 5. Δηλαδή υπάρχει c > 0, n 0 0 έτσι ώστε για κάθε n n 0 ισχύει ότι T(n) c(n + c 3 n 2 + c 4 n + c 5 ) = T(n) c c 3 n 2 + c (c 4 + 1 n + c c 5 = T(n) O(n 2 ) Προτίνεται ο αλγόριθμος ταξινόμησης quicksort (η mergesort) γιατί επιτυγχάνει χρόνο ταξινόμησης O(n log 2 (n)) σε αντίθεση με τον με τον αλγόριθμο bucketsort που στην χείριστη περίπτωση ταξινομεί σε χρόνο O(n 2 ). iv. m Θ(log n). Το γεγονός ότι m Θ(log n) μας επιτρέπει να συμπεράνουμε ότι υπάρχει c > 0, n 0 έτσι ώστε για κάθε n n 0 ισχύει ότι m c log 2 n. Άρα στην χείριστη περίπτωση ο αλγόριθμος ταξινόμησης bucketsort επιτυγχάνει ταξινόμηση σε χρόνο T(n) O(n + m) με m = c log 2 n. Δηλαδή υπάρχει c > 0, n 0 0 έτσι ώστε για κάθε n n 0 T(n) c(n + c log 2 n) = T(n) c c n + c c log 2 n = Προτίνεται ο αλγόριθμος ταξινόμησης bucketsort γιατί επιτυγχάνει καλύτερο χρόνο ταξινόμησης από τους αλγόριθμους mergesort και quicksort που έχουν χρόνο ταξινόμησης O(n log 2 (n)). v. m O(n n ). Το γεγονός ότι m O(n n ) μας επιτρέπει να συμπεράνουμε ότι υπάρχει c > 0, n 0 έτσι ώστε για κάθε n n 0 ισχύει ότι m c n n. Άρα στην χείριστη περίπτωση ο αλγόριθμος ταξινόμησης bucketsort επιτυγχάνει ταξινόμηση σε χρόνο T(n) O(n + m) με m = c n n. Δηλαδή υπάρχει c > 0, n 0 0 έτσι ώστε για κάθε n n 0 T(n) c(n + c n n ) = T(n) c n + c c n n = T(n) O(n n ) Προτίνεται ο αλγόριθμος ταξινόμησης quicksort (η mergesort) γιατί επιτυγχάνει χρόνο ταξινόμησης O(n log 2 (n)) σε αντίθεση με τον με τον αλγόριθμο bucketsort που στην χείριστη περίπτωση ταξινομεί σε χρόνο O(n n ). 3. Δώστε υλοποίηση της διαδικασίας mergesort που να αποφεύγει την αντιγραφή ολόκληρου του βοη- ϑητικού πίνακα στο τέλος κάθε αναδρομικής κλήσης. (Υπόδειξη: Θεωρείστε ότι αρχικά ο βοηθητικός πίνακας είναι αντίγραφο του πίνακα εισόδου της διαδικασίας). 4
Αρχικά ϑεωρούμε ότι ο βοηθητικός πίνακας tmp είναι αντίγραφο του πίνακα εισόδου A της διαδικασίας. Αυτό μας επιτρέπει να ανταλλάζουμε τον πίνακα εισόδου με το βοηθητικό πίνακα κάθε φορά που καλούμε αναδρομικά τη διαδικασία mergesort. Ετσι δεν χρειάζεται η αντιγραφή ολόκληρου του πίνακα στο τέλος κάθε αναδρομικής κλήσης. void mergesort ( i n t [ ] A, i n t [ ] tmp, i n t l, i n t r ) { i f ( l r ) return ; i n t mid ( l + r ) / 2 ; mergesort ( tmp, A, l, mid ) ; mergesort ( tmp, A, mid + 1, r ) ; i n t k l ; i n t i l, j mid + 1 ; while ( i < mid && j < r ) i f ( tmp [ i ] < tmp [ j ] ) A[ k++] tmp [ i + +]; e l s e i f ( tmp [ i ] > tmp [ j ] ) A[ k++] tmp [ j + +]; } while ( i < mid ) A[ k++] tmp [ i + +]; while ( j < r ) A[ k++] tmp [ j + +]; 4. Ο καθηγητής Δ. Α. Αφελής υποστηρίζει πως έχει ανακαλύψει μια νέα δομή δεδομένων για υλοποίηση ουράς προτεραιότητας η οποία επιτρέπει υλοποίηση κάθε μιας από τις πράξεις Insert, FindMax,και DeleteMax σε χρόνο εκτέλεσης χειρίστης περίπτωσης Ο(1). Να αποδείξετε ότι ο κα- ϑηγητής έχει λάθος. Υποθέτουμε ότι ο καθηγητής έχει δίκαιο. Ο πιο κάτω αλγόριθμος υποθέτει υλοποίηση της δομής NaiveList του καθηγητή. i n t A[ n ] ; NaiveList l new NaiveList ( ) ; for ( i 0; i < n ; i ++) l. I n s e r t (A[ i ] ) ; for ( i 0; i < n ; i ++) { A[ i ] l. FindMax ( ) ; l. DeleteMax ( ) ; } Παρατηρούμε ότι, αν οι πράξεις Insert, FindMax και DeleteMax έχουν χρόνο εκτέλεσης O(1), ο πιο πάνω αλγόριθμος επιτυγχάνει ταξινόμηση του πίνακα Α (σε φθίνουσα σειρά) σε χρόνο O(n). Αυτό όμως έρχεται σε αντίφαση με το ϑεώρημα που δηλώνει ότι ο χρόνος εκτέλεσης οποιουδήποτε σειριακού αλγόριθμου ταξινόμησης είναι Ω(n log 2 n). Επομένως ο καθηγητής έχει λάθος. 5