4.1 Αναζήτηση. Εισαγωγή στη C++

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

Γ7.2 Συμβολοσειρές (Strings) Γ Λυκείου Κατεύθυνσης

Γ7.8 Εγγραφές (Structures) Γ Λυκείου Κατεύθυνσης

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

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

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

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

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

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

Παίρνοντας Αποφάσεις 1

Συναρτήσεις (Functions) Εισαγωγή στη C++

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

Χωρική Βάση δεδοµένων Autocad

Δομές Επανάληψης. Εισαγωγή στη C++

ΥΠΟΥΡΓΕΙΟ ΠΑΙΔΕΙΑΣ ΚΑΙ ΠΟΛΙΤΙΣΜΟΥ ΥΠΗΡΕΣΙΑ ΕΞΕΤΑΣΕΩΝ ΠΑΓΚΥΠΡΙΕΣ ΕΞΕΤΑΣΕΙΣ 2018 ΤΟ ΕΞΕΤΑΣΤΙΚΟ ΔΟΚΙΜΙΟ ΑΠΟΤΕΛΕΙΤΑΙ ΑΠΟ ΔΕΚΑΤΡΕΙΣ (13) ΣΕΛΙΔΕΣ.

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

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

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

Εντολές εισόδου - εξόδου. Εισαγωγή στη C++

Πίνακες (Arrays) Εισαγωγή στη C++

Δομές δεδομένων (Structures) Εισαγωγή στη C++

Ακρότατα πίνακα, χωρίς min, max, μόνο με pos

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

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

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

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

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

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

ΘΕΜΑ Α ΦΑΣΗΣ. Υπολογιστικά Νέφη Ενδεικτικές Απαντήσεις

Προγραμματισμός Υπολογιστών με C++

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

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

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

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

Αναζήτηση. Στην λειτουργία της αναζήτησης εξακριβώνεται η παρουσία ή η απουσία ενός δεδομένου σε μια δομή δεδομένων.

Εισαγωγή στη γλώσσα προγραμματισμού C++

Ερώτημα Α 1. Να γράψετε τις εντολές που πραγματοποιούν τα ακόλουθα:

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

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

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

ΣΤΟΙΧΕΙΑ ΤΗΣ ΓΛΩΣΣΑΣ C++ Constructors, Destructors, Pointers IO Streams, File Streams

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

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

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

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

Α2. Να γράψετε στο τετράδιο σας τον αριθμό 1-4 κάθε πρότασης και δίπλα το γράμμα που δίνει τη σωστή επιλογή.

Μονοδιάστατοι πίνακες

Γ7.1 Επανάληψη ύλης Β Λυκείου. Γ Λυκείου Κατεύθυνσης

Δισδιάστατοι Πίνακες (2D Arrays) Εισαγωγή στη C++

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

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

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

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

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

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

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

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

1. Δεν μπορεί να γίνει κλήση μίας διαδικασίας μέσα από μία συνάρτηση.

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

Εντολή Επίλεξε.. Στοίβα & Ουρά Διαίρει & Βασίλευε

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

Α1. Στον προγραµµατισµό χρησιµοποιούνται δοµές δεδοµένων. 1. Τι είναι δυναµική δοµή δεδοµένων; Μονάδες 3 2. Τι είναι στατική δοµή δεδοµένων;

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

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

Το πρόγραμμα θα τυπώνει και τους τρεις πίνακες.

δυαδική αναζήτηση Παύλος Σ. Εφραιμίδης

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

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

ΘΕΜΑ Α. 1. Η δυαδική αναζήτηση χρησιμοποιείται μόνο σε ταξινομημένες συλλογές δεδομένων.

Τεχνικές και Αλγόριθμοι Ταξινόμησης

Προτεινόμενος τρόπος διδασκαλίας του μαθήματος με ενδεικτικό χρονοπρογραμματισμό. Α/Α Ενότητες Περιγραφή Ώρες 1 Εισαγωγικό μάθημα 1

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

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

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

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

Επανάληψη για τις Τελικές εξετάσεις. (Διάλεξη 24) ΕΠΛ 032: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕΘΟΔΩΝ ΕΠΙΛΥΣΗΣ ΠΡΟΒΛΗΜΑΤΩΝ

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

24ος ΠΑΝΕΛΛΗΝΙΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ

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

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

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

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

Αρχεία & Ρεύματα ΑΡΧΕΙΑ & ΡΕΥΜΑΤΑ. Γεώργιος Παπαϊωάννου ( ) gepap@aueb.gr

Παράδειγμα Να γράψετε πρόγραμμα που θα υπολογίζει με τη βοήθεια συναρτήσεων τον n-οστό όρο της αναδρομικής ακολουθίας x n =(n-4)!x n-1 +(n-3)!

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΕΠΛ 035: οµές εδοµένων και Αλγόριθµοι για Ηλεκτρολόγους Μηχανικούς και Μηχανικούς Υπολογιστών

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

Μάντεψε τον Αριθμό. Έχω Ένα Μυστικό. Το Βρήκα;

ΑΡΧΗ 1ΗΣ ΣΕΛΙΔΑΣ Δ ΕΣΠΕΡΙΝΩΝ

ΛΥΣΕΙΣ ΘΕΜΑΤΩΝ ΤΕΛΙΚΗΣ ΦΑΣΗΣ Οι παρακάτω λύσεις είναι απολύτως ενδεικτικές

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


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

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

ΟΜΟΣΠΟΝΔΙΑ ΕΚΠΑΙΔΕΥΤΙΚΩΝ ΦΡΟΝΤΙΣΤΩΝ ΕΛΛΑΔΟΣ (Ο.Ε.Φ.Ε.) ΕΠΑΝΑΛΗΠΤΙΚΑ ΘΕΜΑΤΑ ΕΠΑΝΑΛΗΠΤΙΚΑ ΘΕΜΑΤΑ 2019 Β ΦΑΣΗ

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

Δοµές Δεδοµένων. 6η Διάλεξη Αναδροµικές Εξισώσεις και Αφηρηµένοι Τύποι Δεδοµένων. Ε. Μαρκάκης

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

ΕΛΛΗΝΙΚΗ ΕΤΑΙΡΕΙΑ ΕΠΙΣΤΗΜΟΝΩΝ ΚΑΙ ΕΠΑΓΓΕΛΜΑΤΙΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΕΠΙΚΟΙΝΩΝΙΩΝ ΜΕΛΟΣ IFIP, IOI

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

Transcript:

4.1 Αναζήτηση Εισαγωγή στη C++

Εισαγωγή Με την αναζήτηση εξετάζουμε το ενδεχόμενο ύπαρξης μιας συγκεκριμένης τιμής μέσα σε μία συλλογή δεδομένων (π.χ. πίνακας) Υπάρχουν διάφορες τεχνικές αναζήτησης που διαφέρουν σε δυσκολία υλοποίησης και χρόνο εκτέλεσης. Θα εξετάσουμε τη σειριακή και τη δυαδική αναζήτηση

Σειριακή Αναζήτηση Εύκολη στην υλοποίηση Ο χρόνος εκτέλεσης του αλγόριθμου είναι γραμμικός Ο(Ν) Περιγραφή αλγόριθμου Ξεκινούμε από το 1 ο στοιχείο της συλλογής δεδομένων και συγκρίνουμε το στοιχείο αναζήτησης με κάθε στοιχείο της συλλογής, μέχρι να βρούμε το στοιχείο που ψάχνουμε ή μέχρι να εξαντλήσουμε όλα τα στοιχεία της συλλογής

Υλοποίηση Συνάρτησης bool find_key(int A[],int key,int N){ int i=0; bool flag=false; while(i<n &&!flag){ if(a[i]==key) flag=true; i++; return flag;

Παράδειγμα 1 Να δημιουργήσετε το πρόγραμμα που διαβάζει τον αριθμό μητρώου και το βαθμό για 100 μαθητές από το αρχείο in.txt. Στη συνέχεια διαβάζει από το πληκτρολόγιο τον αριθμό μητρώου ενός μαθητή και αν ο μαθητής υπάρχει στο αρχείο τότε τυπώνει στην οθόνη τον βαθμό του, διαφορετικά τυπώνει «Not Found»

Παράδειγμα 1 int main(){ #include<iostream> ifstream fin("in.txt"); #include<fstream> int students[n][2]; #define N 100 int i,t,am; using namespace std; for(i=0;i<n;i++) fin>>students[i][0]>>students[i][1]; int find_key(int A[][2],int key){ cin>>am; int i=0,pos=-1; t=find_key(students,am); if(t==-1) while(i<n && pos==-1){ cout<<"not found"<<endl; if(a[i][0]==key) else pos=i; cout<<students[t][1]<<endl; i++; fin.close(); return pos; return 0;

Παράδειγμα 2 Το ΥΠΠ έχει καταγεγραμμένα τα στοιχεία (κωδικός, όνομα, τηλέφωνο, διεύθυνση) των σχολείων στο αρχείο schools.txt. Υπάρχουν το πολύ 200 σχολεία. Να γράψετε το πρόγραμμα που δέχεται τον κωδικό ενός σχολείου και τυπώνει στην οθόνη τα στοιχεία του. Σε περίπτωση που το σχολείο δεν υπάρχει τότε τυπώνει «Not found»

Παράδειγμα 2 #include<fstream> #include<iostream> #include<string> using namespace std; struct school{ int code; string st[3]; ; while(!fin.eof()){ fin>>sc[i].code; for(int j=0;j<3;j++){ fin>>sc[i].st[j]; i++; int find_sc(school sc[],int key,int N){ int pos=-1,i=0; while(i<n && pos==-1){ if(sc[i].code==key) pos=i; i++; return pos; int main(){ school sc[200]; int i=0,key,t; ifstream fin("schools.txt"); cin>>key; t=find_sc(sc,key,i); if(t==-1) cout<<"not found"<<endl; else{ cout<<sc[t].code<<endl; for(int j=0;j<3;j++) cout<<sc[t].st[j]<<endl; fin.close(); return 0;

Δυαδική Αναζήτηση (Binary Search) Η δυαδική αναζήτηση ανήκει στην κατηγορία προβλημάτων «Διαίρει και Βασίλευε» (Divide and Conquer) Είναι μία τεχνική για σχεδίαση αλγορίθμων που βασίζονται στη διάσπαση της προς επίλυση περίπτωσης σε μικρότερες υποπεριπτώσεις του ίδιου προβλήματος, στη διαδοχική και ανεξάρτητη επίλυση αυτών και στο συνδυασμό των επί μέρους λύσεων με τέτοιο τρόπο, ώστε να σχηματισθεί η λύση της αρχικής περίπτωσης.

Δυαδική Αναζήτηση (Binary Search) Στην απλούστερη μορφή της χρησιμοποιείται για να βρούμε γρήγορα μια τιμή σε έναν ταξινομημένο πίνακα Έστω ότι έχουμε ένα πίνακα μεγέθους Ν. Επιλέγουμε να ξεκινήσουμε την αναζήτηση μας από τη μέση του πίνακα. Αν δεν έχουμε πετύχει το στόχο τότε συγκρίνουμε το μεσαίο στοιχείο (Μ) με το στοιχείο που ψάχνουμε(s). Αν S<Μ τότε χρειάζεται να ψάξουμε στα στοιχεία 1 μέχρι Μ-1 Διαφορετικά θα ψάξουμε στα στοιχεία Μ+1 μέχρι Ν-1. Επαναλαμβάνουμε τα ίδια βήματα μέχρι να πετύχουμε τον στόχο μας. Έχει καλύτερο χρόνο εκτέλεσης από τη σειριακή αναζήτηση με πολυπλοκότητα log 2 N

Γραφική Απεικόνιση Έστω ότι ελέγχουμε για την ύπαρξη της τιμής 84 στον πίνακα. first middle last first middle last middle last first

Υλοποίηση Συνάρτησης bool binary_s(int A[],int key){ int first,last,middle; bool flag=false; first=0; last=n-1; while(!flag && first<=last){ middle=(first+last)/2; if(a[middle]==key){ flag=true; else if(a[middle]>key) last=middle-1; else first=middle+1; return flag;

Παράδειγμα 3 Στο αρχείο customers.txt υπάρχουν τα στοιχεία το πολύ 50,000 πελατών. Για κάθε πελάτη υπάρχουν καταχωρημένα ο αριθμός ταυτότητας, το ονοματεπώνυμο και το email. Να γράψετε το πρόγραμμα που διαβάζει τα στοιχεία και τα καταχωρεί σε έναν πίνακα και χρησιμοποιεί τη συνάρτηση find_cust για να βρει τα στοιχεία ενός πελάτη. Σε ένα αρχείο search.txt υπάρχουν οι αριθμοί ταυτότητας για τους πελάτες που ψάχνουμε. Τα στοιχεία για κάθε πελάτη που ψάχνουμε θα καταχωρούνται στο αρχείο out.txt Αν δεν υπάρχει πελάτης θα καταχωρείται ο αριθμός ταυτότητας και δίπλα το μήνυμα «Customer not found» Σημείωση: Τα στοιχεία για τον κάθε πελάτη είναι το ένα κάτω από το άλλο. Παράδειγμα 99999 John Smith smith@email.com

Παράδειγμα 3 #include<iostream> #include<fstream> #include<string> #define N 50000 using namespace std; struct customers{ ; string id; string onoma; string email; int binary_s(customers A[],string key, int n){ int first,last,middle; int pos=-1; first=0; last=n-1; while(pos==-1 && first<=last){ middle=(first+last)/2; if(a[middle].id == key){ pos=middle; else if(a[middle].id > key) last=middle-1; else first=middle+1; return pos;

Παράδειγμα 3 int main(){ while(!fsearch.eof()){ fsearch>>key; customers cust[n]; string key; int i=0,index; ifstream fcust("customers.txt"); ifstream fsearch("search.txt"); ofstream out("out.txt"); while(!fcust.eof()){ fcust >>cust[i].id; fcust >> cust[i].onoma; fcust >>cust[i].email; i++; index=binary_s(cust,key,i); if(index==-1) out<<key<<" Customer not found"<<endl; else out<<cust[index].id<<" "<<cust[index].onoma<<" "<<cust[index].email<<endl; return 0;