Σχεδίαση και Ανάλυση Αλγορίθμων Ενότητα 8: ΧΡΗΣΗ ΔΟΜΩΝ ΔΕΝΤΡΟΥ ΚΑΙ ΣΩΡΟΥ ΓΙΑ ΕΠΙΛΥΣΗ ΠΡΟΒΛΗΜΑΤΟΣ ΤΑΞΙΝΟΜΗΣΗΣ ΑΛΓΟΡΙΘΜΟΣ HEAPSORT Δημήτριος Κουκόπουλος Σχολή Οργάνωσης και Διοίκησης Επιχειρήσεων Τμήμα Διαχείρισης Πολιτισμικού Περιβάλλοντος και Νέων Τεχνολογιών
ΠΕΡΙΕΧΟΜΕΝΟ Βασικές Έννοιες Δομή Σωρού, Σωρός Αλγόριθμος Κατασκευής Σωρού Αλγόριθμος Συμπλήρωσης Σωρού Παράδειγμα Αλγόριθμος Ταξινόμησης Σωρού - HeapSort Παράδειγμα 2
ΔΟΜΗ ΣΩΡΟΥ Ορισμός Δέντρο που προκύπτει από πλήρες δυαδικό δέντρο με ρίζα αν του αφαιρεθούν μερικοί κόμβοι (ή κανένας) από τα δεξιά του τελευταίου επιπέδου. Ειδικότερα δομή σωρού έχω σε ένα δέντρο αν: όλοι οι εσωτερικοί κόμβοι έχουν δυο παιδιά, με μόνη εξαίρεση τον πιο δεξιά εσωτερικό κόμβο του επιπέδου d-1 που επιτρέπεται να έχει βαθμό 1, οπότε θα έχει μόνο αριστερό παιδί, και στο επίπεδο d-1 τα φύλλα είναι όλα στα δεξιά των εσωτερικών κόμβων. 3
ΑΝΤΙΣΤΟΙΧΙΣΗ ΛΙΣΤΑΣ ΣΕ ΔΟΜΗ ΣΩΡΟΥ Αν έχω μια λίστα L με n αριθμούς τους αντιστοιχίζω σε μια δομή σωρού βάθους d log n, έτσι ώστε στο επίπεδο j της δομής σωρού ο πρώτος κόμβος να αντιστοιχεί στον αριθμό που βρίσκεται στη θέση 2 j στη λίστα L και ο τελευταίος στον αριθμό που βρίσκεται στη θέση 2 j+1-1 στη λίστα L με εξαίρεση το τελευταίο επίπεδο όπου δεν υπάρχουν αρκετοί όροι. 4
ΠΑΡΑΔΕΙΓΜΑ Αν L=[5, 6, 7, 9, 4, 3, 0, 1] τότε η δομή σωρού είναι: 5 6 7 9 4 3 0 1 5
ΣΩΡΟΣ - HEAP Ορισμός Σωρός ονομάζεται ένα δέντρο στους κόμβους του οποίου αντιστοιχούν αριθμοί από μια λίστα L και είναι δομή σωρού με την επιπλέον ιδιότητα ο αριθμός που αντιστοιχεί σε έναν κόμβο να μην είναι μικρότερος από τους αριθμούς που αντιστοιχούν στα παιδία του, αν ο κόμβος έχει παιδιά. 6
ΣΧΕΔΙΑΣΜΟΣ ΑΛΓΟΡΙΘΜΟΥ ΚΑΤΑΣΚΕΥΗΣ ΣΩΡΟΥ Ο αλγόριθμος κατασκευής σωρού παίρνει σαν είσοδο μια δομή σωρού L και δίνει σαν έξοδο ένα σωρό. Ο αλγόριθμος κατασκευής σωρού χρησιμοποιεί ως υποαλγόριθμο τον αλγόριθμο συμπλήρωσης σωρού που παίρνει σαν είσοδο μια δομή σωρού όπου τα παιδιά της ρίζας είναι σωροί και δίνει σαν έξοδο ένα σωρό. 7
ΒΗΜΑΤΑ Ο αλγόριθμος κατασκευής σωρού επισκέπτεται τους εσωτερικούς κόμβους του δέντρου εισόδου από επίπεδο σε επίπεδο και σε κάθε επίπεδο από αριστερά προς τα δεξιά. Η επίσκεψη ξεκινά από το προτελευταίο επίπεδο προς τα υψηλότερα επίπεδα. Σε κάθε εσωτερικό κόμβο ενεργοποιείται ο αλγόριθμος συμπλήρωσης σωρού για το δέντρο που έχει ρίζα τον κόμβο αυτό. 8
ΑΛΓΟΡΙΘΜΟΣ ΚΑΤΑΣΚΕΥΗΣ ΣΩΡΟΥ-Κ.Σ Είσοδος: Δομή σωρού L με n κόμβους. Έξοδος: Σωρός Ψευδοκώδικας: d log n m 1 =2 d for m=d-1 downto 0 do k=m while 2k<=n and k<m 1 do κλήση αλγόριθμου σ.σ(r,k,n) k=k+1 end while m 1 =2 m end for 9
ΑΛΓΟΡΙΘΜΟΣ ΣΥΜΠΛΗΡΩΣΗΣ ΣΩΡΟΥ- Σ.Σ(r,k,n) Είσοδος: Δομή σωρού με δείκτη ρίζας r και n στοιχεία όπου καθένα από τα υποδέντρα της ρίζας είναι σωρός. Έξοδος: Σωρός Ψευδοκώδικας: x=l(r) rleft=2r while rleft <= n do max=rleft rright=rleft+1 if rright<=n and L(rright)>=L(rleft) then max=rright if x<l(max) then do L(r)=L(max) r=max rleft=2max end if end while L(r)=x 10
ΠΑΡΑΔΕΙΓΜΑ 1/4 Πρόβλημα: Να εφαρμοστεί ο αλγόριθμος κατασκευής σωρού για τη λίστα L=[10,13,18,28,9,38,19,48,39,23,28]. Απάντηση: 1. Μετατρέπουμε τη λίστα L σε δομή σωρού: 10 13 18 28 9 38 19 48 39 23 28 11
ΠΑΡΑΔΕΙΓΜΑ 2/4 2. Ξεκινούμε από το προτελευταίο επίπεδο, d-1=2. Καλούμε τον αλγόριθμο σ.σ για το υποδέντρο με ρίζα το 28, και στη συνέχεια για το υποδέντρο με ρίζα το 9: 28 48 9 28 48 39 28 39 23 28 23 9 Οπότε: 10 13 18 48 28 38 19 28 39 23 9 12
ΠΑΡΑΔΕΙΓΜΑ 3/4 3. Πηγαίνουμε σε επίπεδο 1 και καλούμε τον αλγόριθμο σ.σ για το υποδέντρο με ρίζα το 13, και στη συνέχεια για το υποδέντρο με ρίζα το 18: 13 48 48 28 39 28 18 38 28 39 23 9 Οπότε: 28 13 23 9 10 38 19 18 19 48 38 39 28 18 19 28 13 23 9 13
ΠΑΡΑΔΕΙΓΜΑ 4/4 4. Πηγαίνουμε σε επίπεδο 0 και καλούμε τον αλγόριθμο σ.σ για τη ρίζα με τον αριθμό 10: 48 39 38 28 28 18 19 10 13 23 9 14
ΑΛΓΟΡΙΘΜΟΣ HEAPSORT ΓΙΑ ΤΑΞΙΝΟΜΗΣΗ ΛΙΣΤΑΣ 1/2 Βήματα: 1. Ο HeapSort εφαρμόζει πρώτα τον αλγόριθμο κατασκευής σωρού στην αρχική λίστα L. Τότε στη ρίζα τοποθετείται το μέγιστο στοιχείο της λίστας. 2. Το στοιχείο που βρίσκεται στη ρίζα του σωρού το παίρνουμε και το βάζουμε στο τέλος της L. 3. Στην κενή θέση τοποθετείται το τελευταίο φύλλο (το δεξιότερο στο τελευταίο επίπεδο) που αφαιρείται από δέντρο. Ο σωρός γίνεται δομή σωρού.
ΑΛΓΟΡΙΘΜΟΣ HEAPSORT ΓΙΑ ΤΑΞΙΝΟΜΗΣΗ ΛΙΣΤΑΣ 2/2 4. Καλείται ο αλγόριθμος συμπλήρωσης σωρού, οπότε η δομή σωρού γίνεται πάλι σωρός με το μεγαλύτερο στοιχείο στη ρίζα. Το στοιχείο αυτό τοποθετείται στη θέση n-1 της L και στη ρίζα μπαίνει πάλι τελευταίο φύλλο. 5. Επαναλαμβάνουμε διαδικασία μέχρι τέλος στοιχείων λίστας. 16
ΨΕΥΔΟΚΩΔΙΚΑΣ HEAPSORT κλήση αλγορίθμου κατασκευής σωρού κ.σ. for i=n to 2 do a=l(i) κλήση αλγορίθμου συμπλήρωσης σωρού σ.σ(1,1,i-1) L(i)=a end for 17
ΠΑΡΑΔΕΙΓΜΑ 1/5 Πρόβλημα: Εφαρμόστε τον αλγόριθμο HeapSort για να ταξινομήσετε τη λίστα L=[13,11,14,12,15,16] Απάντηση: Η δομή σωρού στην οποία αντιστοιχεί η λίστα L είναι: 13 11 14 12 15 16 Εφαρμόζουμε τον αλγόριθμο κατασκευής σωρού και παίρνουμε: 16 15 14 12 11 13 18
ΠΑΡΑΔΕΙΓΜΑ 2/5 Τοποθετώ το στοιχείο στη ρίζα στη θέση L(6) και στη ρίζα βάζω το τελευταίο φύλλο: L=[13,15,14,12,11,16] Εφαρμόζουμε τον αλγόριθμο συμπλήρωσης σωρού στο νέο δέντρο: 13 15 14 12 11 15 13 14 12 11 19
ΠΑΡΑΔΕΙΓΜΑ 3/5 Τοποθετώ το στοιχείο στη ρίζα στη θέση L(5) και στη ρίζα βάζω το τελευταίο φύλλο: L=[11,13,14,12,15,16] 11 13 14 12 Εφαρμόζουμε τον αλγόριθμο συμπλήρωσης σωρού στο νέο δέντρο: 14 13 11 12 20
ΠΑΡΑΔΕΙΓΜΑ 4/5 Τοποθετώ το στοιχείο στη ρίζα στη θέση L(4) και στη ρίζα βάζω το τελευταίο φύλλο: L=[12,13,11,14,15,16] 12 13 11 Εφαρμόζουμε τον αλγόριθμο συμπλήρωσης σωρού στο νέο δέντρο: 13 12 11 Τοποθετώ το στοιχείο στη ρίζα στη θέση L(3) και στη ρίζα βάζω το τελευταίο φύλλο: L=[12,11,13,14,15,16] 12 11 21
ΠΑΡΑΔΕΙΓΜΑ 5/5 Εφαρμόζουμε τον αλγόριθμο συμπλήρωσης σωρού στο νέο δέντρο: 12 11 Τοποθετώ το στοιχείο στη ρίζα στη θέση L(2) και στη ρίζα βάζω το τελευταίο φύλλο: L=[11,12,13,14,15,16] 22
ΧΡΗΜΑΤΟΔΟΤΗΣΗ Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στo πλαίσιo του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο Πανεπιστήμιο Πατρών» έχει χρηματοδοτήσει μόνο την αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 23
ΣΗΜΕΙΩΜΑ ΙΣΤΟΥΡΙΚΟΥ ΕΚΔΟΣΕΩΝ ΕΡΓΟΥ Το παρόν έργο αποτελεί την έκδοση 1.0. 24
ΣΗΜΕΙΩΜΑ ΑΝΑΦΟΡΑΣ Copyright Πανεπιστήμιο Πατρών, Δημήτριος Κουκόπουλος. «Σχεδίαση και Ανάλυση Αλγορίθμων. ΧΡΗΣΗ ΔΟΜΩΝ ΔΕΝΤΡΟΥ ΚΑΙ ΣΩΡΟΥ ΓΙΑ ΕΠΙΛΥΣΗ ΠΡΟΒΛΗΜΑΤΟΣ ΤΑΞΙΝΟΜΗΣΗΣ ΑΛΓΟΡΙΘΜΟΣ HEAPSORT». Έκδοση: 1.0. Πάτρα 2015. Διαθέσιμο από τη δικτυακή διεύθυνση: https://eclass.upatras.gr/courses/culture109/. 25
ΣΗΜΕΙΩΜΑ ΑΔΕΙΟΔΟΤΗΣΗΣ Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creative Commons Αναφορά, Μη Εμπορική Χρήση Παρόμοια Διανομή 4.0 [1] ή μεταγενέστερη, Διεθνής Έκδοση. Εξαιρούνται τα αυτοτελή έργα τρίτων π.χ. φωτογραφίες, διαγράμματα κ.λ.π., τα οποία εμπεριέχονται σε αυτό και τα οποία αναφέρονται μαζί με τους όρους χρήσης τους στο «Σημείωμα Χρήσης Έργων Τρίτων». [1] http://creativecommons.org/licenses/by-nc-sa/4.0/ Ως Μη Εμπορική ορίζεται η χρήση: που δεν περιλαμβάνει άμεσο ή έμμεσο οικονομικό όφελος από την χρήση του έργου, για το διανομέα του έργου και αδειοδόχο που δεν περιλαμβάνει οικονομική συναλλαγή ως προϋπόθεση για τη χρήση ή πρόσβαση στο έργο που δεν προσπορίζει στο διανομέα του έργου και αδειοδόχο έμμεσο οικονομικό όφελος (π.χ. διαφημίσεις) από την προβολή του έργου σε διαδικτυακό τόπο Ο δικαιούχος μπορεί να παρέχει στον αδειοδόχο ξεχωριστή άδεια να χρησιμοποιεί το έργο για εμπορική χρήση, εφόσον αυτό του ζητηθεί. 26
ΔΙΑΤΗΡΗΣΗ ΣΗΜΕΙΩΜΑΤΩΝ Οποιαδήποτε αναπαραγωγή ή διασκευή του υλικού θα πρέπει να συμπεριλαμβάνει: το Σημείωμα Αναφοράς το Σημείωμα Αδειοδότησης τη δήλωση Διατήρησης Σημειωμάτων το Σημείωμα Χρήσης Έργων Τρίτων (εφόσον υπάρχει) μαζί με τους συνοδευόμενους υπερσυνδέσμους. 27