Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων 5. Απλή Ταξινόμηση 2 ομές εδομένων 4 5 Χρήστος ουλκερίδης Τμήμα Ψηφιακών Συστημάτων 11/11/2016
Εισαγωγή Η ταξινόμηση (sorting) είναι ένα από τα βασικά προβλήματα στην επιστήμη των υπολογιστών π.χ. Ονόματα σε αλφαβητική σειρά, πωλήσεις ανά τιμή, πόλεις με βάση πληθυσμό,... Η ταξινόμηση δεδομένων μπορεί να είναι ένα πρώτο βήμα προς την αναζήτηση (θυμηθείτε τη δυαδική αναζήτηση) Η ταξινόμηση είναι σημαντική και πολύ χρονοβόρα Αποτέλεσε θέμα εκτεταμένων ερευνών Αναπτύχθηκαν πολλές διαφορετικές μέθοδοι ταξινόμησης είτε για παράδειγμα: http://en.wikipedia.org/wiki/sorting_algorithm Δομές Δεδομένων, 3ο Εξάμηνο 2
Αλγόριθμοι Απλής Ταξινόμησης Ταξινόμηση φυσαλίδας (bubble sort) Ταξινόμηση επιλογής (selection sort) Ταξινόμηση παρεμβολής (insertion sort) Οι παραπάνω αλγόριθμοι είναι σχετικά άτεχνοι και συγκριτικά αργοί Αξίζει να εξεταστούν διότι γίνονται εύκολα κατανοητοί Μερικές φορές λειτουργούν καλύτερα από πιο εκλεπτυσμένους αλγόριθμους Για μικρά αρχεία ή για σχεδόν ταξινομημένα αρχεία Η ταξινόμηση παρεμβολής είναι καλύτερη από την quicksort Δομές Δεδομένων, 3ο Εξάμηνο 3
Βασικά Βήματα των Αλγορίθμων Ένα πρόγραμμα μπορεί μόνο να συγκρίνει δύο στοιχεία κάθε φορά (δεν μπορεί να έχει μια καθολική εικόνα στα δεδομένα όπως ο άνθρωπος) Οι τρεις αλγόριθμοι που θα εξετάσουμε αποτελούνται από δύο βήματα και εκτελούνται συνεχώς μέχρι να ταξινομηθούν τα δεδομένα 1. Συγκρίνουν δύο στοιχεία 2. Αντιμεταθέτουν δύο στοιχεία ή αντιγράφουν ένα Δομές Δεδομένων, 3ο Εξάμηνο 4
1. Ταξινόμηση Φυσαλίδας (Bubble Sort) Απλή αλλά αργή μέθοδος ταξινόμησης Συγκρίνει κάθε στοιχείο στη γραμμή με το επόμενο στοιχείο και αντιμεταθέτει τα στοιχεία εάν χρειαστεί H διαδικασία επαναλαμβάνεται μέχρι να κάνει ένα πέρασμα της γραμμής χωρίς να χρειαστεί να αντιμεταθέσει κάποια στοιχεία Οι μεγαλύτερες τιμές μετακινούνται στο τέλος της γραμμής ενώ οι μικρότερες προς την αρχή της γραμμής Δομές Δεδομένων, 3ο Εξάμηνο 5
Βήματα Αλγορίθμου Τα βήματα του αλγορίθμου ταξινόμησης φυσαλίδας: Σύγκρινε τα γειτονικά στοιχεία Εάν το πρώτο είναι μεγαλύτερο από το δεύτερο, αντιμετάθεσέ τα Μετακινήσου μια θέση δεξιά και επανέλαβε τα βήματα για όλα τα στοιχεία (ολοκλήρωση πρώτου περάσματος) Συνέχισε τη διαδικασία μέχρι να μην υπάρχουν άλλα ζεύγη για να συγκρίνεις Ο αλγόριθμος αυτός ταξινομεί τα στοιχεία σε αύξουσα σειρά. Πώς θα τον τροποποιούσατε ώστε να ταξινομεί σε φθίνουσα σειρά; Δομές Δεδομένων, 3ο Εξάμηνο 6
Παράδειγμα: Ταξινόμηση Φυσαλίδας (1 η Σάρωση) Επανέλαβε μέχρι να μην απαιτούνται άλλες αλλαγές Δομές Δεδομένων, 3ο Εξάμηνο 7
Παρατηρήσεις Μετά το πρώτο πέρασμα από τα δεδομένα Έχουν γίνει Ν-1 συγκρίσεις Έχουν γίνει από 0 ως Ν-1 αντιμεταθέσεις Το στοιχείο στο τέλος του πίνακα έχει ταξινομηθεί και δε θα μετακινηθεί ξανά Μετά το δεύτερο πέρασμα από τα δεδομένα... Έχουν γίνει άλλες Ν-2 συγκρίσεις Έχουν γίνει από 0 ως Ν-2 νέες αντιμεταθέσεις Το στοιχείο που βρίσκεται μία θέση πριν το τέλος του πίνακα έχει ταξινομηθεί και δε θα μετακινηθεί ξανά Δομές Δεδομένων, 3ο Εξάμηνο 8
November 18, 2016 Δομές Δεδομένων, 3ο Εξάμηνο 9
Δομές Δεδομένων, 3ο Εξάμηνο 10
November 18, 2016 Δομές Δεδομένων, 3ο Εξάμηνο 11
Σταθερές Σε πολλούς αλγόριθμους υπάρχουν συνθήκες που παραμένουν αναλλοίωτες καθώς εξελίσσεται ο αλγόριθμος Αυτές οι συνθήκες ονομάζονται σταθερές Είναι χρήσιμες για την κατανόηση του αλγόριθμου αλλά και για debugging Στον αλγόριθμο φυσαλίδας Η σταθερά είναι ότι τα στοιχεία δεξιά του out είναι ταξινομημένα Αυτό ισχύει καθ όλη την εκτέλεση του αλγόριθμου Δομές Δεδομένων, 3ο Εξάμηνο 12
Ανάλυση Πολυπλοκότητας Αλγόριθμου Φυσαλίδας Έστω Ν στοιχεία Στο 1 ο πέρασμα Ν-1 συγκρίσεις, στο 2 ο πέρασμα Ν-2 συγκρίσεις,... Συνεπώς: (Ν-1)+(Ν-2)+...+1=Ν*(Ν-1)/2 συγκρίσεις Άρα περίπου Ν 2 /2 συγκρίσεις Οι αντιμεταθέσεις είναι λιγότερες από τις συγκρίσεις Για τυχαία δεδομένα, μια αντιμετάθεση είναι απαραίτητη περίπου τις μισές φορές Ν 2 /4 αντιμεταθέσεις Στη χειρότερη περίπτωση (αντίστροφα ταξινομημένος πίνακας) απαιτούνται τόσες αντιμεταθέσεις όσες και συγκρίσεις Οι συγκρίσεις και αντιμεταθέσεις είναι ανάλογες του Ν 2 Ο(Ν 2 ) Δομές Δεδομένων, 3ο Εξάμηνο 13
Απλή Βελτίωση της BubbleSort Βελτιώστε την BubbleSort ώστε να σταματήσει την εκτέλεσή της μόλις ο πίνακας ταξινομηθεί Δομές Δεδομένων, 3ο Εξάμηνο 14
2. Ταξινόμηση Επιλογής (Selection Sort) H ταξινόμηση επιλογής βελτιώνει την ταξινόμηση φυσαλίδας μειώνοντας τον αριθμό των αντιμεταθέσεων που είναι απαραίτητες από Ο(Ν 2 ) σε Ο(Ν) Ο αριθμός συγκρίσεων παραμένει Ο(Ν 2 ) Προσφέρει σημαντική βελτίωση όταν τα αντικείμενα που πρέπει να αντιμετατίθενται στη μνήμη έχουν μεγάλο όγκο δεδομένων ε συμβαίνει στη Java που λειτουργεί με αναφορές σε αντικείμενα Δομές Δεδομένων, 3ο Εξάμηνο 15
Βασική Ιδέα Επέλεξε το μικρότερο μη ταξινομημένο στοιχείο που παραμένει στη γραμμή Αντιμετάθεσε το στοιχείο αυτό με το στοιχείο στην επόμενη προς συμπλήρωση θέση Δομές Δεδομένων, 3ο Εξάμηνο 16
Παράδειγμα: Ταξινόμηση Επιλογής Παράδειγμα November 18, 2016 διαφάνειες μαθήματος Data Δομές structures, Δεδομένων, GMU, 3ο Εξάμηνο 2005 (instructor: J. Lin) 17
November 18, 2016 Δομές Δεδομένων, 3ο Εξάμηνο 18
Δομές Δεδομένων, 3ο Εξάμηνο 19
November 18, 2016 Δομές Δεδομένων, 3ο Εξάμηνο 20
Ανασκόπηση Αλγόριθμου Επιλογής Σταθερά Τα στοιχεία με δείκτες μικρότερους ή ίσους με το out είναι πάντα ταξινομημένα Απόδοση Χρειάζονται πολύ λιγότερες αντιμεταθέσεις σε σχέση με τον αλγόριθμο φυσαλίδας Για μικρές τιμές του Ν, η ταξινόμηση επιλογής μπορεί να είναι σημαντικά ταχύτερη Ειδικά εάν ο χρόνος που απαιτείται για μια αντιμετάθεση είναι πολύ μεγαλύτερος από το χρόνο μιας σύγκρισης Δομές Δεδομένων, 3ο Εξάμηνο 21
Απλή Βελτίωση της SelectionSort Βελτιώστε την SelectionSort ώστε να κάνει τα μισά περάσματα στον αρχικό πίνακα Ιδέα: Καθώς διατρέχει τον πίνακα ο εσωτερικός βρόχος for, να διατηρούμε όχι μόνο το min, αλλά και το max Στο τέλος του περάσματος του πίνακα, ενημερώνω όχι μόνο την πρώτη θέση του πίνακα με το a[min], αλλά και την τελευταία με το a[max] Στο επόμενο πέρασμα εξετάζω πίνακα μήκους N-2 (δλδ. αγνοώ το πρώτο και το τελευταίο στοιχείο, που είναι πλέον ήδη στη σωστή θέση) Δομές Δεδομένων, 3ο Εξάμηνο 22
3. Ταξινόμηση Παρεμβολής (Insertion Sort) Εισάγει κάθε αντικείμενο στην κατάλληλη θέση στην τελική γραμμή Μετακινεί το τρέχον στοιχείο πέρα από τα ήδη ταξινομημένα στοιχεία και επαναληπτικά το αντιμεταθέτει με τα προηγούμενα στοιχεία μέχρι να τοποθετηθεί στη κατάλληλη θέση Δομές Δεδομένων, 3ο Εξάμηνο 23
Παράδειγμα: Ταξινόμηση Παρεμβολής November 18, 2016 Δομές Δεδομένων, 3ο Εξάμηνο 24
November 18, 2016 Δομές Δεδομένων, 3ο Εξάμηνο 25
Δομές Δεδομένων, 3ο Εξάμηνο 26
November 18, 2016 Δομές Δεδομένων, 3ο Εξάμηνο 27
Σταθερές Στην ταξινόμηση παρεμβολής Στο τέλος κάθε περάσματος, μετά την εισαγωγή στοιχείου από το temp, τα στοιχεία με μικρότερους δείκτες από το out είναι μερικώς ταξινομημένα (=ταξινομημένα μεταξύ τους) Μια (ποιοτική) διαφορά της σταθεράς στην ταξινόμηση παρεμβολής σε σχέση με τις σταθερές στην φυσαλίδα και στην επιλογή: Σε κάποια ενδιάμεση επανάληψη, τα μερικώς ταξινομημένα στοιχεία δε βρίσκονται εγγυημένα στην τελική τους θέση!!! Δομές Δεδομένων, 3ο Εξάμηνο 28
Ανάλυση Πολυπλοκότητας Αλγόριθμου Παρεμβολής Συγκρίσεις: Το μέγιστο: 1 + 2 + 3 +... + (Ν-1) = Ν*(Ν-1)/2 Σε κάθε πέρασμα κατά μέσο όρο συγκρίνονται μόνο τα μισά στοιχεία, πριν βρεθεί το σημείο εισαγωγής. Συνεπώς: Αριθμός συγκρίσεων=ν*(ν-1)/4 Ο αριθμός των αντιγραφών είναι περίπου ο ίδιος με τον αριθμό των συγκρίσεων Όμως μια αντιγραφή είναι φθηνότερη από μια αντιμετάθεση (βλέπε bubblesort) Γενικά Η ταξινόμηση παρεμβολής εκτελείται σε Ο(Ν 2 ) για τυχαία δεδομένα Όταν όμως τα δεδομένα είναι σχεδόν ταξινομημένα, εκτελείται σε Ο(Ν) Δομές Δεδομένων, 3ο Εξάμηνο 29
Παρατήρηση Έστω ότι θέλουμε να ταξινομήσουμε τα Κ πρώτα στοιχεία ενός πίνακα Ν στοιχείων Ποιος αλγόριθμος από του 3 που μάθαμε μπορεί να χρησιμοποιηθεί για αυτό το σκοπό, χωρίς να εκτελεστεί εξ ολοκλήρου; εν μπορεί να χρησιμοποιηθεί ο InsertionSort για αυτό το σκοπό!!! November 18, 2016 Δομές Δεδομένων, 3ο Εξάμηνο 30
Ταξινόμηση Αντικειμένων Οι αλγόριθμοι ταξινόμησης εφαρμόζονται και σε αντικείμενα, όχι μόνο σε βασικούς τύπους Παράδειγμα Ταξινόμηση αντικειμένων Person Χρήση ταξινόμησης παρεμβολής (insertion sort) Τα αντικείμενα Person ταξινομούνται αλφαβητικά βάσει του επωνύμου τους (lastname) Δομές Δεδομένων, 3ο Εξάμηνο 31
November 18, 2016 Δομές Δεδομένων, 3ο Εξάμηνο 32
Δομές Δεδομένων, 3ο Εξάμηνο 33
Δομές Δεδομένων, 3ο Εξάμηνο 34
November 18, 2016 Δομές Δεδομένων, 3ο Εξάμηνο 35
Σύγκριση Αλγορίθμων Απλής Ταξινόμησης Η ταξινόμηση φυσαλίδας είναι απλή αλλά είναι χρήσιμη μόνο αν η ποσότητα των προς επεξεργασία δεδομένων είναι μικρή Η ταξινόμηση επιλογής ελαχιστοποιεί τον αριθμό των αντιμεταθέσεων αλλά ο αριθμός των συγκρίσεων παραμένει υψηλός Μπορεί να είναι χρήσιμη όταν η ποσότητα των δεδομένων είναι μικρή και η αντιμετάθεση των στοιχείων είναι πολύ χρονοβόρα σε σχέση με τη σύγκρισή τους. Η ταξινόμηση παρεμβολής είναι πιο ευέλικτη και η καλύτερη επιλογή στις περισσότερες περιπτώσεις, αν υποθέσουμε ότι η ποσότητα των δεδομένων είναι μικρή ή τα δεδομένα είναι σχεδόν ταξινομημένα Δομές Δεδομένων, 3ο Εξάμηνο 36
Ερωτήσεις 1. Σωστό ή λάθος: Η ταξινόμηση φυσαλίδας τελικά συγκρίνει κάθε στοιχείο με όλα τα άλλα 2. Σωστό ή λάθος: Αν υπάρχουν Ν στοιχεία, η ταξινόμηση φυσαλίδας κάνει ακριβώς Ν*Ν συγκρίσεις 3. Μία αντιγραφή διαρκεί φορές πιο γρήγορα από μία αντιμετάθεση Δομές Δεδομένων, 3ο Εξάμηνο 37
Ταξινόμηση Σύζευξης (MergeSort) Η ταξινόμηση σύζευξης είναι πολύ αποδοτικότερη από τους αλγόριθμους ταξινόμησης που έχουμε δει ως τώρα Έχει πολυπλοκότητα O(N*logN) Οι αλγόριθμοι που έχουμε δει ως τώρα έχουν O(N 2 ) Είναι σχετικά απλή στην υλοποίησή της Μειονέκτημα Απαιτεί έναν επιπλέον πίνακα στη μνήμη, ίσο σε μέγεθος με αυτόν που ταξινομείται Δομές Δεδομένων, 3ο Εξάμηνο 38
Βασική Ιδέα: Σύζευξη Ταξινομημένων Πινάκων Α 23 42 87 99 C 0 1 2 3 4 5 6 7 8 12 21 23 42 55 77 87 92 99 Β 12 21 55 77 92 Η σύζευξη δύο ταξινομημένων πινάκων A και B δημιουργεί έναν τρίτο πίνακα C, που περιέχει όλα τα στοιχεία των A και B ταξινομημένα Υποθέστε ότι αρχικά ο C είναι κενός Το σχήμα δείχνει τον C μετά τη διαδικασία συγχώνευσης Δομές Δεδομένων, 3ο Εξάμηνο 39
Παράδειγμα MergeSort November 18, 2016 Δομές Δεδομένων, 3ο Εξάμηνο 40
Πολυπλοκότητα Ταξινόμησης Σύζευξης Κάθε βήμα (που είναι συγχωνεύσεις πολλών γειτονικών υποπινάκων) απαιτεί O(n) χρόνο Το πλήθος των βημάτων καθορίζει την πολυπλοκότητα του αλγορίθμου Το τέλος κάθε βήματος: έχει υποδιπλασιάσει το πλήθος των ζευγαριών που απαιτούν συγχώνευση στο επόμενο βήμα έχει διπλασιάσει το μήκος των ταξινομημένων υπο-πινάκων Αν ο αλγόριθμος κάνει k βήματα συγχωνεύσεων, στο k- στό βήμα: Μήκος ταξινομημένου υποπίνακα: 2^k = n. Επομένως, k = log n Άρα η πολυπλοκότητα του αλγορίθμου είναι O(n logn) Δομές Δεδομένων, 3ο Εξάμηνο 41
Πολυπλοκότητα Ταξινόμησης Σύζευξης Ο αλγόριθμος MergeSort είναι βέλτιστος μεταξύ των αλγορίθμων που χρησιμοποιούν συγκρίσεις ηλαδή δεν υπάρχει αλγόριθμος που χρησιμοποιεί συγκρίσεις και έχει καλύτερη ασυμπτωτική πολυπλοκότητα χειρότερης περίπτωσης από τον MergeSort (και αυτό αποδεικνύεται) November 18, 2016 Δομές Δεδομένων, 3ο Εξάμηνο 42