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

Σχετικά έγγραφα
i : 0<=i<N-1 => data[i] <= data[i+1] 25/10/2009

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

Ππογπαμμαηιζμόρ Ι (ΗΥ120)

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

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

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

Διαδικασιακός Προγραμματισμός

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

Κεφάλαιο 8.6. Πίνακες ΙI (Διάλεξη 17)

Πληροφορική 2. Αλγόριθμοι

Εργαστήριο 2: Πίνακες

Μεθόδων Επίλυσης Προβλημάτων

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

Στόχοι και αντικείμενο ενότητας. Πέρασμα Πίνακα σε Συνάρτηση (συν.) Πέρασμα Πίνακα σε Συνάρτηση. #8.. Ειδικά Θέματα Αλγορίθμων

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

Προγραμματισμός Η/Υ (ΤΛ2007 )

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

Κεφάλαιο 8.6. Πίνακες ΙI ( ιάλεξη 16) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

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

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

Δομημένος Προγραμματισμός (ΤΛ1006)

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

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

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

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

Διάλεξη 17η: Ταξινόμηση και Αναζήτηση

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

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

Προγραμματισμός Η/Υ. Ενότητα 8: Ειδικά Θέματα Αλγορίθμων

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

Εισαγωγή στην επιστήμη των υπολογιστών. Λογισμικό Υπολογιστών Κεφάλαιο 8ο Αλγόριθμοι

Αλγόριθμοι Ταξινόμησης Bubble Sort Quick Sort. Αντρέας Δημοσθένους Καθηγητής Πληροφορικής Ολυμπιάδα 2012

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

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

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

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

Προβλήματα, αλγόριθμοι, ψευδοκώδικας

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 8 Ο. Ταξινόμηση και Αναζήτηση Συναρτήσεις χειρισμού οθόνης ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

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

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

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

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

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

Ελληνική Δημοκρατία Τεχνολογικό Εκπαιδευτικό Ίδρυμα Ηπείρου. Πληροφορική II. Ενότητα 2 : Αλγόριθμοι. Δρ. Γκόγκος Χρήστος

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

3 ΑΝΑ ΡΟΜΗ ΑΝΑΖΗΤΗΣΗ - ΤΑΞΙΝΟΜΗΣΗ. n! = 1*2*3*..(n-1)*n. n! = 1 αν n = 0, = n*(n-1)! αν n > ΑΝΑ ΡΟΜΗ Εισαγωγή

ΘΕΜΑ Α ΑΡΧΗ 1ΗΣ ΣΕΛΙΔΑΣ

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 }

Εισαγωγή στον δομημένο προγραμματισμό

Αλγόριθμοι Αναζήτησης. (AeppAcademy.com)

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

Outline. 6 Edit Distance

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

Επαναληπτικές Διαδικασίες

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

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

Διάλεξη 12: Λίστες Υλοποίηση & Εφαρμογές. Διδάσκων: Παναγιώτης Ανδρέου

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

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

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

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

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

Ταξινόμηση. Ταξινόμηση ευθείας ανταλλαγής (Φυσαλίδα) 1) Να ταξινομηθεί ο πίνακας Α[Ν] σε αύξουσα σειρά με τη μέθοδο της φυσαλίδας.

Διασυνδεδεμένες Δομές. Λίστες. Προγραμματισμός II 1

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

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

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

Εισαγωγή στον Προγραμματισμό

ΠΛΗΡΟΦΟΡΙΑΚΑ & ΤΗΛΕΠΙΚΟΙΝΩΝΙΑΚΑ ΣΥΣΤΗΜΑΤΑ

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

Εργαστήριο 6: Αναζήτηση, Ανάλυση Πολυπλοκότητας

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

4. ΒΡΟΧΟΙ ΕΠΑΝΑΛΗΨΗΣ (Α' μέρος: for)

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

2ο ΓΕΛ ΑΓ.ΔΗΜΗΤΡΙΟΥ ΑΕΠΠ ΘΕΟΔΟΣΙΟΥ ΔΙΟΝ ΠΡΟΣΟΧΗ ΣΤΑ ΠΑΡΑΚΑΤΩ

ιαφάνειες παρουσίασης #4

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

Πανεπιστήμιο Ιωαννίνων Τμήμα Πληροφορικής Δομές Δεδομένων [ΠΛΥ302] Χειμερινό Εξάμηνο 2012

242 -ΕισαγωγήστουςΗ/Υ

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

Ελαφρύτερος και βαρύτερος Αλγόριθμοι ταξινόμησης

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

Εντολές Επανάληψης. int sum = 0, i=1; sum += i++ ; sum += i++ ; Η πράξη αυτή θα πρέπει να επαναληφθεί Ν φορές!

Δείκτες & Πίνακες Δείκτες, Πίνακες

ΗΥ-150. Ταξινόµηση και Αναζήτηση

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

Σημειώσεις δεύτερης εβδομάδας

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

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

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

ΠΛΗΡΟΦΟΡΙΚΗ Ι Ενότητα 8: Αναζήτηση και ταξινόμηση

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

Πίνακες. Ι.Ε.Κ ΓΛΥΦΑΔΑΣ Τεχνικός Τεχνολογίας Internet Αλγοριθμική Ι (Ε) Σχολ. Ετος A Εξάμηνο

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

Πανεπιστήμιο Ιωαννίνων Τμήμα Μηχανικών Η/Υ και Πληροφορικής Δομές Δεδομένων [ΠΛΥ302] Χειμερινό Εξάμηνο 2013

ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: Πέµπτη 17/12/2015, 22:00

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

Διαδικασιακός Προγραμματισμός

Δομές Δεδομένων. Τι είναι η δομή δεδομένων; Έστω η ακολουθία αριθμών: 8, 10,17,19,22,5,12 Λογικό Επίπεδο. Φυσικό Επίπεδο RAM. Ταξινομημένος.

Transcript:

Προγραμματισμός Ι (ΗΥ120) Διάλεξη 10: Ταξινόμηση Πίνακα Αναζήτηση σε Ταξινομημένο Πίνακα

Πρόβλημα Δίνεται πίνακας t από Ν ακεραίους. Ζητούμενο: να ταξινομηθούν τα περιεχόμενα του πίνακα σε αύξουσα αριθμητική σειρά: i : 0<=i<N-1 => data[i] <= data[i+1] Μια λύση (ταξινόμηση επιλογής selection sort): Αρχίζοντας από το 1ο στοιχείο και φτάνοντας μέχρι το Νο στοιχείο του πίνακα, βρίσκουμε το στοιχείο με την μικρότερη τιμή και ανταλλάσσουμε την τιμή του με την τιμή του 1ου στοιχείου. Επαναλαμβάνουμε τη διαδικασία, αρχίζοντας από το 2ο στοιχείο, μετά αρχίζοντας από το 3ο στοιχείο κλπ μέχρι και το Ν-1ο στοιχείο. 2

i 3 data ταξινομημένα στοιχεία περιοχή που δεν έχει ταξινομηθεί ακόμα θέση όπου θα αποθηκευτεί η μικρότερη τιμή που θα βρεθεί στα data[i] data[n-1]

/* ταξινόμηση πίνακα */ int data[n]; /* πίνακας με Ν ακεραίους */ int i,j; /* μετρητές βρόγχων */ int min; /* θέση τοποθέτησης μικρότερου στοιχείου */ int tmp; /* βοηθητική μεταβλητή για ανταλλαγή θέσης */ 4 /* αρχικοποίηση πίνακα t με στοιχεία */ for (i=0; i<n; i++) { min = i; for (j=i+1; j<n; j++) { if (data[j] < data[min]) { min = j; if (min!= i) { tmp = data[i]; data[i] = data[min]; data[min] = tmp; Ανταλλαγή τιμών 2 μεταβλητών (swap)

Insertion Sort: Ιδέα 5 Ιδέα: Εξετάζουμε τους ακεραίους έναν-ένα. Κάθε νέο ακέραιο που εξετάζουμε τον βάζουμε στη "σωστή" θέση ανάμεσα στους ακεραίους που έχουμε ήδη εξετάσει. Σχήμα από το βιβλίο: "Computer Science: A Structured Approach Using C" by Behrouz Richard F. Gilberg

Insertion Sort: Βήματα 6 Σε κάθε βήμα: Παίρνουμε το πρώτο μη-ταξινομημένο στοιχείο και βρίσκουμε σε ποια θέση πρέπει να μπει στο ταξινομημένο κομμάτι. Αν χρειαστεί, μετακινούμε τα ταξινομημένα στοιχεία για να ανοίξει χώρος. Ο τοίχος μετακινείται μια θέση δεξιά. Συνεχίζουμε με τον ίδιο τρόπο μέχρι ο τοίχος να φτάσει στην άκρη και να έχουν ταξινομηθεί όλα τα στοιχεία.

Insertion Sort: Παράδειγμα 7 Σχήμα από το βιβλίο: "Computer Science: A Structured Approach Using C" by Behrouz Richard F. Gilberg

Insertion Sort: Παρατηρήσεις Όταν ψάχνουμε την κατάλληλη θέση για τον αριθμό που ήταν δεξιά από τον τοίχο, προσέχουμε να σταματήσουμε στην άκρη του πίνακα και να μη βγούμε εκτός ορίων (παράδειγμα: η εισαγωγή του αριθμού 8) Αν ο αριθμός που θέλουμε να τοποθετήσουμε είναι μεγαλύτερος του πρώτου αριθμού που βρίσκεται αριστερά από τον τοίχο, τότε δε χρειάζεται να κάνουμε μετακινήσεις. Αυτό σημαίνει, πως αν ο πίνακας τύχει να είναι ήδη ταξινομημένος, τότε ο αλγόριθμος αυτός απλά θα κάνει μια διάτρεξη του πίνακα χωρίς αλλαγές. Ανάμεσα στους απλούς, μη-αναδρομικούς αλγόριθμους ταξινόμησης (πχ bubblesort, selection sort, insertion sort), ο insertion sort είναι ο πιο γρήγορος. Ανάμεσα σε όλους του αλγορίθμους ταξινόμησης που βασίζονται σε συγκρίσεις στοιχείων, ο insertion sort είναι πιο γρήγορος αν το πλήθος των στοιχείων που ταξινομούμε είναι μικρό (πχ μερικές δεκάδες) 8

Insertion Sort: Κώδικας 9 void insertionsort ( int nums[], int size) { int wall, numtosort; for (wall=1; wall<size; wall++) { numtosort = nums[wall]; /* πρώτο μη-ταξινομημένο */ /* βάλε το στο ταξινομημένο κομμάτι */

Insertion Sort: Κώδικας 10 void insertionsort ( int nums[], int size) { int wall, numtosort, j; for (wall=1; wall<size; wall++) { numtosort = nums[wall]; /* πρώτο μη-ταξινομημένο */ j = wall-1; while (j >= 0 && nums[j] > numtosort) { /* όσο δεν έχουμε φτάσει στην άκρη και είναι μεγαλύτερα τα στοιχεία, */ nums[j+1] = nums[j]; /* κάνε χώρο */ j--; /* στη θέση j+1 βρίσκεται η θέση που ανοίξαμε */ nums[j+1] = numtosort;

Πρόβλημα Δίνεται πίνακας t από Ν ακεραίους, τα περιεχόμενα του οποίου είναι ταξινομημένα. Ζητούμενο: Να βρεθεί η θέση όπου έχει αποθηκευθεί μια τιμή στον πίνακα (εφόσον υπάρχει) Δηλαδή για μια τιμή v, να βρεθεί η τιμή i: i!=ν => t[i]==v i=n => j : 0<=j<N : t[j]!=v Εξετάζουμε δύο «κλασικές» λύσεις ακολουθιακή αναζήτηση δυαδική αναζήτηση (με διχοτόμηση) 11

Σειριακή αναζήτηση Αρχίζουμε από το πρώτο στοιχείο του πίνακα data[pos], pos=0, που έχει (εξ ορισμού) την μικρότερη τιμή και εκτελούμε σε βρόχο τις εντολές 2 έως 5. Αν pos==n, δηλαδή ο πίνακας δεν έχει στοιχείο data[pos], τότε τελειώσαμε (δεν υπάρχει στοιχείο με τιμή val). Διαφορετικά, αν data[pos]==val, τότε τελειώσαμε (αφού βρήκαμε το στοιχείο με τιμή val). Διαφορετικά, αν data[pos]>val, τότε πάλι τελειώσαμε (είναι σίγουρο ότι δεν υπάρχει στοιχείο με τιμή val). Διαφορετικά, (ισχύει data[pos]<val), τότε επαναλαμβάνουμε την διαδικασία από το 2 για το επόμενο στοιχείο (pos=pos+1). 12 Χρειάζονται κατά μέσο όρο «τάξη μεγέθους» Ν/2 βήματα σύγκρισης.

0 pos Ν-1 13 data περιοχή πίνακα που έχει ήδη ελεγχθεί: 0<=j<pos:data[j]<val στοιχεία προς έλεγχο επόμενο στοιχείο προς έλεγχο

/* σειριακή αναζήτηση σε ταξινομημένο πίνακα */ int data[n]; /* πίνακας με Ν ακεραίους */ int pos; /* τρέχουσα θέση */ int val; /* τιμή στοιχείου που αναζητούμε */ 14... /* αρχικοποίηση & ταξινόμηση πίνακα data */ for (pos=0; pos<n; pos++) { if (data[pos] >= val) { break; if (pos == N) { printf("not found\n"); else { if (data[pos]!= val) { printf("not found\n"); else { printf("found at position %d\n", pos);

/* σειριακή αναζήτηση σε ταξινομημένο πίνακα */ int data[n]; /* πίνακας με Ν ακεραίους */ int pos; /* μεταβλητή βρόγχου */ int val; /* τιμή στοιχείου που αναζητούμε */ 15... /* αρχικοποίηση & ταξινόμηση πίνακα t */ for (pos=0; (pos<n) && (data[pos]<val); pos++) { if (pos == N) { printf("not found\n"); else if (data[pos]!= val) { η σύμβαση εκτέλεσης του && εγγυάται printf("not found\n"); ότι δεν θα επιχειρηθεί πρόσβαση t[i] όταν το i φτάσει το όριο Ν του πίνακα else { printf("found at position %d\n", pos);

Δυαδική αναζήτηση Θέτουμε τα όρια αναζήτησης beg=0 και end=n-1. Αρχίζουμε από το μεσαίο στοιχείο του πίνακα t[m], όπου m = (beg+end)/2. Αν t[m] == v, τελειώσαμε. Αν t[m] < v, συνεχίζουμε με τον (μισό) υποπίνακα που έχει στοιχεία με μεγαλύτερες τιμές του t[m] δηλαδή θέτουμε beg = m+1 (και πίσω στο 2). Αλλιώς (t[m] > v), συνεχίζουμε με τον (μισό) υποπίνακα που έχει στοιχεία με μικρότερες τιμές του t[m] δηλαδή θέτουμε end = m-1 (και πίσω στο 2). Αν beg > end τελειώσαμε (η τιμή v δεν υπάρχει). Χρειάζονται «τάξη μεγέθους» log 2 N βήματα. 16

0 beg m end Ν-1 17 data περιοχή που έχει αποκλεισθεί : 0<=i<beg: data[i]<val περιοχή προς έλεγχο επόμενο στοιχείο προς έλεγχο περιοχή που έχει αποκλεισθεί : end<=i<n: data[i]>val

/* δυαδική αναζήτηση σε ταξινομημένο πίνακα */ int data[n]; /* πίνακας με Ν ακεραίους */ int beg,end; /* όρια αναζήτησης [beg,end) */ int m; /* θέση μεσαίου στοιχείου */ int val; /* τιμή στοιχείου που αναζητούμε */ 18... /* αρχικοποίηση & ταξινόμηση πίνακα t */ beg = 0; end = N-1; while (beg <= end) { m = (beg+end)/2; if (data[m] == val) { break; else { if (data[m] < val) { beg = m+1; /* (data[m] > val) */ else { end = m-1; if (beg > end) { printf("not found\n"); else { printf("found at position %d\n", m);

Σύγκριση 19 # στοιχείων μ.ο βημάτων μέγιστα βήματα πίνακα σειριακής αναζ. δυαδικής αναζ. Ν Ν/2 log N 100 50 7 1.000 500 10 1.000.000 500.000 20 1.000.000.000 500.000.000 30 Η διαφορά γίνεται τεράστια για μεγάλες τιμές του Ν.