ΔΥΑΔΙΚΗ ΑΝΑΖΗΤΗΣΗ & ΤΑΞΙΝΟΜΗΣΗ ΜΕ ΣΥΓΧΩΝΕΥΣΗ
Δυαδική αναζήτηση (Binary search) ΔΕΔΟΜΕΝΟ: ένα μεγάλο αρχείο που περιέχει τιμές z [0,1,…,n-1] ταξινομημένες ΖΗΤΟΥΜΕΝΟ: να βρούμε δοσμένη τιμή k στο αρχείο αυτό ΙΔΕΑ: Συγκρίνουμε την τιμή k με z[n/2] και ανάλογα με το αποτέλεσμα αναζητούμε το k αναδρομικά είτε στο πρώτο μισό του αρχείου z[0,…,n/2-1], είτε στο δεύτερο μισό του αρχείου z[n/2,…,n-1] Η αναδρομή περιγράφεται από τη σχέση (a=1,b=2,d=0) Επομένως, ο χρόνος εκτέλεσης του αλγορίθμου είναι O(log n)
Δυαδική αναζήτηση (Binary search) σε τηλεφωνικό κατάλογο ΔΕΔΟΜΕΝΟ: –Τηλεφωνικός κατάλογος με n ονόματα και έναν αριθμό τηλεφώνου για κάθε όνομα –Ο τηλεφωνικός κατάλογος είναι ταξινομημένος κατά αύξουσα αλφαβητική σειρά ως προς τα ονόματα –Ένα όνομα από τον κατάλογο ΖΗΤΟΥΜΕΝΟ: Να βρεθεί το τηλέφωνο που αντιστοιχεί στο δοσμένο όνομα
Δυαδική αναζήτηση (Binary search) σε τηλεφωνικό κατάλογο Το πρόβλημα λύνεται με την τεχνική «διαίρει και βασίλευε» με βάση την παρατήρηση ότι δεδομένου ενός ονόματος υπάρχουν 3 περιπτώσεις: –Το όνομα βρίσκεται στη μεσαία θέση του καταλόγου –Το όνομα βρίσκεται σε κάποια θέση στο πρώτο μισό του καταλόγου –Το όνομα βρίσκεται σε κάποια θέση στο δεύτερο μισό του καταλόγου Ο αλγόριθμος αρχικά εξετάζει αν το δοσμένο όνομα είναι στη μέση του τηλεφωνικού καταλόγου –Αν είναι, επιστρέφει το τηλέφωνο –Διαφορετικά, λόγω της αλφαβητικής ταξινόμησης του καταλόγου, το όνομα θα βρίσκεται είτε στο πρώτο είτε στο δεύτερο μισό του καταλόγου: οπότε το αναζητά εκεί –Συνεχίζει με τον ίδιο τρόπο μέχρι να το προσδιορίσει
Δυαδική αναζήτηση (Binary search) σε τηλεφωνικό κατάλογο Ο αλγόριθμος με τη μορφή ψευδοκώδικα:
Δυαδική αναζήτηση (Binary search) σε τηλεφωνικό κατάλογο: παράδειγμα Ο τηλεφωνικός κατάλογος: Γιώτα: Ελένη: Κωνσταντίνα: Πέτρος: Στέλλα: ΓιώταΕλένηΚωνσταντίναΠέτροςΣτέλλα Αναζητούμε το τηλέφωνο της Ελένης… Προσπάθεια 1 ΓιώταΕλένηΚωνσταντίναΠέτροςΣτέλλα Προσπάθεια 2 ΓιώταΕλένηΚωνσταντίναΠέτροςΣτέλλα Προσπάθεια 3
Δυαδική αναζήτηση (Binary search) σε τηλεφωνικό κατάλογο: παράδειγμα Χρόνος εκτέλεσης; Για να τον βρούμε ρωτάμε: πόσες φορές μπορεί να χρειαστεί να διαιρέσω τον κατάλογο σε δύο μισά προκειμένου να βρω το τηλέφωνο που αντιστοιχεί στο δοσμένο όνομα; –Στη χειρότερη περίπτωση μπορεί το δοσμένο όνομα να είναι (πρώτο ή) τελευταίο στον κατάλογο πρέπει να διαιρέσω τον κατάλογο στα 2 τόσες φορές ώστε να μείνει ένα μόνο στοιχείο… –Αν ο κατάλογος έχει n καταχωρήσεις, το ζητούμενο πλήθος διαιρέσεων είναι n/2 k =1 n=2 k k=log 2 n χρόνος εκτέλεσης αλγορίθμου δυαδικής αναζήτησης: logn=Ο(log n) – πολύ γρήγορος…
Ταξινόμηση ΔΕΔΟΜΕΝΟ: λίστα με n στοιχεία ZHTOYMENO: αναδιάταξε τα στοιχεία ώστε να εμφανιστούν σε αύξουσα σειρά Παράδειγμα: –Δοσμένη λίστα: –Ζητούμενη λίστα:
Ταξινόμηση Ενδεικτικές εφαρμογές: Προφανείς εφαρμογές –Ταξινόμηση λίστας ονομάτων –Οργάνωση MP3 σε μία βιβλιοθήκη –Εμφάνιση των αποτελεσμάτων του PageRank της Google –Εμφάνιση σχολίων σε ένα blog με αντίστροφη χρονολογική σειρά Προβλήματα που γίνονται ευκολότερα αν τα δεδομένα τους είναι ταξινομημένα –Εύρεση μεσαίου στοιχείου λίστας –Εύρεση πλησιέστερου ζεύγους –Δυαδική αναζήτηση σε βάση δεδομένων –Εύρεση διπλο-εγγραφών σε λίστα (π.χ., mailing list) Πιο πολύπλοκες εφαρμογές –Συμπίεση δεδομένων –Γραφικά –Υπολογιστική βιολογία –Διαχείριση αλυσίδας προμηθειών –Προτάσεις βιβλίων σε ηλεκτρονικό κατάστημα –Εξισορρόπηση φορτίου σε παράλληλο υπολογιστή
Mergesort: ταξινόμηση με συγχώνευση Ιδέα: χωρίζουμε τη λίστα που πρέπει να ταξινομήσουμε σε 2 μισά, αναδρομικά ταξινομούμε κάθε μισό, και μετά συγχωνεύουμε τις δύο ταξινομημένες υπολίστες Ο αλγόριθμος (επινοήθηκε από τον John von Neumann το 1945):
Mergesort: ταξινόμηση με συγχώνευση Διαίρει: Το πρόβλημα μεγέθους N (με N αριθμούς) διαιρείται σε 2 υποπροβλήματα μεγέθους N/2 το καθένα Βασίλευε: Ταξινόμησε κάθε υποπρόβλημα εφαρμόζοντας αναδρομικά πάλι MergeSort Συνδύασε: Συγχώνευσε τους ταξινομημένους υποπίνακες σε έναν ενιαίο ταξινομημένο πίνακα Διαίρει Βασίλευε-Ταξινόμησε Συνδύασε-Συγχώνευσε
Mergesort: ταξινόμηση με συγχώνευση Διαίρεση Συγχώνευση
Mergesort: ταξινόμηση με συγχώνευση
Χρόνος εκτέλεσης; –Πρέπει να βρούμε την αντίστοιχη αναδρομική σχέση…: στο MergeSort σταματάμε την αναδρομή όταν έχουμε 2 στοιχεία: οπότε τα συγκρίνουμε και τα επιστρέφουμε στη σωστή σειρά –Συγχώνευση είναι η διαδικασία συνδυασμού δύο ταξινομημένων αρχείων σε ένα ταξινομημένο αρχείο Για εισόδους μεγέθους n γίνεται σε χρόνο O(n)
Mergesort: ταξινόμηση με συγχώνευση Έστω T(n) ο χρόνος εκτέλεσης της χειρότερης περίπτωσης για στιγμιότυπα μεγέθους n Ο αλγόριθμος δαπανά χρόνο το πολύ: –O(n) για να διαιρέσει την είσοδο σε δύο τμήματα μεγέθους n/2 το καθένα –T(n/2) για να επιλύσει το κάθε τμήμα –O(n) για να συνδυάσει (συγχωνεύσει) τις λύσεις από τις δύο αναδρομικές κλήσεις Άρα ο χρόνος εκτέλεσης T(n) του Mergesort ικανοποιεί την ακόλουθη αναδρομική σχέση (recurrence relation): –Για σταθερά c, T(n) ≤ 2T(n/2) + cn όταν n > 2 και T(n) ≤ cn
Mergesort: ταξινόμηση με συγχώνευση n/2 k =2 n=2 k+1 log n=k+1
Mergesort: ταξινόμηση με συγχώνευση 1 ο επίπεδο: 1 (=2 0 ) υποπρόβλημα μεγέθους n χρειάζεται χρόνο cn + χρόνος αναδρομικών κλήσεων 2 ο επίπεδο: 2 (=2 1 ) προβλήματα μεγέθους n/2 το καθένα και καθένα από αυτά χρειάζεται χρόνο το πολύ cn/2 συνολικός χρόνος: cn + χρόνος αναδρομικών κλήσεων 3 ο επίπεδο: 4 (=2 2 ) προβλήματα μεγέθους n/4 το καθένα και καθένα από αυτά χρειάζεται χρόνο το πολύ cn/4 συνολικός χρόνος: cn + χρόνος αναδρομικών κλήσεων
Mergesort: ταξινόμηση με συγχώνευση Επίπεδο j: ο αριθμός των υποπροβλημάτων έχει διπλασιαστεί j φορές υπάρχουν 2 j υποπροβλήματα Καθένα από αυτά έχει υποδιπλασιαστεί (δηλ., έχει κοπεί στο μισό) j φορές κάθε υποπρόβλημα έχει μέγεθος n/2 j χρειάζεται χρόνο το πολύ cn/2 j Όλα τα υποπροβλήματα του επιπέδου j χρειάζονται χρόνο συνολικά το πολύ 2 j (cn/2 j ) = cn
Mergesort: ταξινόμηση με συγχώνευση Ο αριθμός των υποδιπλασιασμών της εισόδου έτσι ώστε να μειωθεί το μέγεθος της από n σε 2 είναι log 2 n-1 αφού ισχύει n/2 k = 2 n = 2k+1 log 2 n = k+1 Χρόνος το πολύ cn για log n επίπεδα δίνει συνολικό χρόνο εκτέλεσης O(n log n)