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

Σχετικά έγγραφα
Δομημένος Προγραμματισμός (ΤΛ1006)

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

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

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

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

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

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

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

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

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

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

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

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

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

i : 0<=i<N-1 => data[i] <= data[i+1] 25/10/2009

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

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

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

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

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

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

Διάλεξη 5η: Εντολές Επανάληψης

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Προγραμματισμός Η/Υ. Αναζήτηση & Ταξινόμηση. ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολόγων Περιβάλλοντος Κατεύθυνση Τεχνολογιών Φυσικού Περιβάλλοντος

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

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

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

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

ΕΞΕΤΑΖΟΜΕΝΟ ΜΑΘΗΜΑ: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ ΣΥΝΟΛΟ ΣΕΛΙΔΩΝ: ΕΞΙ (6)

Προγραμματισμός Η/Υ Ι (Χρήση της C) 6 η Θεωρία ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ

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

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

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

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

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

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

17. Εισαγωγή σε αριθμητικές μεθόδους για μηχανικούς και αλγορίθμους

Ηλεκτρονικοί Υπολογιστές

Ενότητα 3: ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ

Ανάλυση αλγορίθμων. Χρόνος εκτέλεσης: Αναμενόμενη περίπτωση. - απαιτεί γνώση της κατανομής εισόδου

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

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #5

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

Αλγόριθμοι και Δομές Δεδομένων(Θ) Ευάγγελος Γ. Ούτσιος

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

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

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

Ενότητα: Δυαδική Αναζήτηση Σχέδιο Δραστηριότητας: Παιχνίδι: Βρες τον αριθμό

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

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

Πίνακες. Οι πίνακες αποτελούν ένα σηµαντικό δοµηµένο τύπο δεδοµένων (structured data type) ή πιο απλά µία δοµή δεδοµένων (data structure).

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

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

ΠΙ Ν Α Κ Ε Σ (arrays)

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

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής

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

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

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

11/23/2014. Στόχοι. Λογισμικό Υπολογιστή

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

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

Αξιοποίηση Η/Υ και Πληροφορικής στην Μηχανική

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

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

Προγραµµατισµός Ι Εργαστήριο 6ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 6 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

1o Φροντιστήριο ΗΥ240

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

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

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

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

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

Transcript:

Τμήμα Ηλεκτρονικών Μηχανικών Τ.Ε.Ι. Κρήτης Προγραμματισμός Η/Υ (ΤΛ00 ) Δρ. Μηχ. Νικόλαος Πετράκης (npet@chania.teicrete.gr) Ιστοσελίδα Μαθήματος: https://eclass.chania.teicrete.gr/ Εξάμηνο: Εαρινό 01-15

Μέθοδοι ταξινόμησης Συχνά χρειάζεται να διατάξουμε σύνολα αντικειμένων σε μια καθορισμένη σειρά. Η διαδικασία της τοποθέτησης των αντικειμένων σε μια καθορισμένη σειρά ονομάζεται ταξινόμηση (sorting). Σχεδόν πάντα τα αντικείμενα είναι δομές που αποτελούνται από περισσότερα μέλη. Το πεδίο (ή το υποσύνολο των πεδίων) που χρησιμοποιείται για να γίνει η ταξινόμηση των αντικειμένων λέγεται κλειδί (key) της ταξινόμησης. Ταξινομούμε, λοιπόν, τις εγγραφές με τέτοιο τρόπο ώστε τα κλειδιά τους να είναι σε αύξουσα διάταξη, ή σε φθίνουσα διάταξη. Χωρίς να χάνουμε από την γενικότητα, όσο θα μελετάμε τις μεθόδους ταξινόμησης και όχι τις εφαρμογές τους, μπορούμε να χρησιμοποιούμε πολύ απλουστευμένα αντικείμενα, όπως ακέραιους αριθμούς, που είναι κλειδιά του εαυτού τους.

Απ ευθείας επιλογή (sort by selection) Ας υποθέσουμε, ότι θέλουμε να ταξινομήσουμε σε αύξουσα διάταξη μια ακολουθία από 8 ακέραιους, έστω αυτήν που ακολουθεί: 8 5 5 Αρχικά, ανταλλάσσουμε τον μικρότερο από τους ακέραιους με τον πρώτο, και έτσι καταφέραμε να τοποθετήσουμε ήδη το πρώτο στοιχείο στην σωστή θέση. 5 5 8 Στην συνέχεια εφαρμόζουμε την ίδια διαδικασία και στην ακολουθία που αρχίζει από τον δεύτερο μέχρι τον τελευταίο. Επιλέγουμε λοιπόν το και το ανταλλάζουμε με το 5. Μ αυτόν τον τρόπο έχουμε τοποθετήσει τους δύο πρώτους αριθμούς στην σωστή θέση. 5 5 8 Συνεχίζουμε ομοίως μέχρι να τοποθετήσουμε και τον προτελευταίο. Ο τελευταίος θα είναι στην θέση του ούτως ή άλλως. 5 5 8 5 5 8 5 5 8 5 5 8 5 5 8

Απ ευθείας επιλογή (sort by selection) Η συνάρτηση sortbyselection() που ακολουθεί, ταξινομεί σε αύξουσα διάταξη έναν πίνακα ακεραίων υλοποιώντας την μέθοδο που μόλις περιγράψαμε. void sortbyselection(int a[], int n) { int i, j, k, min; for(i=0; i<n-1; i++) { k=i; min=a[k]; for (j=i+1;j<n;j++) if (a[j]<min) { k=j; min=a[k]; a[k]=a[i]; a[i]=min; return;

Μέθοδος φυσαλίδας (bubble sort) Αυτή η μέθοδος ταξινόμησης σαρώνει κατ επανάληψη τον πίνακα από την αρχή προς το τέλος συγκρίνοντας ανά δύο όλα τα στοιχεία που βρίσκονται σε διαδοχικές θέσεις και αν δεν είναι σωστά τοποθετημένα το ένα σε σχέση με το άλλο, τα αντιμεταθέτει. Εάν σε ένα ολόκληρο σάρωμα από την αρχή ως το τέλος δεν χρειαστεί να γίνει καμιά αντιμετάθεση, τερματίζεται η ταξινόμηση διότι έχει ολοκληρωθεί. 5

Μέθοδος φυσαλίδας (bubble sort) Αρχή πίνακα Τέλος πίνακα

Μέθοδος φυσαλίδας (bubble sort) void taxin(proin x[]) { int i, top, top1, tax_ok; Proion h; top= N-1; do { tax_ok = TRUE; for (i=0; i<top ; i++) if (x[i].po<x[i+1].po) { h=x[i]; x[i]=x[i+1]; x[i+1]=h; tax_ok=false; top1=i; top=top1; while (tax_ok==false); return; Συνάρτηση ταξινόμησης των προϊόντων σε φθίνουσα διάταξη ως προς την ποσότητα (συμπληρωματικός κώδικας σε παλιότερο παράδειγμα που είχε γίνει στην τάξη) Στην αρχή του κώδικα θα πρέπει να έχουν δηλωθεί τα συμβολικά ονόματα (ακέραιες σταθερές) FALSE και TRUE, π.χ.: #define FALSE 0 #define TRUE 1

Μέθοδοι Αναζήτησης (Searching) Στόχος των αλγόριθμων αναζήτησης είναι η πιο αποτελεσματική συλλογή πληροφοριών που είναι αποθηκευμένες στην μνήμη ενός Η/Υ. Το πρόβλημα της αναζήτησης, στην πιο γενική του μορφή, αναφέρεται στην αναζήτηση κάποιου στοιχείου ενός συνόλου, που ικανοποιεί μια συνθήκη. 8

Σειριακή αναζήτηση Η πιο απλή μέθοδος αναζήτησης είναι αυτή της σειριακής αναζήτησης (sequential search) όπου συγκρίνονται διαδοχικά τα κλειδιά, των αντικειμένων του συνόλου στο οποίο διενεργείται η αναζήτηση, με το ζητούμενο κλειδί. Η διαδικασία τερματίζεται όταν διαπιστωθεί ότι κάποιο από τα κλειδιά είναι ίσο με το ζητούμενο ή όταν εξετασθούν όλα τα κλειδιά. Η συνάρτηση seqsearch που ακολουθεί υλοποιεί τον παραπάνω αλγόριθμο. Για να απλοποιηθεί η συνθήκη ελέγχου της εντολής επανάληψης ο αλγόριθμος προτείνει την καταχώρηση του κλειδιού μια θέση μετά το τέλος του πίνακα.

Παράδειγμα σειριακής αναζήτησης #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 0 #define L 10 #define K 50 // Μέγεθος πίνακα ακεραίων // Κάτω όριο και // άνω όριο ψευδοτυχαίων τιμών int seqsearch (int *a, int n, int key); Γέμισμα πίνακα με ψευδοτυχαίες ακέραιες τιμές από το 10 έως το 50 και αναζήτηση της τιμής 0. main() { int i,thesh, pin[n+1]; // Μια παραπάνω θέση srand((unsigned)time(null)); for (i=0; i<n; i++) pin[i]= L + rand()%(k-l+1); thesh = seqsearch(pin, N, 0); if (thesh > -1) printf("found at position %d\n\n",thesh); else printf("not FOUND.\n\n"); sestem( PAUSE ); return 0; 10

Παράδειγμα σειριακής αναζήτησης int seqsearch (int *a, int n, int key) { int d=0; a[n]=key; while (a[d]!=key) d++; if (d==n) return -1; // Δεν υπάρχει else return d; // Υπάρχει στην θέση d Όταν συμβαίνουν συχνά ανεπιτυχείς αναζητήσεις είναι προτιμότερο να ταξινομούμε τα κλειδιά και να εφαρμόζουμε έναν τροποποιημένο σειριακό αλγόριθμο αναζήτησης. int seqsearch(int *a, int n, int key) { int d=0; a[n]=int_max; // INT_MAX = 18 while (a[d]<key) // Maximum (signed) int value d++; if (d<n && a[d]==key) return d // Υπάρχει στην θέση d else return -1; // Δεν υπάρχει 11

Πολυπλοκότητα σειριακής αναζήτησης Για τεχνικές σειριακής αναζήτησης ισχύει ότι αν έχουμε n στοιχεία, στην χειρότερη περίπτωση θα εκτελεστούν (n+1) συγκρίσεις, στην μέση περίπτωση έχουμε (n+1)/, και στην καλύτερη έχουμε 1 σύγκριση. Με άλλα λόγια η πολυπλοκότητα της μέσης και της χειρότερης περίπτωσης είναι O(n). Υπάρχουν όμως κι άλλοι αλγόριθμοι που είναι ταχύτεροι (ειδικά για μεγάλο αριθμό στοιχείων), οι οποίοι όμως υποθέτουν ότι το σύνολο των στοιχείων είναι γραμμικώς διατεταγμένο ως προς το κλειδί της αναζήτησης. 1

Δυαδική αναζήτηση (binary search) Η μέθοδος αυτή, η οποία μπορεί να εφαρμοστεί μόνο σε ταξινομημένα κλειδιά, διχοτομεί σε κάθε επανάληψη το μέρος του πίνακα που δεν έχει διερευνηθεί και περιορίζει την αναζήτηση στον μισό πίνακα. Έτσι μετά από lgn διχοτομήσεις στην χειρότερη περίπτωση είτε θα έχουμε εντοπίσει το ζητούμενο κλειδί είτε θα έχουμε καταλήξει ότι το κλειδί αυτό δεν υπάρχει. Επειδή, ο μέγιστος αριθμός συγκρίσεων που απαιτούνται για την αναζήτηση ενός κλειδιού είναι ο λογάριθμος με βάση το του συνολικού αριθμού n των κλειδιών, η διαδικασία αυτή ονομάζεται και λογαριθμική αναζήτηση (logarithmic search). 0 1 n- n-1 bot mid = (bot + top)/ top 1

Παράδειγμα δυαδικής αναζήτησης Η συνάρτηση binsearch που ακολουθεί αποτελεί την υλοποίηση του παραπάνω αλγόριθμου σε μη αναδρομική μορφή. int binsearch(int *a, int n, int key) { int bot, top, mid; bot =0; top = n-1; while (bot <= top) { mid =(bot + top)/; if (key < a[mid]) top = mid - 1; else if (key > a[mid]) bot = mid + 1; else return mid; return -1; 1

Επαναληπτικό παράδειγμα: πίνακες και δείκτες int count_spaces(const char str[]) { int count = 0, i; for (i=0; str[i]!= \0 ; i++) if (str[i] == ) count++; return count; ή ισοδύναμα Συνάρτηση που μετράει τους χαρακτήρες κενού διαστήματος μιας συμβολοσειράς (α) με πίνακα και δείκτη πίνακα και (β) με δείκτη διεύθυνσης και απόσταση. int count_spaces_ptr(const char *str) { int count = 0; for( ; *str!= \0 ; str++) if (*str == ) count++; return count; 15

Επαναληπτικό παράδειγμα: συνένωση συμβολοσειρών char * ΜyStrCat(char *s1, const char *s) { char *p; p = s1; while(*p!= \0 ) p++; while(*s!= \0 ) { *p = *s; p++; s++; *p = \0 ; return s1; 1