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

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

Σύνοψη Προηγούμενου. Πίνακες (Arrays) Πίνακες (Arrays): Βασικές Λειτουργίες. Πίνακες (Arrays) Ορέστης Τελέλης

Ταξινόμηση: Εισαγωγικά. Ταξινόμηση (Sor ng) Αλγόριθμοι Απλής Ταξινόμησης. Βασικά Βήματα των Αλγορίθμων

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

Σύνοψη Προηγούμενου. Λίστες (Lists) Συνδεδεμένες Λίστες: Εισαγωγή (1/2) Συνδεδεμένες Λίστες. Ορέστης Τελέλης

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

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

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

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

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

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

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

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

Πελάτες φθάνουν στο ταμείο μιας τράπεζας Eνα μόνο ταμείο είναι ανοικτό Κάθε πελάτης παρουσιάζεται με ένα νούμερο - αριθμός προτεραιότητας Όσο ο

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

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

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

Κεφάλαιο 2. Η δομή δεδομένων Σωρός και η Ταξινόμηση Σωρού (The Heap data structure and Heapsort) Έκδοση 1.3, 14/11/2014

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

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

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

9. Κόκκινα-Μαύρα Δέντρα

Στοιχεία Αλγορίθµων και Πολυπλοκότητας

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

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

Διάλεξη 18: B-Δένδρα

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

Ο αλγόριθμος Quick-Sort. 6/14/2007 3:42 AM Quick-Sort 1

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

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

Ουρά Προτεραιότητας: Heap

4. Συνδεδεμένες Λίστες

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

Διάλεξη 14: Δέντρα IV B Δένδρα. Διδάσκων: Παναγιώτης Ανδρέου

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

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

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

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

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

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

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

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

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

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

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

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

Κεφάλαιο 6 Ουρές Προτεραιότητας

Ισοζυγισμένα υαδικά έντρα Αναζήτησης

σωροί ταξινόμηση σωρού οόροςheap σωρός (heap) συστοιχία Α για έναν σωρό μια δομή δεδομένων που πχ.

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

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

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

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

Heapsort Using Multiple Heaps

Δοµές Δεδοµένων. Αλγόριθµοι & Πολυπλοκότητα (Χειµώνας 2011) Ουρές Προτεραιότητας 2

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

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

Ουρές προτεραιότητας

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

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

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

Κατ οίκον Εργασία 3 Σκελετοί Λύσεων

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

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

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

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

Δένδρα Αναζήτησης Πολλαπλής Διακλάδωσης

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

13/5/2015 ΟΥΡΕΣ ΠΡΟΤΕΡΑΙΟΤΗΤΑΣ. Δομές Δεδομένων. Ουρές Προτεραιότητας

Διάλεξη 14: Δέντρα IV - B-Δένδρα

Αλγόριθμοι και πολυπλοκότητα Ταχυταξινόμηση (Quick-Sort)

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

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

Κεφάλαιο 2. Η δοµή δεδοµένων Σωρός και η Ταξινόµηση Σωρού (The Heap data structure and Heapsort) Έκδοση 1.1, 12/05/2010

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

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

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

Άσκηση 1 (ανακοινώθηκε στις 20 Μαρτίου 2017, προθεσμία παράδοσης: 24 Απριλίου 2017, 12 τα μεσάνυχτα).

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

Διάλεξη 16: Σωροί. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας - Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις

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

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

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

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

Εισαγωγή ενός νέου στοιχείου. Επιλογή i-οστoύ στοιχείου : Εύρεση στοιχείου με το i-οστό μικρότερο κλειδί

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

Ουρά Προτεραιότητας: Heap

Ουρά Προτεραιότητας: Heap

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

Ταξινόμηση κάδου και ταξινόμηση Ρίζας Bucket-Sort και Radix-Sort

Ουρά Προτεραιότητας: Heap

Ουρά Προτεραιότητας (priority queue)

ΟΥΡΕΣ ΠΡΟΤΕΡΑΙΟΤΗΤΑΣ

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΛΥΣΗ ΣΤΗΝ ΕΥΤΕΡΗ ΑΣΚΗΣΗ

Κεφάλαιο 8 Ισορροπημένα Δένδρα Αναζήτησης

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

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

Κεφάλαιο 13 Αντισταθμιστική Ανάλυση

Διδάσκων: Κωνσταντίνος Κώστα

Κεφάλαιο 14 Προηγμένες Ουρές Προτεραιότητας

Transcript:

Ουρές Προτεραιότητας: Υπενθύμιση Σωροί / Αναδρομή / Ταξινόμηση Ορέστης Τελέλης telelis@unipi.gr Τμήμα Ψηφιακών Συστημάτων, Πανεπιστήμιο Πειραιώς (Abstract Data Type) με μεθόδους: Μπορεί να υλοποιηθεί με διάφορες υποκείμενες δομές Υλοποίηση με Ταξινομημένο Πίνακα: Απομάκρυνση του μεγαλύτερου στοιχείου γρήγορα O(1). Εισαγωγή διαρκεί περισσότερο χρόνο O(n). Πρέπει να μετακινηθούν O(n) στοιχεία του πίνακα, για να εισαχθεί το νέο στοιχείο στη σωστή θέση. Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 1 / 57 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 2 / 57 Σωρός (Εισαγωγή) Υλοποίηση Σωρού Ενας σωρός είναι πλήρες δυαδικό δέντρο με τα εξής χαρακτηριστικά: Κάθε επίπεδο είναι πλήρως συμπληρωμένο, από αριστερά προς δεξιά. Το τελευταίο επίπεδο δε χρειάζεται να είναι συμπληρωμένο. Κάθε κόμβος σ ένα σωρό ικανοποιεί τη συνθήκη σωρού: Συνήθως υλοποιείται με πίνακα. Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 3 / 57 20 7 30 3 10 8 90 1 40 9 60 4 55 10 100 0 Κόμβος με αριθμό δείκτη : 45 11 50 5 5 12 80 2 6 Αριστερό Παιδί: +. Δεξιό Παιδί: +. γονέας του : ( )/. 0 1 2 3 4 5 6 7 8 9 10 11 12 100 90 80 30 60 50 20 10 40 55 45 5 Πλήρες δυαδικό δέντρο που αναπαριστά το σωρό και υλοποίηση με πίνακα. Ο πίνακας αποθηκεύεται στη μνήμη: ο σωρός είναι μόνο μία απεικόνιση. Σαν συνέπεια της πληρότητας του δέντρου, ο πίνακας δεν έχει κενές θέσεις. Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 4 / 57

Ουρές Προτεραιότητας & Σωροί Υλοποίηση Ουράς Προτεραιότητας με Σωρό Heap { Οι σωροί κυρίως υλοποιούν ουρές προτεραιότητας. Στη συνέχεια, για την υλοποίηση ουράς προτεραιότητας με σωρό: θεωρούμε ότι το μέγιστο κλειδί βρίσκεται στην αρχή της ουράς. Η κλάση κόμβου σωρού: Node { i D a t a ;.... Node heaparray [ ] ; i n s e r t ( Node nd ) { Node remove ( ) { P r i o r i t y Q u e u e { Heap theheap ; i n s e r t ( Node nd ) { theheap. i n s e r t ( nd ) ; Node remove ( ) { theheap. remove ( ) ; Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 5 / 57 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 6 / 57 Σύγκριση με ΔΔΑ Διαγραφή (1/2) Σε κάθε κόμβο ΔΔΑ: οι αριστεροί του απόγονοι έχουν μικρότερα κλειδιά, οι δεξιοί του απόγονοι έχουν μεγαλύτερα κλειδιά. Ο σωρός είναι ασθενώς ταξινομημένος (weakly ordered). Σε σωρό δεν είναι εύκολη η διάσχιση (traversal) με αύξουσα σειρά. Αναζήτηση/Διαγραφή Στοιχείου με τιμή κλειδιού όχι αποδοτικές. Απομάκρυνση (διαγραφή) στοιχείου Αφαίρεση του κόμβου με το μέγιστο κλειδί. Ο κόμβος προς διαγραφή είναι πάντα η ρίζα, heaparray[0]. Με τη διαγραφή της ρίζα το δέντρο δεν θα είναι πλήρες: θα έχουμε κενό κελί, ενδιαμέσως άλλων στοιχείων. Μόνο εισαγωγή και απομάκρυνση max/min στοιχείου αποδοτικές. Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 7 / 57 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 8 / 57

Διαγραφή (2/2) Απομάκρυνση του Μέγιστου Κόμβου (Ρίζα) Απομάκρυνση ρίζας. 95 51 30 51 Μετακίνηση κόμβου στη ρίζα. 63 37 10 63 37 10 43 27 55 34 30 43 27 55 34 κόμβος στο κατειλημμένο του δέντρου. Αντιγραφή κόμβου στη ρίζα: heaparray[0] = heaparray[n 1]; N ; Καθοδική πορεία του τελευταίου κόμβου μέχρι να βρεθεί κάτω από έναν κόμβο με μεγαλύτερο κλειδί και πάνω από έναν κόμβο με μικρότερο (ώστε να ικανοποιείται η συνθήκη σωρού). 63 30 51 37 10 63 30 51 37 10 43 27 55 34 43 27 55 34 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 9 / 57 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 10 / 57 Αντιμετάθεση Κόμβου για Αποκατάσταση της Ιδιότητας του Σωρού μετά από Διαγραφή Εισαγωγή (1/2) Αντιμετάθεση του κόμβου προορισμού με το μεγαλύτερο παιδί. Αντιμετάθεση με μικρότερο ίσως παραβιάσει την ιδιότητα σωρού. Το παιδί θα γίνει γονέας ενός μεγαλύτερου παιδιού. Ο εισαγόμενος κόμβος τοποθετείται στην 1η ανοιχτή θέση στο τέλος του πίνακα. heaparray [N] = newnode ; N+ + ; Είναι πιθανό να παραβιαστεί η συνθήκη σωρού. Κλειδί του νέου κόμβου > κλειδί νέου γονέα. Ο νέος κόμβος θα πρέπει να κινηθεί προς τα πάνω μέχρι να βρεθεί κάτω από κόμβο με μεγαλύτερο κλειδί και πάνω από κόμβο με μικρότερο. Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 11 / 57 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 12 / 57

Εισαγωγή (2/2) Δε Γίνεται Αντιμετάθεση στην Πραγματικότητα 63 55 37 51 10 63 55 37 51 10 1 αντιμετάθεση 3 αντιγραφές. Στο παράδειγμα (β): 43 27 30 34 63 55 51 10 43 27 30 34 63 55 51 10 1. Αντιμετάθεση 2. Αντιμετάθεση B C 3. Αντιμετάθεση D A 2. Αντιγραφή A 3. Αντιγραφή B 1. Αντιγραφή C 4. Αντιγραφή tmp D 5. Αντιγραφή 43 27 30 34 37 43 27 30 34 37 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 13 / 57 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 14 / 57 Η Κλάση Node Η Κλάση Heap Heap { Node { i D a t a ; Node ( key ) { i D a t a = key ; getkey ( ) { i D a t a ; s e t K e y ( i d ) { i D a t a = i d ; Node [ ] heaparray ; maxsize ; c u r r e n t S i z e ; Heap ( mx ) { maxsize = mx ; c u r r e n t S i z e = 0 ; heaparray = Node [ maxsize ] ; isempty ( ) { c u r r e n t S i z e = =0; Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 15 / 57 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 16 / 57

Η Μέθοδος insert() Η Μέθοδος trickleup() t r i c k l e U p ( i n d e x ) { i n s e r t ( key ) { p a r e n t = ( index 1) / 2 ; ( c u r r e n t S i z e == maxsize ) ; Node newnode = Node ( key ) ; heaparray [ c u r r e n t S i z e ] = newnode ; t r i c k l e U p ( c u r r e n t S i z e + +) ; ; Node bottom = heaparray [ i n d e x ] ; ( i n d e x > 0 && heaparray [ p a r e n t ]. getkey ( ) < bottom. getkey ( ) ) { heaparray [ i n d e x ] = heaparray [ p a r e n t ] ; i n d e x = p a r e n t ; p a r e n t = ( parent 1) / 2 ; heaparray [ i n d e x ] = bottom ; Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 17 / 57 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 18 / 57 Η Μέθοδος remove() Node remove ( ) { Node r o o t = heaparray [ 0 ] ; heaparray [ 0 ] = heaparray[ c u r r e n t S i z e ] ; t r i c k l e D o w n ( 0 ) ; r o o t ; Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 19 / 57 Η Μέθοδος trickledown() t r i c k l e D o w n ( i n d e x ) { l a r g e r C h i l d ; Node top = heaparray [ i n d e x ] ; ( i n d e x < c u r r e n t S i z e / 2 ) { l e f t C h i l d = 2 * i n d e x +1, r i g h t C h i l d = l e f t C h i l d + 1 ; ( r i g h t C h i l d < c u r r e n t S i z e && heaparray [ l e f t C h i l d ]. getkey ( ) < heaparray [ r i g h t C h i l d ]. getkey ( ) ) l a r g e r C h i l d = r i g h t C h i l d ; l a r g e r C h i l d = l e f t C h i l d ; ( top. getkey ( ) >= heaparray [ l a r g e r C h i l d ]. getkey ( ) ) ; heaparray [ i n d e x ] = heaparray [ l a r g e r C h i l d ] ; i n d e x = l a r g e r C h i l d ; heaparray [ i n d e x ] = top ; Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 20 / 57

Απόδοση Λειτουργιών Σωρού HeapSort Αλγόριθμος Ταξινόμησης Χρονοβόροι Αλγόριθμοι: trickleup /ανοδικός, trickledown/καθοδικός. Πλήθος απαιτούμενων αντιγραφών ανάλογο του ύψους του δέντρου: Π.χ. για 5 επίπεδα απαιτούνται 4 αντιγραφές. TrickleUp: 1 σύγκριση νέου κόμβου με κόμβο στην τρέχουσα θέση. TrickleDown: 2 συγκρίσεις μία για την εύρεση του μεγαλύτερου παιδιού μία για τη σύγκριση του παιδιού με τον τελευταίο κόμβο. Το ύψος του δέντρου είναι log(n + 1) όπου n το πλήθος των κόμβων. Αρα η πολυπλοκότητα των δύο μεθόδων είναι O(log n). Δημιουργία σωρού Εισαγωγή στοιχείων 7, 1, 8, 0, 6, 2, 9, 4 σε σωρό Απομάκρυνση του max/min από το σωρό (άρα σε ταξινομημένη σειρά) και εγγραφή του σε πίνακα Διαγραφή πάντα από ρίζα Πολυπλοκότητα: O(n log n) Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 21 / 57 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 22 / 57 Αναδρομή & Ταξινόμηση Εισαγωγή Η () είναι τεχνική προγραμματισμού όπου: γνωρίζεις, την απάντηση. Εντόπισε κάποιον που γνωρίζει περισσότερα από εσένα. Ζήτησέ του να εκτελέσει: την απάντησή του. μια μέθοδος/συνάρτηση/διαδικασία καλεί τον εαυτό της. Ιδιαίτερα ενδιαφέρουσα και αποτελεσματική τεχνική: για την ευσύνοπτη και κομψή διατύπωση αλγορίθμων, για την καταγραφή μικρών και ευανάγνωστων προγραμμάτων, για την περιγραφή λύσεων σε προβλήματα. Θεμελιώδες πλαίσιο για την επίλυση πολλών προβλημάτων Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 23 / 57 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 24 / 57

Μηχανισμός Αναδρομικών Μεθόδων Αναδρομή σε Μαθηματικούς Ορισμούς Μια αναδρομική μέθοδος καλεί τον εαυτό της: με «μικρότερο» όρισμα, δηλαδή, μικρότερο/ευκολότερο υπο-πρόβλημα, για να λύσει αυτό το μικρότερο υπο-πρόβλημα πρώτα. Υπάρχει αρκετά μικρή εκδοχή του προβλήματος που έχει απλή λύση: χωρίς η μέθοδος να καλέσει τον και πάλι τον εαυτό της. Οταν το όρισμα μιας αναδρομικής κλήσης γίνει αρκετά «μικρό»: αυτό ελέγχεται με μια συνθήκη: ή η μέθοδος επιστρέφει μια λύση χωρίς επιπλέον αναδρομική κλήση. Ο n είναι φυσικός αριθμός, αν ο n 1 είναι φυσικός αριθμός. Το 0 είναι φυσικός αριθμός ( ). factorial(n) = 1 αν n = 1 factorial(n) = n factorial(n 1) αν n > 1 { 1 αν n = 0 x n = x x n 1 αν n > 0 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 25 / 57 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 26 / 57 Αναδρομή σε Μαθηματικούς Ορισμούς f a c t o r i a l ( n ) { ( n ==0) 1 ; n * f a c t o r i a l ( n 1) ; power ( x, n ) { ( n == 0 ) 1. 0 ; ( x * power ( x, n 1) ) ; Παραδείγματα Εστω ( ), ( ) αριστερό και δεξιό παιδί του, αντίστοιχα. =, τότε. =, τότε. <, τότε ( ) >, τότε ( ) =, τότε. =, τότε. Θέσε := επόμενος( ). Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 27 / 57 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 28 / 57

Αναδρομική Δυαδική Αναζήτηση Η Απόδοση της Αναδρομής r e c F i n d ( searchkey, lowbound, upbound ) { c u r I n = ( lowbound + upbound ) / 2 ; ( a [ c u r I n ] == s e a r c h K e y ) c u r I n ; ( lowbound > upbound ) nelems ; { ( a [ c u r I n ] < s e a r c h K e y ) r e c F i n d ( searchkey, c u r I n +1, upbound ) ; r e c F i n d ( searchkey, lowbound, c u r I n 1) ; Η κλήση μιας μεθόδου επιφέρει κάποια καθυστέρηση. Επίσης, τα ορίσματα στη μέθοδο και η διεύθυνση στην οποία η μέθοδος πρέπει να επιστρέψει εισάγονται σε μια εσωτερική στοίβα. Μπορεί η αναδρομή να επιφέρει μια επιβάρυνση στο χρόνο εκτέλεσης. Η αναδρομή χρησιμοποιεί επιπλέον μνήμη για την αποθήκευση των ορισμάτων και των τιμών επιστροφής στην εσωτερική στοίβα. Εάν η ποσότητα των δεδομένων είναι μεγάλη, μπορεί να συμβεί υπερχείλιση στοίβας. Η αναδρομή χρησιμοποιείται επειδή απλοποιεί ένα πρόβλημα, όχι επειδή είναι πιο αποτελεσματική. Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 29 / 57 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 30 / 57 Περιπτώσεις μη Αποδοτικής Αναδρομής (1/2) Περιπτώσεις μη Αποδοτικής Αναδρομής (2/2) : 0 αν n = 0 F (n) = 1 αν n = 1 F (n 1) + F (n 2) αν n 2 f i b ( n ) { ( n <= 1 ) n ; f i b ( n 1) + f i b ( n 2) ; ( ) F (4) ( ) F (5) ( ) ( ) ( ) Υπολογίζουμε το fib(n) με αναδρομική κλήση fib(n-1). ( ) ( ) ( ) F (0) ( ) F (0) Οταν η αναδρομική κλήση επιστρέψει, εκτελούμε την fib(n-2). To fib(n-2) έχει όμως ήδη υπολογιστεί, με την 1η αναδρομική κλήση εντός της κλήσης fib(n-1)!!! ( ) F (0) Υπολογίζουμε: το F (3) 2 φορές, το F (2) 3 φορές, το F (1) 5 φορές!!!. Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 31 / 57 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 32 / 57

Αλγόριθμοι Διαίρει και Βασίλευε (Divide and Conquer) Ταξινόμηση Συγχώνευσης (MergeSort) Aναδρομική Δυαδική Αναζήτηση: παράδειγμα της προσέγγισης Διαιρούμε το πρόβλημα σε δύο μικρότερα: επιλύουμε αναδρομικά το καθένα ξεχωριστά. «συνδυάζουμε» τις λύσεις για την επίλυση του αρχικού προβλήματος. Με αναδρομικές υποδιαιρέσεις του προβλήματος: Μεταξύ των βέλτιστων αλγορίθμων ταξινόμησης. Το ίδιο και οι AVLSort, HeapSort - Πολυπλοκότητα: O(n log n) Οι υπόλοιποι αλγόριθμοι που έχουμε δει έχουν πολυπλοκότητα O(n 2 ). Η MergeSort είναι σχετικά απλή στην υλοποίησή της. δεν κάνει επί τόπου (in-place) ταξινόμηση. Απαιτεί επιπλέον πίνακα, ίσο σε μέγεθος με αυτόν που ταξινομείται. καταλήγουμε σε μικρές βασικές περιπτώσεις του, στις οποίες η απάντηση βρίσκεται χωρίς περαιτέρω υποδιαίρεση. Η AVLSort απαιτεί δομή δέντρου AVL για την υλοποίησή της. Η HeapSort απαιτεί δομή σωρού για την υλοποίησή της. Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 33 / 57 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 34 / 57 Βασική Ιδέα: Συγχώνευση Ταξινομημένων Πινάκων Συγχώνευση δύο ταξινομημένων πινάκων A και B σε τρίτο πίνακα C: που περιέχει όλα τα στοιχεία των A και B ταξινομημένα. Υποθέστε ότι αρχικά ο C είναι κενός. Το σχήμα δείχνει τον C μετά τη διαδικασία συγχώνευσης. 23 42 87 99 12 21 23 42 55 77 87 92 99 12 21 55 77 92 Η Μέθοδος Συγχώνευσης merge ( [ ] arraya, s i z e A, [ ] arrayb, s i z e B, [ ] a r r a y C ) { adex =0, bdex =0, cdex = 0 ; ( adex < s i z e A && bdex < s i z e B ) ( a r r a y A [ adex ] < a r r a y B [ bdex ] ) a r r a y C [ cdex ++] = a r r a y A [ adex + + ] ; a r r a y C [ cdex ++] = a r r a y B [ bdex + + ] ; ( adex < s i z e A ) a r r a y C [ cdex ++] = a r r a y A [ adex + + ] ; ( bdex < s i z e B ) a r r a y C [ cdex ++] = a r r a y B [ bdex + + ] ; Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 35 / 57 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 36 / 57

Παράδειγμα MergeSort Παράδειγμα MergeSort 23 12 58 7 10 34 15 3 3 7 10 12 15 23 34 58 23 12 58 7 10 34 15 3 7 12 23 58 3 10 15 34 23 12 58 7 10 34 15 3 12 23 7 58 10 34 3 15 23 12 58 7 10 34 15 3 23 12 58 7 10 34 15 3 «Στάδιο» συγχωνεύσεων του πίνακα προς ταξινόμηση: οι αναδρομικές κλήσεις συγχωνεύουν και επιστρέφουν. Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 37 / 57 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 38 / 57 Υλοποίηση MergeSort Κλήση: recmergesort(workspace,0,nelems-1) MergeSortApp { [ ] t h e A r r a y ; main ( S t r i n g [ ] a r g s ) { mergesort ( t h e A r r a y. l e n g t h ) ; mergesort ( nelems ) { [ ] workspace = [ nelems ] ; recmergesort ( workspace, 0, nelems 1) ; Χρησιμοποιείται βοηθητικός πίνακας «εργασίας» workspace ίσου μεγέθους: recmergesort ( [ ] workspace, lowerbound, upperbound ) { ( lowerbound == upperbound ) ; { mid = ( lowerbound + upperbound ) / 2 ; recmergesort ( workspace, lowerbound, mid ) ; recmergesort ( workspace, mid +1, upperbound ) ; merge ( workspace, lowerbound, mid +1, upperbound ) ; για προσωρινή αποθήκευση των υποπινάκων που δημιουργούνται. Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 39 / 57 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 40 / 57

Τροποποιημένη merge() merge ( [ ] workspace, lowptr, h i g h P t r, upperbound ) { j = 0 ; lowerbound = l o w P t r ; mid = h i g h P t r 1; n = upperbound lowerbound + 1 ; ( l o w P t r <= mid && h i g h P t r <= upperbound ) ( t h e A r r a y [ l o w P t r ] < t h e A r r a y [ h i g h P t r ] ) workspace [ j ++] = t h e A r r a y [ l o w P t r + + ] ; workspace [ j ++] = t h e A r r a y [ h i g h P t r + + ] ; ( l o w P t r <= mid ) workspace [ j ++] = t h e A r r a y [ l o w P t r + + ] ; ( h i g h P t r <= upperbound ) workspace [ j ++] = t h e A r r a y [ h i g h P t r + + ] ; Απόδοση Ταξινόμησης Συγχώνευσης Αριθμός αντιγραφών: Ανάλογος του O(n log n). Για ταξινόμηση n στοιχείων χρειαζόμαστε O(log n) επίπεδα και σε κάθε επίπεδο n αντιγραφές. Αριθμός συγκρίσεων: Είναι πάντα λίγο μικρότερος από τον αριθμό των αντιγραφών. Για κάθε κλήση της merge() απαιτούνται τουλάχιστον n/2 και το πολύ n 1 συγκρίσεις, όπου n το πλήθος των στοιχείων που συγχωνεύονται. ( j = 0 ; j <n ; j ++) t h e A r r a y [ lowerbound + j ] = workspace [ j ] ; Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 41 / 57 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 42 / 57 Τι Ξέρουμε Μέχρι Τώρα; Ταξινόμηση χρόνου O(n 2 ): BubbleSort, Selec onsort, Inser onsort Απλές στην υλοποίηση. Με χρήση αναδρομής (MergeSort) χρόνος O(n log n). Ομως απαιτεί διπλάσιο χώρο του αρχικού πίνακα. Θα εξετάσουμε μια νέα μέθοδς ταξινόμησης, την Quicksort: Δεν απαιτεί επιπλέον χώρο. O(n 2 ) στη χειρότερη περίπτωση, αλλά είναι σπάνιο και «ελέγξιμο». O(n log n) χρόνος πάνω από ομοιόμορφα τυχαία διάταξη στοιχείων. Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 43 / 57 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 44 / 57

Ταξινόμηση QuickSort Αλγόριθμος Διαμέρισης Χρησιμοποιεί δύο δείκτες, έναν σε κάθε άκρη του πίνακα. Στηρίζεται στην έννοια του διαχωρισμού (διαμέρισης) par on. Ο διαχωρισμός δεδομένων είναι η διαίρεσή τους σε 2 ομάδες ώστε: μία ομάδα περιέχει στοιχεία με κλειδί μικρότερο από συγκεκριμένη τιμή η άλλη περιέχει στοιχεία με κλειδί μεγαλύτερο από τη συγκεκριμένη τιμή Το στοιχείο με τη συγκεκριμένη τιμή λέγεται ( ). ο () κινείται,, διαφορετικά, σταματά. ( ), διαφορετικά, σταματά. Εκεί που σταματούν και οι δύο, αντιμετατίθενται τα στοιχεία (swap). Η διαδικασία συνεχίζεται, Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 45 / 57 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 46 / 57 Παράδειγμα (1/2) Παράδειγμα (2/2) 8 1 4 9 0 3 5 2 7 Ο σταματά στο 8 > 6. O σταματά στο 2 < 6: 1 4 9 0 3 5 7 Τα στοιχεία 2 και 8 αντιμετατίθενται: 1 4 9 0 3 5 7 Ο σταματά στο 9 > 6. O σταματά στο 5 < 6. 2 1 4 0 3 8 7 Τα στοιχεία 9 και 5 αντιμετατίθενται: 2 1 4 0 3 8 7 Οι δείκτες και διασταυρώνονται: 2 1 4 5 0 8 7 Αντιμετάθεση του στοιχείου που «δείχνει» ο με το : 2 1 4 5 0 3 8 7 9 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 47 / 57 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 48 / 57

p a r t i t i o n I t ( l e f t, r i g h t, p i v o t ) { l e f t P t r = l e f t 1; r i g h t P t r = r i g h t ; ( ) { ( t h e A r r a y [++ l e f t P t r ] < p i v o t ) ; ( r i g h t P t r > 0 && t h e A r r a y[ r i g h t P t r ] > p i v o t ) ; ( l e f t P t r >= r i g h t P t r ) ; swap ( l e f t P t r, r i g h t P t r ) ; swap ( l e f t P t r, r i g h t ) ; l e f t P t r ; Απόδοση του Αλγορίθμου Διαμέρισης Χρόνος εκτέλεσης: O(n). Αριθμός συγκρίσεων: n + 1 ή n + 2. Αριθμός αντιμεταθέσεων: n/2 (χειρότερη περίπτωση). Κατά μέσο όρο για είσοδο σε τυχαία σειρά επιλεγμένη από την ομοιόμορφη κατανομή, γίνονται περίπου οι μισές του μέγιστου αριθμού αντιμεταθέσεων. Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 49 / 57 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 50 / 57 QuickSort Παράδειγμα Αναδρομικής Εκτέλεσης διαχωρίζει έναν πίνακα σε δύο υποπίνακες, καλεί τον εαυτό του για να ταξινομήσει τον κάθε υποπίνακα. Η τιμή του πρέπει να είναι τιμή κλειδιού ενός υπαρκτού στοιχείου. Μπορεί π.χ. να επιλέγεται τυχαία και ομοιόμορφα από τον πίνακα. - Μετά το διαχωρισμό, αν το pivot τοποθετηθεί μεταξύ του αριστερού και του δεξιού υποπίνακα, θα βρίσκεται στην τελική του θέση. 33 55 77 11 66 88 22 33 11 11 33 55 77 66 55 77 55 77 Στάδιο Διαμερίσεων (μέσω αναδρομικών κλήσεων). 11 22 33 44 55 66 77 88 11 22 33 11 33 55 66 77 88 55 66 77 55 77 Στάδιο «ανασυστάσεων» (με επιστροφές από τις αναδρομικές κλήσεις). Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 51 / 57 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 52 / 57

p a r t i t i o n I t ( l e f t, r i g h t, p i v o t ) { r e c Q u i c k S o r t ( l e f t, r i g h t ) { ( r i g h t l e f t <= 0 ) ; { p i v o t = t h e A r r a y [ r i g h t ] ; p a r t i t i o n = p a r t i t i o n I t ( l e f t, r i g h t, p i v o t ) ; r e c Q u i c k S o r t ( l e f t, p a r t i t i o n 1) ; r e c Q u i c k S o r t ( p a r t i t i o n +1, r i g h t ) ; l e f t P t r = l e f t 1; r i g h t P t r = r i g h t ; ( ) { ( t h e A r r a y [++ l e f t P t r ] < p i v o t ) ; ( r i g h t P t r > 0 && t h e A r r a y[ r i g h t P t r ] > p i v o t ) ; ( l e f t P t r >= r i g h t P t r ) ; swap ( l e f t P t r, r i g h t P t r ) ; swap ( l e f t P t r, r i g h t ) ; l e f t P t r ; Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 53 / 57 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 54 / 57 Η Επιλογή του Pivot Απόδοση της QuickSort Για αντίστροφα ταξινομημένο πίνακα: η απόδοση είναι O(n 2 ). Το πρόβλημα είναι η επιλογή του pivot. Ιδανικά, το pivot θα ήταν το μεσαίο των στοιχείων που ταξινομούνται. Αυτό θα έδινε διαχωρισμό του πίνακα σε δύο υποπίνακες ίσου μεγέθους. Αυτή είναι η ιδανική περίπτωση για την QuickSort. Χειρότερη περίπτωση: διαχωρισμός σε 1 και n 1 στοιχεία. Αλλοι τρόποι επιλογής pivot? Σπάνια συμβαίνει η χειρότερη περίπτωση. Οταν η είσοδος είναι σε τυχαία και ομοιόμορφα επιλεγμένη σειρά: εκτελείται σε χρόνο O(n log n). (Αναμενόμενος) Αριθμός συγκρίσεων: (n + 2) log n. (Αναμενόμενος) Αριθμός αντιμεταθέσεων: (n/2) log n. Μέσος εκ των τριών (αριστερό, μεσαίο και δεξιό στοιχείο) Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 55 / 57 Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 56 / 57

Σύνοψη Αλγορίθμων Ταξινόμησης O(n2 ) O(n log n) O(n 2 ) Αλγόριθμοι που εκτελούν ταξινόμηση επί τόπου (in-place). Αλγόριθμοι που χρειάζονται επιπλέον χώρο (μνήμη) Η MergeSort χρειάζεται επιπλέον πίνακα. Η AVLSort, Δέντρο AVL. Η έχει εκτέλεσης ( log ), για ομοιόμορφα τυχαία διάταξη των στοιχείων εισόδου. Χρησιμοποιείται ευρύτατα στην πράξη. Η είναι τελείως θεωρητικής αξίας, Ο. Τελέλης - Πανεπιστήμιο Πειραιώς Σωροί / Αναδρομή Ταξινόμηση 57 / 57