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

Σχετικά έγγραφα
Αλγόριθμοι Ταξινόμησης Μέρος 2

p

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Γ7.5 Αλγόριθμοι Αναζήτησης. Γ Λυκείου Κατεύθυνσης

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

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

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

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

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

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

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

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

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

Αναζήτηση και ταξινόμηση

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

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

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

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

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

ΑΛΓΟΡΙΘΜΟΙ. Ενότητα 4: Διαίρει και Βασίλευε. Ιωάννης Μανωλόπουλος, Καθηγητής Αναστάσιος Γούναρης, Επίκουρος Καθηγητής Τμήμα Πληροφορικής ΑΠΘ

Προγραμματιστικές Τεχνικές

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων

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

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΘΕΩΡΗΤΙΚΗ ΑΣΚΗΣΗ 2 ΛΥΣΕΙΣ Γραμμικές Δομές Δεδομένων, Ταξινόμηση

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

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

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

Εισαγωγή στην Ανάλυση Αλγορίθμων (1) Διαφάνειες του Γ. Χ. Στεφανίδη

Εργαστηριακή Άσκηση 1

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

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

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

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 8/4/2008. Πίνακες (Arrays)

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

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 6 : ΠΙΝΑΚΕΣ

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

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

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

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

ΜΥΥ105: Εισαγωγή στον Προγραμματισμό. Αναζήτηση και Ταξινόμηση Χειμερινό Εξάμηνο 2016

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

ΜΥΥ105: Εισαγωγή στον Προγραµµατισµό. Αναζήτηση και Ταξινόµηση Χειµερινό Εξάµηνο 2014

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

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

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

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

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

int Α[] = {4, 16, 22, 12, 9, 15, 10}; { 4, 9, 10, 12, 15, 16, 22 } Α[0]=4, Α[1]=9, Α[2]=10 { 4, 16,22, 12, 9, 15, 10} { 4, 12, 16, 22, 9, 15,16, 22 }

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

Πολλές φορές έχουμε πολλές μεταβλητές του ίδιου τύπου που συσχετίζονται και θέλουμε να τις βάλουμε μαζί.

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

ΤΕΜ-101 Εισαγωγή στους Η/Υ Εξεταστική Ιανουαρίου 2011 Θέματα Β

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

Εξωτερική Ταξινόμηση. Μ.Χατζόπουλος 1

Ενότητες 3 & 4: Δένδρα, Σύνολα & Λεξικά Ασκήσεις και Λύσεις

Generics και ArrayLists

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

I. ΑΛΓΟΡΙΘΜΟΣ II. ΠΡΑΞΕΙΣ - ΣΥΝΑΡΤΗΣΕΙΣ III. ΕΠΑΝΑΛΗΨΕΙΣ. 1. Τα πιο συνηθισμένα σενάρια παραβίασης αλγοριθμικών κριτηρίων είναι:

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

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

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 17/1/08

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java

Διάλεξη 20: Αναδρομή (Recursion) Διδάσκων: Παναγιώτης Ανδρέου

2.1. Εντολές Σχόλια Τύποι Δεδομένων

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 7: Πίνακες (Arrays)

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

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

ΣΧΕΔΙΑΣΗ ΚΑΙ ΥΛΟΠΟΙΗΣΗ ΛΟΓΙΣΜΙΚΟΥ

Αναδρομή (Recursion) Πώς να λύσουμε ένα πρόβλημα κάνοντας λίγη δουλειά και ανάγοντας το υπόλοιπο να λυθεί με τον ίδιο τρόπο.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ.

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Φροντιστήριο 2 ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ

επιµέλεια Θοδωρής Πιερράτος

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

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

Κεφάλαιο 4. Διαίρει και Βασίλευε (Divide and Conquer) Παύλος Εφραιμίδης V1.1,

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

Transcript:

ΣΧΟΛΙΑ 1 ΗΣ ΕΡΓΑΣΙΑΣ Σχεδίαση Αλγορίθμων 15 Μαΐου 2013

Ζητούμενα Υλοποίηση Ταξινόμησης με Συγχώνευση (Mergesort) Αναδρομική (Recursive) εκδοχή Επαναληπτική (Iterative) εκδοχή Καταμέτρηση αντιστροφών Για πίνακα [Α 1,Α 2,,Α Ν ] υπάρχει αντιστροφή όταν Α i > A j και i < j Χρήση προτύπου (template) Java 1.6

Μεθοδολογία Εξέτασης Εκτέλεση πειραμάτων με τρία σύνολα δεδομένων Σωστή έξοδος ταξινόμησης και πλήθους αντιστροφών 1000 στοιχεία 1024 στοιχεία 1048576 στοιχεία Έλεγχος πολυπλοκότητας O(n) η merge() O(nlogn) ολόκληρη λ η mergesort Επαρκής σχολιασμός

Γενικές Παρατηρήσεις Μεγαλύτερο ποσοστό επιτυχίας στην αναδρομική mergesort Σωστά αποτελέσματα επαναληπτικής mergesort χωρίς σωστό πλήθος αντιστροφών Σωστή πολυπλοκότητα στις περισσότερες εργασίες

Συνηθέστερα Λάθη Στατική ήδέσμευση χώρου μνήμης Υπόθεση ηγια αρχεία εισόδου με πλήθος στοιχείων ίσο με δύναμη του 2 Υπόθεση για άρτιο πλήθος στοιχείων «Κρέμασμα» προγράμματος στο 3 ο αρχείο εισόδου Ανάθεση ονόματος στο αρχείου εισόδου Θα έπρεπε να γίνεται μέσω ορίσματος στο command line

Αναδρομική Mergesort (1) Δά Διάσπαση αρχικού πίνακα A σε δύο βοηθητικούς B και C Εισαγωγή των στοιχείων του Α στους Β και C Κλήση αναδρομικής Mergesort στον B Κλήση αναδρομικής Mergesort στον C Συγχώνευση των (ταξινομημένων) B και C Το πλήθος αντιστροφών είναι ίσο με το πλήθος των αντιστροφών στον Β συν το πλήθος των αντιστροφών στον C συν το πλήθος των αντιστροφών που προκύπτουν κατά τη συγχώνευσή τους

Αναδρομική Mergesort (2) static long recursivemergesortandcount(integer[] A) long inversions = 0; if (A.length > 1) //Δημιουργία 2 βοηθητικών υποπινάκων από τον πίνακα A int mid = A.length/2; Integer [] B = new Integer[mid]; Integer [] C = new Integer[A.length mid]; //Εισαγωγή των στοιχείων του πίνακα A //στους ς υποπίνακες B και C αντίστοιχα for (int i = 0; i< mid; i++) B[i] = A[i]; for (int i = mid; i < Alength; A.length; i++) C[i mid] = A[i]; //Μέτρηση αντιστροφών στον αριστερό υποπίνακα B inversions += recursivemergesortandcount(b); //Μέτρηση αντιστροφών στο δεξιό υποπίνακα C inversions += recursivemergesortandcount(c); //Μέτρηση αντιστροφών κατά τη συγχώνευση των 2 //υποπινάκων σε 1 πίνακα, τον A inversions += merge(b, C, A); return inversions; //Περίπτωση πίνακα 1 στοιχείου return 0;

Επαναληπτική Mergesort (1) Μια εξωτερική επανάληψη διατρέχει τον πίνακα ανά blocks (με μέγεθος 1, 2, 4, 8, ) Μια εσωτερική επανάληψη ταξινομεί τους δύο πίνακες που βρίσκονται μέσα σε ένα block Μέριμνα για τον δεύτερο πίνακα σε περίπτωση που απομένουν λιγότερα στοιχεία από το μέγεθος του block Επανάληψη διαδικασίας μέχρι το μέγεθος του block να γίνει ίσο ή να ξεπεράσει το μέγεθος του αρχικού πίνακα Το πλήθος των αντιστροφών είναι ίσο με το συνολικό άθροισμα αντιστροφών που προκύπτουν σε κάθε συγχώνευση

Επαναληπτική Mergesort (2) static long iterativemergesortandcount(integer[] Array) for (int j = 0; j < right.length; j++) long inversions = 0; // Διπλασιάζουμε σε κάθε πέρασμα το μέγεθος του block_size μέχρι να γίνει // ίσο ή να ξεπεράσει το μήκος του Array. for (int block_size = 1; block_size < Array.length; block_size *= 2) Integer[] Array2 = new Integer[2 * block_size]; Integer[] left = new Integer[block_size]; Integer[] right = new Integer[block_size]; for (int k = 0; k < Array.length; k += 2 * block_size) // Υπολογίζουμε αν ο right χρειάζεται λιγότερες θέσεις λόγω περιττού // πλήθους στοιχείων. int x = Array.length k block_size; // Αν το sum έιναι μικρότερο ή ίσο του μηδέν τότε ο left δεν έχει στοιχεία // οπότε προσπερνάμε την επανάληψη. if (x <= 0) continue; // Περίπτωση όπου χρειαζόμαστε στοιχεία για τον right,αλλά το πλήθος // τους είναι μικρότερο του block_size. if (x < block_size) right = new Integer[x]; // Σπάμε το Array σε 2 άλλα,left και right for (int i = 0; i< left.length; i++) left[i] = Array[i + k]; right[j] = Array[j + k + block_size]; // Συγχωνεύουμε τους πίνακες left και right στον πίνακα Array2. inversions += merge(left, right, Array2); // Αντιγράφουμε τον πίνακα Array2 στον Array. for (int y = 0; y < left.length + right.length; y++) Array[y + k] = Array2[y]; return inversions;

Συνάρτηση merge() (1) Δέχεται ως είσοδο δυο ταξινομημένους πίνακες lft left και right ihtκαι έναν πίνακα ο οποίος θα περιέχει το αποτέλεσμα της συγχώνευσης των left και right Επιστρέφει το πλήθος των αντιστροφών που βρέθηκαν κατά τη διάρκεια της συγχώνευσης Για κάθε πίνακα διατηρούμε έναν δείκτη Διατρέχουμε τους δύο πίνακες επιλέγοντας κάθε φορά το μικρότερο στοιχείο Αυξάνουμε τον δείκτη του πίνακα που επιλέγεται ένα στοιχείο Όταν τελειώσει κάποιος από τους δύο πίνακες, συγχωνεύουμε με τα στοιχεία που έχουν απομείνει στον άλλον Κάθε φορά που επιλέγουμε ένα στοιχείο από τον right πίνακα, έχουμε left.length left_pointer επιπλέον αντιστροφές

Συνάρτηση merge() (2) static long merge(integer [] left, Integer[] right, Integer[] a) long inversions = 0; int i = 0, j = 0, k = 0; while ( (i < left.length) && (j < right.length) ) //Σε αυτήν την περίπτωση δεν υπάρχουν αντιστροφές if (left[i] <= right[j]) a[k] = left[i]; i++; //Σε αυτήν την περίπτωση υπάρχουν τόσες αντιστροφές, //όσες του αριθμού των στοιχείων από τη θέση i και δεξιότερα εντός //του αριστερού υποπίνακα else a[k] = right[j]; j++; inversions += left.length i; k++; //Περίπτωση εξάντλησης των στοιχείων του αριστερού υποπίνακα if(i == left.length) while (j < right.length) a[k] = right[j]; j++; k++; //Περίπτωση εξάντλησης των στοιχείων του δεξιού υποπίνακα else while (i < lfl left.length) a[k] = left[i]; i++; k++; return inversions;

Ανάγνωση Αρχείου Εισόδου Χρήση BufferedReader Χρήση συνάρτησης split() Χρήση συνάρτησης parseint() Μέσα σε try/catch block String InputPath = args[0]; BufferedReader FileInput; FileInput = new BufferedReader(new FileReader(InputPath)); String file_text; file_text = FileInput.readLine(); String[] s = file_text.split(" "); mynumbers = new Integer[s.length]; recmergesort = new Integer[s.length]; itermergesort = new Integer[s.length]; for (int i = 0; i< s.length; i++) mynumbers[i] = Integer.parseInt(s[i]); recmergesort[i] = IntegerparseInt(s[i]); Integer.parseInt(s[i]); itermergesort[i] = Integer.parseInt(s[i]);