Professional Documents
Culture Documents
2 MergeSort
2 MergeSort
7 29 4 2 4 7 9
72 2 7 94 4 9
Οι διαφάνειες είναι βασισμένες στο βιβλίο "Data Structures and Algorithms in C++" των Michael T. Goodrich, Roberto Tamassia και David M. Mount
Merge Sort 1
Outline
Η αρχή του «Διαίρει και Βασίλευε»(§10.1.1)
Merge-sort (§10.1)
Αλγόριθμος
Συνενώνοντας 2 ταξινομημένες ακολουθίες
Δένδρο Merge-sort
Παράδειγμα εκτέλεσης
Ανάλυση
Γενικές πράξεις συνένωσης και συνόλων
(§10.2)
Περίληψη αλγορίθμων ταξινόμησης
Merge Sort 2
Διαίρει και Βασίλευε
Η μέθοδος του «Διαίρει και Ο Merge-sort είναι ένας
Βασίλευε» είναι μια γενική αρχή αλγόριθμος ταξινόμησης
σχεδιασμού αλγορίθμων : βασισμένος στην αρχή του
Divide: Διαίρεσε τα δεδομένα «Διαίρει και Βασίλευε»
εισόδου S σε 2 ή περισσότερα Όπως και ο heap-sort
ανεξάρτητα σύνολα S1, S2, … Χρησιμοποιεί συγκριτή
Recur: λύσε το υποπροβλήματα Έχει χρόνο εκτέλεσης O(n log
που σχετίζονται με τα S1 και S2 n)
Conquer: συνδύασε τις λύσεις Αντίθετα με τον heap-sort
για S1 και S2 σε μια λύση για τοS Δε χρησιμοποιεί βοηθητική
Η βασική περίπτωση για την ουρά προτεαιότητας
αναδρομή είναι υποπροβλήματα Αποκτά πρόσβαση στα
μεγέθους 0 ή 1 δεδομένα σειριακά
(κατάλληλα για ταξινόμηση
στοιχείων σε δίσκο)
Merge Sort 3
Merge-Sort
Ο Merge-sort σε Αλγόριθμος mergeSort(S, C)
ακολουθία εισόδου S με Είσοδος ακολουθία S με n
n στοιχεία αποτελείται στοιχεία, συγκριτής C
από 3 βήματα: Έξοδος ακολουθία S
ταξινομημένη σύμφωνα με τοC
Divide: χώρισε το S σε 2
ακολουθίες S1 και S2 if S.size() > 1
περίπου n2 στοιχείων η (S1, S2) partition(S, n/2)
καθεμία mergeSort(S1, C)
Recur: ταξινόμησε mergeSort(S2, C)
αναδρομικά τα S1 και S2
S merge(S1, S2)
Conquer: συνένωσε τα S1
και S2 σε μια μοναδική
ταξινομημένη ακολουθία
Merge Sort 4
Merging Two Sorted Sequences
Το βήμα conquer Αλγόριθμος merge(A, B)
του merge-sort Είσοδος ακολουθίες A και B με
αποτελείται από τη n2 στοιχεία η καθεμία
συνένωση των
ταξινομημένων A και Έξοδος ταξινομημένη ακολουθία του A B
B σε μια S empty sequence
ταξινομημένη
ακολουθία S που while A.isEmpty() B.isEmpty()
περιέχει την ένωση if A.first().element() <
των στοιχείων των A B.first().element()
και B S.insertLast(A.remove(A.first()))
Merging two sorted else
sequences, each S.insertLast(B.remove(B.first()))
with n2 elements
και implemented by while A.isEmpty()
means of a doubly S.insertLast(A.remove(A.first()))
linked list, takes while B.isEmpty()
O(n) time S.insertLast(B.remove(B.first()))
return S
Merge Sort 5
Δένδρο Merge-Sort
Μια εκτέλεση του merge-sort απεικονίζεται από ένα δυαδικό
δένδρο
Κάθε κόμβος αναπαριστά μια αναδρομική κλήση του merge-sort και
αποθηκεύει
Μη ταξινομημένη ακολουθία πριν την εκτέλεση και το διαχωρισμό της
Ταξινομημένη ακολουθία στο τέλος της εκτέλεσης
Η ρίζα είναι η αρχική κλήση
Τα φύλλα είναι κλήσεις σε υποακολουθίες μεγέθους 0 ή 1
7 2 9 4 2 4 7 9
7 2 2 7 9 4 4 9
7 2 9 4 2 4 7 9 3 8 6 1 1 3 8 6
7 2 2 7 9 4 4 9 3 8 3 8 6 1 1 6
Merge Sort 7
Παράδειγμα Εκτέλεσης (συνέχεια)
Αναδρομική κλήση, διαχωρισμός
7 2 9 43 8 6 1 1 2 3 4 6 7 8 9
7 29 4 2 4 7 9 3 8 6 1 1 3 8 6
7 2 2 7 9 4 4 9 3 8 3 8 6 1 1 6
Merge Sort 8
Παράδειγμα Εκτέλεσης (συνέχεια)
Αναδρομική κλήση, διαχωρισμός
7 2 9 43 8 6 1 1 2 3 4 6 7 8 9
7 29 4 2 4 7 9 3 8 6 1 1 3 8 6
722 7 9 4 4 9 3 8 3 8 6 1 1 6
Merge Sort 9
Παράδειγμα Εκτέλεσης (συνέχεια)
Αναδρομική κλήση, βασική περίπτωση
7 2 9 43 8 6 1 1 2 3 4 6 7 8 9
7 29 4 2 4 7 9 3 8 6 1 1 3 8 6
722 7 9 4 4 9 3 8 3 8 6 1 1 6
Merge Sort 10
Παράδειγμα Εκτέλεσης (συνέχεια)
Αναδρομική κλήση, βασική περίπτωση
7 2 9 43 8 6 1 1 2 3 4 6 7 8 9
7 29 4 2 4 7 9 3 8 6 1 1 3 8 6
722 7 9 4 4 9 3 8 3 8 6 1 1 6
Merge Sort 11
Παράδειγμα Εκτέλεσης (συνέχεια)
Συνένωση
7 2 9 43 8 6 1 1 2 3 4 6 7 8 9
7 29 4 2 4 7 9 3 8 6 1 1 3 8 6
722 7 9 4 4 9 3 8 3 8 6 1 1 6
Merge Sort 12
Παράδειγμα Εκτέλεσης (συνέχεια)
Αναδρομική κλήση, …, βασική περίπτωση, συνένωση
7 2 9 43 8 6 1 1 2 3 4 6 7 8 9
7 29 4 2 4 7 9 3 8 6 1 1 3 8 6
722 7 9 4 4 9 3 8 3 8 6 1 1 6
Merge Sort 13
Παράδειγμα Εκτέλεσης (συνέχεια)
Συνένωση
7 2 9 43 8 6 1 1 2 3 4 6 7 8 9
7 29 4 2 4 7 9 3 8 6 1 1 3 8 6
722 7 9 4 4 9 3 8 3 8 6 1 1 6
Merge Sort 14
Παράδειγμα Εκτέλεσης (συνέχεια)
Αναδρομική κλήση, …, συνένωση, συνένωση
7 2 9 43 8 6 1 1 2 3 4 6 7 8 9
7 29 4 2 4 7 9 3 8 6 1 1 3 6 8
722 7 9 4 4 9 3 8 3 8 6 1 1 6
Merge Sort 15
Παράδειγμα Εκτέλεσης (συνέχεια)
Συνένωση
7 2 9 43 8 6 1 1 2 3 4 6 7 8 9
7 29 4 2 4 7 9 3 8 6 1 1 3 6 8
722 7 9 4 4 9 3 8 3 8 6 1 1 6
Merge Sort 16
Ανάλυση του Merge-Sort
Το ύψος h του δένδρου του merge-sort είναι O(log n)
Σε κάθε αναδρομική κλήση διαιρούμε την ακολουθία στα 2,
Η συνολική δουλειά που γίνεται στους κόμβους βάθους i είναι O(n)
Διαχωρίζουμε και συνενώνουμε 2i ακολουθίες μεγέθους n2i
Εκτελούμε 2i1 αναδρομικές κλήσεις
Έτσι, ο συνολικός χρόνος εκτέλεσης του merge-sort είναι O(n log n)
1 2 n2
i 2i n2i
… … …
Merge Sort 17
Περίληψη Αλγορίθμων
Ταξινόμησης
Αλγόριθμος Χρόνος Παρατηρήσεις
αργός
selection-sort O(n2) in-place
για μικρά σύνολα εισόδου (< 1K)
αργός
insertion-sort O(n2) in-place
για μικρά σύνολα εισόδου (< 1K)
ταχύς
in-place
heap-sort O(n log n)
για μεγάλα σύνολα εισόδου
(1K — 1M)
ταχύς
σειριακή πρόσβαση δεδομένων
merge-sort O(n log n)
για πολύ μεγάλα σύνολα εισόδου18
Merge Sort
(> 1M)