Δοµές Δεδοµένων. 10η Διάλεξη Ταξινόµηση. E. Μαρκάκης

Σχετικά έγγραφα
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Ταξινόµηση Mergesort Κεφάλαιο 8. Ε. Μαρκάκης Επίκουρος Καθηγητής

Αλγόριθμοι Ταξινόμησης Μέρος 2

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Ταξινόµηση Quicksort Κεφάλαιο 7. Ε. Μαρκάκης Επίκουρος Καθηγητής

Δοµές Δεδοµένων. 11η Διάλεξη Ταξινόµηση Quicksort και Ιδιότητες Δέντρων. Ε. Μαρκάκης

Δοµές Δεδοµένων. 9η Διάλεξη Ταξινόµηση - Στοιχειώδεις µέθοδοι. Ε. Μαρκάκης

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Ταξινόµηση - Στοιχειώδεις µέθοδοι Κεφάλαιο 6. Ε. Μαρκάκης Επίκουρος Καθηγητής

Διαίρει-και-Βασίλευε. Αλγόριθµοι & Πολυπλοκότητα (Χειµώνας 2011) Διαίρει-και-Βασίλευε 2

ΠΛΗ111. Ανοιξη Μάθηµα 9 ο. Ταξινόµηση. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

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

Διάλεξη 09: Αλγόριθμοι Ταξινόμησης I

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

Ταξινόμηση με συγχώνευση Merge Sort

Επιμέλεια διαφανειών: Δ. Φωτάκης Τροποποιήσεις-προσθήκες: Α. Παγουρτζής. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

Διάλεξη 19: Αλγόριθμοι ΤαξινόμησηςII. Διδάσκων: Παναγιώτης Ανδρέου

ιαίρει-και-βασίλευε ημήτρης Φωτάκης Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο

Διάλεξη 17: O Αλγόριθμος Ταξινόμησης HeapSort

Merge Sort (Ταξινόμηση με συγχώνευση) 6/14/2007 3:04 AM Merge Sort 1

Δοµές Δεδοµένων. 18η Διάλεξη Ισορροπηµένα δέντρα. Ε. Μαρκάκης

Αναδρομικοί Αλγόριθμοι

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Αρχές Ανάλυσης Αλγορίθµων Κεφάλαιο 2. Ε. Μαρκάκης Επικ. Καθηγητής

Ταξινόμηση. Παύλος Εφραιμίδης. Δομές Δεδομένων Ταξινόμηση 1

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Ουρές προτεραιότητας Κεφάλαιο 9. Ε. Μαρκάκης Επίκουρος Καθηγητής

Διαίρει-και-Βασίλευε. Διαίρει-και-Βασίλευε. MergeSort. MergeSort. Πρόβλημα Ταξινόμησης: Είσοδος : ακολουθία n αριθμών (α 1

Quicksort. Πρόβλημα Ταξινόμησης. Μέθοδοι Ταξινόμησης. Συγκριτικοί Αλγόριθμοι

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Ουρές προτεραιότητας Κεφάλαιο 9. Ε. Μαρκάκης Επίκουρος Καθηγητής

Αλγόριθμοι ταξινόμησης

Δοµές Δεδοµένων. 17η Διάλεξη Ισορροπηµένα δέντρα. Ε. Μαρκάκης

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

Εισαγωγή στους Αλγορίθμους

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

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

Η εφαρµογή xsortlab. Οπτικός τρόπος ταξινόµησης

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

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

Ταξινόμηση. Σαλτογιάννη Αθανασία

Ταξινόμηση. 1. Γρήγορη ταξινόμηση 2. Ταξινόμηση με Συγχώνευση. Εισαγωγή στην Ανάλυση Αλγορίθμων Μάγια Σατρατζέμη

Διάλεξη 09: Αλγόριθμοι Ταξινόμησης I

Σχεδίαση και Ανάλυση Αλγορίθμων

Quicksort [Hoare, 62] Αλγόριθµοι & Πολυπλοκότητα (Χειµώνας 2011) Quicksort 1

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

Heapsort Using Multiple Heaps

ΣΧΟΛΙΑ 1 ΗΣ ΕΡΓΑΣΙΑΣ. 15 Μαΐου 2013

Προχωρημένες έννοιες προγραμματισμού σε C

a 1 a 2 a n. 3. i = j 1 5. A[i + 1] = A[i] 6. i = i 1

Αναδρομικές Σχέσεις «ιαίρει-και-βασίλευε»

ΔΥΑΔΙΚΗ ΑΝΑΖΗΤΗΣΗ & ΤΑΞΙΝΟΜΗΣΗ ΜΕ ΣΥΓΧΩΝΕΥΣΗ

Αλγόριθµοι Ταξινόµησης

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

Πρόβληµα Επιλογής. Αλγόριθµοι & Πολυπλοκότητα (Χειµώνας 2011) Επιλογή 1

Δοµές Δεδοµένων. 6η Διάλεξη Αναδροµικές Εξισώσεις και Αφηρηµένοι Τύποι Δεδοµένων. Ε. Μαρκάκης

Αλγόριθμοι και πολυπλοκότητα Συγχωνευτική Ταξινόμηση

8. Σωροί (Heaps)-Αναδρομή- Προχωρημένη Ταξινόμηση

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

Ειδικά θέματα Αλγορίθμων και Δομών Δεδομένων (ΠΛΕ073) Απαντήσεις 1 ου Σετ Ασκήσεων

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 4. Παραδείγματα Ανάλυσης Πολυπλοκότητας Ανάλυση Αναδρομικών Αλγόριθμων

Διάλεξη 04: Παραδείγματα Ανάλυσης

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Πίνακες Συµβόλων Κεφάλαιο 12 ( ) Ε. Μαρκάκης Επίκουρος Καθηγητής

Δοµές Δεδοµένων. 4η Διάλεξη Στοιχειώδεις Δοµές Δεδοµένων: Πίνακες και Λίστες. Ε. Μαρκάκης

Αλγόριθμοι Ταξινόμησης Μέρος 1

Αλγόριθμοι και Πολυπλοκότητα

Αναδρομή Ανάλυση Αλγορίθμων

Δοµές Δεδοµένων. 2η Διάλεξη Αλγόριθµοι Ένωσης-Εύρεσης (Union-Find) Ε. Μαρκάκης. Βασίζεται στις διαφάνειες των R. Sedgewick K.

Αλγόριθµοι Divide-and- Conquer

Εισ. Στην ΠΛΗΡΟΦΟΡΙΚΗ. Διάλεξη 7 η. Βασίλης Στεφανής

Επιλογή. Πρόβλημα Επιλογής. Μέγιστο / Ελάχιστο. Εφαρμογές

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Βασικές Ιδιότητες και Διάσχιση Κεφάλαιο 5 ( και ) Ε. Μαρκάκης Επίκουρος Καθηγητής

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

Ταχεία Ταξινόμηση Quick-Sort

ΕΝΟΤΗΤΑ 6 ΛΙΣΤΕΣ ΠΑΡΑΛΕΙΨΗΣ (SKIP LISTS)

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

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

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

auth Αλγόριθμοι - Τμήμα Πληροφορικής ΑΠΘ - Εξάμηνο 4ο

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

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

Διάλεξη 04: Παραδείγματα Ανάλυσης Πολυπλοκότητας/Ανάλυση Αναδρομικών Αλγόριθμων

Ταξινόµηση. Παύλος Εφραιµίδης. οµές εδοµένων και

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

Quicksort. Επιμέλεια διαφανειών: Δ. Φωτάκης Μικροαλλαγές: Α. Παγουρτζής. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

Επιλογή. ιδάσκοντες: Σ. Ζάχος,. Φωτάκης Επιμέλεια διαφανειών:. Φωτάκης. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

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

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

Προγραμματισμός Ι (ΗΥ120)

Διάλεξη 12: Δέντρα ΙΙ Δυαδικά Δέντρα

1η Σειρά Γραπτών Ασκήσεων

Επιλογή. Επιμέλεια διαφανειών: Δ. Φωτάκης. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών. Εθνικό Μετσόβιο Πολυτεχνείο

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

Δοµές Δεδοµένων. 12η Διάλεξη Διάσχιση Δέντρων και Ουρές Προτεραιότητας. Ε. Μαρκάκης

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

Σχεδίαση Αλγορίθμων -Τμήμα Πληροφορικής ΑΠΘ - Εξάμηνο 4ο

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Εξωτερική Αναζήτηση και Β-δέντρα Κεφάλαιο 16. Ε. Μαρκάκης Επίκουρος Καθηγητής

Ν!=1*2*3* *(N-1) * N => N! = (Ν-1)! * N έτσι 55! = 54! * 55

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Στοιχειώδεις Δοµές Δεδοµένων Λίστες Κεφάλαιο 3 (3.3, 3.4, 3.7) Ε. Μαρκάκης Επικ. Καθηγητής

Δυαδικά Δένδρα Αναζήτησης, Δένδρα AVL

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

Ενότητα 1: Εισαγωγή Ασκήσεις και Λύσεις

Προγραµµατισµός 1 Ταξινόµηση - Αναζήτηση

Σχεδίαση Αλγορίθμων -Τμήμα Πληροφορικής ΑΠΘ - Εξάμηνο 4ο

Αναζήτηση. 1. Σειριακή αναζήτηση 2. Δυαδική Αναζήτηση. Εισαγωγή στην Ανάλυση Αλγορίθμων Μάγια Σατρατζέμη

Quicksort. ιδάσκοντες: Σ. Ζάχος,. Φωτάκης Επιμέλεια διαφανειών:. Φωτάκης. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

Transcript:

Δοµές Δεδοµένων 10η Διάλεξη Ταξινόµηση E. Μαρκάκης

Περίληψη Ταξινόµηση µε αριθµοδείκτη κλειδιού Ταξινόµηση µε συγχώνευση Αλγόριθµος Mergesort Διµερής συγχώνευση Αφηρηµένη επιτόπου συγχώνευση Αναλυτική ταξινόµηση Mergesort Συνθετική ταξινόµηση Mergesort Χαρακτηριστικά επιδόσεων Υλοποιήσεις Mergesort µε λίστες Δοµές Δεδοµένων 10-

Καταµέτρηση µε αριθµοδείκτη Ταξινόµηση ειδικής µορφής Αποφυγή συγκρίσεων αν εκµεταλλευθούµε ειδικές ιδιότητες των κλειδιών Έστω κλειδιά µε διακεκριµένες τιµές από 0 έως -1 for (i = 0; i < ; i++) b[a[i].key] = a[i]; Καταµέτρηση µε αριθµοδείκτη κλειδιού Έστω κλειδιά που παίρνουν τιµές 0 ή 1 Πρώτη διέλευση: µέτρηση των στοιχείων µε κλειδί 0 και αντίστοιχα µε κλειδί 1 Χρήση πίνακα µετρητών µε στοιχεία, cnt[0], cnt[1] και πίνακα b µε Ν στοιχεία cnt[0]: δείχνει αρχικά την θέση που πρέπει να µπει το πρώτο 0 στον b cnt[1]: θέση που πρέπει να µπει το πρώτο στοιχείο µε κλειδί 1 στον b Δεύτερη διέλευση στον πίνακα: µεταφέρουµε κάθε κλειδί στη σωστή θέση στον b και αυξάνουµε τον αντίστοιχο µετρητή for (i = 0; i < ; i++) b[cnt[a[i]]++] = a[i]; Δοµές Δεδοµένων 10-3

Καταµέτρηση µε αριθµοδείκτη Γενίκευση σε µεγαλύτερο αριθµό κλειδιών Έστω κλειδιά µε τιµές 0 έως M-1 Το M πολύ µικρότερο από το Πιθανόν πολλά κλειδιά µε ίδιες τιµές Πρώτη διέλευση: µετράµε το πλήθος κλειδιών για κάθε τιµή Χρήση ενός πίνακα µετρητών cnt[] M στοιχείων Χρήση πίνακα b για προσωρινή αποθήκευση των στοιχείων Μετατροπή των µετρητών σε αθροιστικούς, π.χ. cnt[k] = πόσα στοιχεία έχουν κλειδί µικρότερο από k = θέση που πρέπει να µπει το πρώτο στοιχείο µε κλειδί k Δεύτερη διέλευση: µεταφέρουµε κάθε κλειδί στη σωστή θέση Ο αντίστοιχος µετρητής αυξάνεται Η θέση για το επόµενο θα δίνεται πάντα από τον µετρητή Στο τέλος µεταφέρουµε τα στοιχεία πίσω στον a Δοµές Δεδοµένων 10-4

Καταµέτρηση µε αριθµοδείκτη Σειρά περασµάτων στους πίνακες 1ο: αρχικοποίηση M µετρητών ο: µέτρηση κλειδιών 3ο: µετατροπή M µετρητών σε αθροιστικούς 4ο: µεταφορά κλειδιών στις σωστές θέσεις 5ο: επαναφορά κλειδιών στον αρχικό πίνακα static void distcount(int a[], int p, int r) { int i, j, cnt[] = new int[m]; int b[] = new int[a.length]; for (j = 0; j < M; j++) cnt[j] = 0; for (i = p; i <= r; i++) cnt[a[i]+1]++; for (j = 1; j < M; j++) cnt[j] += cnt[j-1]; for (i = p; i <= r; i++) b[cnt[a[i]]++] = a[i]; for (i = p; i <= r; i++) a[i] = b[i-p]; } Δοµές Δεδοµένων 10-5

Καταµέτρηση µε αριθµοδείκτη Πόσο εξοικονοµούµε µε την ταξινόµηση µε αριθµοδείκτη? Θεώρηµα: Η καταµέτρηση µε αριθµοδείκτη γίνεται σε χρόνο Ο(Ν) υπό την προϋπόθεση ότι το πλήθος των διαφορετικών τιµών των κλειδιών Μ είναι Ο(Ν) Αρκεί να δούµε τις πράξεις στους 5 βρόχους Κάθε βρόχος εκτελείται σε Ο(Μ) ή σε Ο(Ν) Συνολική πολυπλοκότητα είναι Ο(Μ+Ν), άρα Ο(Ν) Δοµές Δεδοµένων 10-6

Κεφάλαιο 8 Ταξινόµηση µε συγχώνευση Αλγόριθµος Mergesort Δοµές Δεδοµένων 10-7

Ταξινόµηση µε συγχώνευση Βασική ιδέα αλγορίθµων συγχώνευσης: Διαίρει και βασίλευε Χωρισµός σε υποαρχεία Χωριστή ταξινόµηση σε κάθε αρχείο Συγχώνευση των υποαρχείων σε ένα ταξινοµηµένο αρχείο Υλοποίηση συνήθως µε αναδροµή (µπορούµε και χωρίς αναδροµή) Ευσταθής µεθοδος αν είµαστε λίγο προσεκτικοί Ακολουθιακή πρόσβαση στα δεδοµένα, κατάλληλη για µηχανηµατα υψηλής απόδοσης µε γρήγορη πρόσβαση σε δεδοµένα 1 η υλοποίηση: von eumann στον υπολογιστή EDVAC (1945) Δοµές Δεδοµένων 10-8

Ταξινόµηση µε συγχώνευση Αλγόριθµος Mergesort Αναλυτική (top-down) ταξινόµηση µε συγχώνευση αναδροµικές κλήσεις σε αρχεία µε το µισό αρχικό µέγεθος Αναδροµή τελειώνει όταν το αρχείο έχει µόνο ένα στοιχείο Χρησιµοποιεί τη µέθοδο merge στο τέλος για να συγχωνεύσει τους υποπίνακες static void mergesort(item[] a, int p, int r) { if (r <= p) return; int m = (r+p)/; mergesort(a, p, m); mergesort(a, m+1, r); merge(a, p, m, r);/*συγχωνεύει τους ταξινομημένους υποπίνακες a[p..m] και a[m+1..r]*/ } Δοµές Δεδοµένων 10-9

Ταξινόµηση µε συγχώνευση Δοµές Δεδοµένων 10-10

Ταξινόµηση µε συγχώνευση Δέντρα «διαίρει και βασίλευε» Μας δείχνουν πώς αποσυντίθεται το αρχικό πρόβληµα σε υποπροβλήµατα µικρότερου µεγέθους Στη Mergesort, είναι ανεξάρτητα από δεδοµένα εισόδου Δοµές Δεδοµένων 10-11

Υλοποίηση συγχώνευσης Τελικό βήµα της Mergesort Θα δούµε πρώτα µία πιο γενική υλοποίηση Είσοδος: ταξινοµηµένοι πίνακες a και b Έξοδος: Συγχώνευση των a, b σε ένα ταξινοµηµένο πίνακα c Σε κάθε βήµα: Εντοπίζουµε το µικρότερο στοιχείο στους a, b Το αντιγράφουµε στο νέο πίνακα Ενηµερώνουµε τους δείκτες Προσοχή στα όρια των πινάκων! Δοµές Δεδοµένων 10-1

Υλοποίηση συγχώνευσης Πίνακες εισόδου: a µε όρια ap, ar, και b µε όρια bp br Πίνακας εξόδου: c µε αρχικό δείκτη cp Μέγεθος του c πρέπει να είναι τουλάχιστον cp + (ar- ap +1) + (br- bp +1) static void mergeab(item[] c, int cp, ITEM[] a, int ap, int ar, ITEM[] b, int bp, int br ) { int i = ap, j = bp; for (int k = cp; k < cp+ar-ap+br-bp+1; k++) { if (i > ar) { c[k] = b[j++]; continue; } if (j > br) { c[k] = a[i++]; continue; } c[k] = less(a[i], b[j])? a[i++] : b[j++]; } } Δοµές Δεδοµένων 10-13

Αφηρηµένη επιτόπου συγχώνευση η υλοποίηση: Συγχώνευση απευθείας στον πίνακα εισόδου Οι δύο υποπίνακες βρίσκονται στον πίνακα εισόδου Αρκεί να ξέρουµε σε ποιον δείκτη m χωρίζονται a[p] έως a[m] και a[m+1] έως a[r] Η έξοδος θα είναι και αυτή στον πίνακα εισόδου Αποφυγή των ελέγχων τερµατισµού Σε κάθε βήµα ελέγχουµε αν τελείωσε κάθε υποπίνακας Πώς µπορούµε να αποφύγουµε τους ελέγχους; Ιδέα: αντιστροφή δεύτερου υποπίνακα Τα δύο µεγαλύτερα στοιχεία γειτονεύουν Το µεγαλύτερο από τα δύο χρησιµεύει ως φρουρός! Δοµές Δεδοµένων 10-14

Αφηρηµένη επιτόπου συγχώνευση Υλοποίηση επιτόπου συγχώνευσης Χρησιµοποιεί τον βοηθητικό πίνακα aux Ο δεύτερος υποπίνακας αντιστρέφεται Το µέγιστο στοιχείο είναι στο a[m] ή στο a[m+1] static void merge(item[] a, int p, int m, int r) { int i, j; for (i = m+1; i > p; i--) aux[i-1] = a[i-1];//στο τέλος i=p for (j = m; j < r; j++) aux[j+1] = a[r+m-j];//στο τέλος j=r for (int k = p; k <= r; k++) if (less(aux[j], aux[i])) a[k] = aux[j--]; else a[k] = aux[i++]; } Δοµές Δεδοµένων 10-15

Ταξινόµηση µε συγχώνευση Ανάλυση της πολυπλοκότητας Ν = r-p+1 Ανάλυση πρώτα της merge: 1 ος βρόχος: Ο(Ν) ος βρόχος: Ο(Ν) 3 ος βρόχος: Ο(Ν) Συνολικά: Ο(Ν) Τελικά συνολικός χρόνος που απαιτείται: Τ =Τ / + Ο(Ν), Τ 1 = Ο(1) Δοµές Δεδοµένων 10-16

Δοµές Δεδοµένων 10-17 Ταξινόµηση µε συγχώνευση Επίλυση της αναδροµικής εξίσωσης Τ = Τ / + Ν, Τ 1 = 1 Θα δούµε τη λύση για δυνάµεις του. Έστω Ν = n Αναπτύσσουµε την εξίσωση Όταν k = log, T = T 1 + log = O(log) Όταν το Ν δεν είναι δύναµη του, αποδεικνύεται το ίδιο µε επαγωγή T T T T T ) / ( ) / ( / / / / 3 + + = + + = + + = + = k T T k k + = = + = / / 3... 3 3

Ταξινόµηση µε συγχώνευση Αρχικά συµπεράσµατα: Ο(log): Πολύ καλύτερη πολυπλοκότητα από τις στοιχειώδεις µεθόδους ταξινόµησης Δεν σταµατάει άµεσα όµως σε ταξινοµηµένα αρχεία Δοµή αναδροµικών κλήσεων Η διαίρεση του αρχείου στα δύο οδηγεί σε ισοζυγισµένο δένδρο Πρόσθετος χώρος O() Απαιτεί δεύτερο πίνακα Απαιτήσεις σε χώρο και χρόνο δεν επηρεάζονται από την αρχική διάταξη των δεδοµένων Μπορεί να γίνει ευσταθής αν έχουµε διπλά κλειδιά Δοµές Δεδοµένων 10-18

Συνθετική ταξινόµηση Συνθετική (bottom-up) ταξινόµηση µε συγχώνευση Μη αναδροµική υλοποίηση! Ιδέα: διαφορετικός τρόπος διάσχισης του δέντρου διαίρει και βασίλευε Η αναδροµική υλοποίηση επεξεργάζεται πρώτα το δεξιό και το αριστερό υποδέντρο και µετά πάει αµέσως στο πιο πάνω επίπεδο. Οποιαδήποτε άλλη διάσχιση που διατρέχει τα υποδέντρα κάποιου κόµβου πριν επισκεφτεί τον κόµβο είναι επίσης σωστή Μπορούµε π.χ. να διασχίσουµε πρώτα το κατώτερο επίπεδο του δέντρου, µετά το επόµενο επίπεδο κ.ο.κ. Αρχικά κάθε στοιχείο είναι υποπίνακας Σε κάθε βήµα συγχωνεύονται γειτονικοί υποπίνακες Το µέγεθος των πινάκων είναι m = 1,, 4, 8, Πρώτα γίνονται όλες οι 1x1 συγχωνεύσεις, µετά οι x, µετά οι 4x4,... Δοµές Δεδοµένων 10-19

Συνθετική ταξινόµηση Μη αναδρομική υλοποίηση: static int min(int A, int B) {return (A < B)? A: B; } static void mergesort(item[] a, int p, int r) { if (r <= p) return; aux = new ITEM[a.length]; for (int m = 1; m <= r-p; m = m+m)/* m= 1,, 4, για κάθε m κάνουμε συγχωνεύσεις m επί m μέχρι να φτάσουμε στο δεξιό όριο r*/ for (int i = p; i <= r-m; i += m+m) merge(a, i, i+m-1, min(i+m+m-1, r)); } Δοµές Δεδοµένων 10-0

Συνθετική ταξινόµηση Δοµή κλήσεων (όχι αναδροµικών!) Όταν το Ν είναι δύναµη του το δέντρο είναι ίδιο µε τον αναδροµικό αλγόριθµο Όταν το Ν δεν είναι δύναµη του έχουµε διαφορετικό δέντρο Σε κάθε επανάληψη το µέγεθος των υποπινάκων που συγχωνεύονται είναι δυνάµεις του εκτός ίσως από τον τελευταίο υποπίνακα. Δοµές Δεδοµένων 10-1

Σύγκριση των υλοποιήσεων Ίδιο κόστος χρόνου χειρότερης περίπτωσης O(lοg) και πρόσθετος χώρος O() Δεν χρειάζεται όµως στοίβα αναδροµής στη συνθετική ταξινόµηση Κατάλληλες και οι υλοποιήσεις όταν µας ενδιαφέρει περισσότερο ο χρόνος και οχι οι απαιτήσεις µνήµης Δοµές Δεδοµένων 10-

Χαρακτηριστικά επιδόσεων Βελτιώσεις απόδοσης Ο mergesort δεν είναι ιδιαίτερα αποδοτικός για µικρό Ν Χρήση Insertion Sort για µικρούς υποπίνακες Λύση που χρησιµοποιείται και σε άλλες ταξινοµήσεις Μείωση χρόνου κατά 15% περίπου Εξάλειψη των διπλών αντιγραφών σε κάθε βήµα Χρήση δύο πινάκων και εναλλαγή κλήσεων Απλή σχετικά λύση, αποφεύγει τη µία αντιγραφή Εξάλειψη του πρόσθετου πίνακα Αρκετά πιο περίπλοκη λύση, κέρδος µάλλον οριακό Δοµές Δεδοµένων 10-3

Χαρακτηριστικά επιδόσεων Ν Α Α* Σ Σ* Α: Αναδροµικός αλγόριθµος 1500 7 16 30 0 Α*: Αναδροµικός µε Insertion Sort για µικρά υποαρχεία 5000 43 34 4 36 Σ: συνθετικός αλγόριθµος Σ*: συνθετικός µε Insertion Sort για µικρά υποαρχεία 50000 100000 91 199 79 164 9 04 77 175 Αναλυτικός ή συνθετικός; 00000 41 35 455 396 Ο αναλυτικός είναι λίγο πιο γρήγορος (περίπου 10%) 400000 904 764 99 873 800000 1910 169 106 1871 Δοµές Δεδοµένων 10-4

Υλοποίηση µε λίστες Χρησιµοποιώντας λίστες µπορούµε να αποφύγουµε τη χρήση του βοηθητικού πίνακα. Θέλουµε όµως παραπάνω µνήµη για τους δείκτες Αναδροµική εκδοχή: θέλουµε και µία αρχική διέλευση όλης της λίστας για να βρούµε τη µέση static ode mergesort(ode c) { if (c == null c.next == null) return c; ode a = c, b = c.next; while ((b!= null) && (b.next!= null)) { c = c.next; b = (b.next).next; }//εύρεση μέσης b = c.next; c.next = null; return merge(mergesort(a), mergesort(b)); } Δοµές Δεδοµένων 10-5

Υλοποίηση µε λίστες Υλοποίηση της merge: static ode merge(ode a, ode b) { ode dummy = new ode(); ode head = dummy, c = head; while ((a!= null) && (b!= null)) if (less(a.item, b.item)) { c.next = a; c = a; a = a.next; } else { c.next = b; c = b; b = b.next; } c.next = (a == null)? b : a; return head.next; } Δοµές Δεδοµένων 10-6

Μειονεκτήµατα της Mergesort Δεν σταµατά άµεσα σε ταξινοµηµένο αρχείο Ο αριθµός των διελεύσεων εξαρτάται από το µέγεθος του πίνακα, και όχι από τη µορφή των δεδοµένων εισόδου Ίδιος αριθµός βηµάτων σε τυχαία δεδοµένα, Gaussian, µερικώς ταξινοµηµένα, αντίστροφα ταξινοµηµένα,... Δοµές Δεδοµένων 10-7