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

Σχετικά έγγραφα
Προγραμματισμός Ι (ΗΥ120)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Πρόβληµα : Πώς θα λύναµε αυτό το πρόβληµα αν είχαµε µόνο χαρτί και µολύβι, και κάποιος µας έλεγε τους αριθµούς προφορικά?

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

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

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

ΕΝΟΤΗΤΑ 6 ΛΙΣΤΕΣ ΠΑΡΑΛΕΙΨΗΣ (SKIP LISTS)

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

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

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

Αλγόριθµοι Τύπου Μείωσης Προβλήµατος

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

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

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

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

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

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

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

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

Δοµές Δεδοµένων. 16η Διάλεξη Κατακερµατισµός. Ε. Μαρκάκης

Οργάνωση αρχείων: πως είναι τοποθετηµένες οι εγγραφές ενός αρχείου όταν αποθηκεύονται στο δίσκο

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

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

Ελληνική Δημοκρατία Τεχνολογικό Εκπαιδευτικό Ίδρυμα Ηπείρου. Προγραμματισμός Ι. Ενότητα 8 : Πίνακες IΙ. Αλέξανδρος Τζάλλας

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

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

Heapsort Using Multiple Heaps

p

διεύθυνση πρώτου στοιχείου διεύθυνση i-οστού στοιχείου T t[n]; &t[0] είναι t &t[i] είναι t + i*sizeof(t)

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

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Εξωτερική Αναζήτηση και Β-δέντρα Κεφάλαιο 16. Ε. Μαρκάκης Επίκουρος Καθηγητής

Η εφαρµογή xsortlab. Οπτικός τρόπος ταξινόµησης

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

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 }

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

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

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Αρχές Ανάλυσης Αλγορίθµων Κεφάλαιο 2. Ε. Μαρκάκης Επικ. Καθηγητής

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

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

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

Δοµές Δεδοµένων. 18η Διάλεξη Ισορροπηµένα δέντρα. Ε. Μαρκάκης

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

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

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

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

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

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

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

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

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

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

ΠΛΗΡΟΦΟΡΙΚΗ Ι (MATLAB) Ενότητα 5

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

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

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

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

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

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

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

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

Επαναληπτικές δοµές. µτ α.τ. Όχι. ! απαγορεύεται µέσα σε µία ΓΙΑ να µεταβάλλουµε τον µετρητή! διότι δεν θα ξέρουµε µετά πόσες επαναλήψεις θα γίνουν

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

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

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

ΚΕΦΑΛΑΙΟ 5: Αλγόριθµοι

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

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

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

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

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Πίνακες Συµβόλων Κεφάλαιο 12 ( ) Ε. Μαρκάκης Επίκουρος Καθηγητής

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

υναµική έσµευση Μνήµης (συν.) ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 Εφαρµογή

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

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

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

Transcript:

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

Ταξινόµηση! Δεδοµένα: Δίνεται ένας πίνακας data από N ακεραίους! Ζητούµενο: Να ταξινοµηθούν τα περιεχόµενα σε αύξουσα αριθµητική σειρά:!i : 0 <= i < N-1 => data[i] <= data[i+1]! Πώς θα κάνατε ταξινόµηση στην πράξη? Ένα πακέτο από γραπτά ανά βαθµό Ένα πακέτο από γραπτά ανά όνοµα (έχει διαφορά?) Βιβλία σε ένα ράφι (ως προς τι?) Συναλλαγές ΑΤΜ ανά αριθµό λογαριασµού (χωρίς να αλλάξει η χρονολογική σειρά! [stability] ) 2

Ιδέες! Insertion sort: Κράτα χωριστά τους ταξινοµηµένους από τους µη. Πάρε τον επόµενο µη-ταξινοµηµένο αριθµό, βρες τη σωστή του θέση στους ταξινοµηµένους και βάλε τον εκεί! Selection sort: Κράτα χωριστά τους ταξινοµηµένους από τους µη. Πάρε τον µικρότερο µη-ταξινοµηµένο αριθµό και βάλε τον στην επόµενη ελεύθερη θέση στους ταξινοµηµένους 3

Ιδέες! Bucket sort: Φτιάξε µικρότερα πακέτα γραπτών ως προς την ιδιότητα ταξινόµησης, ταξινόµησε κάθε πακέτο χωριστά και ένωσέ τα. πχ. πακέτο από Α, πακέτο από Β, κ.ο.κ.! Counting sort: Μέτρα όλα τα γραπτά που έχουν βαθµό 0, 1,... 10. Πάρε τα ένα-ένα και βάλε τα κατευθείαν στη σωστή θέση µε βάση το βαθµό τους και πόσοι βαθµοί προηγούνται [δε χρειάζεται καν σύγκριση!] πχ. αν ξέρουµε ότι υπάρχουν 8 γραπτά µε 0, τότε το πρώτο γραπτό µε 1 θα πάει στην 9η θέση.! Και πολλές άλλες. Θα καλύψουµε selection και insertion sort. 4

Πώς διαλέγουµε?! Πόσο γρήγοροι είναι (πχ. σε αριθµό συγκρίσεων) Για πολλά ή για λίγα δεδοµένα Για δεδοµένα που πιθανώς είναι ήδη σε σχετικά καλή διάταξη! Πόση επιπλέον µνήµη χρησιµοποιούν! Κάποιοι αλγόριθµοι εκµεταλλεύονται συγκεκριµένες ιδιότητες των δεδοµένων! Περισσότερα σε µαθήµατα Δοµών Δεδοµένων και Αλγορίθµων 5

Insertion sort: Ιδέα! Φανταστείτε ένα νοητό τοίχο που χωρίζει τον πίνακα σε δύο µέρη: ταξινοµηµένο και µη-ταξινοµηµένο! Το ταξινοµηµένο τµήµα είναι αρχικά άδειο! Διαλέξτε τον πρώτο ακέραιο από το µη-ταξινοµηµένο τµήµα και εισάγετέ τον στη σωστή θέση στο ταξινοµηµένο τµήµα. Ίσως χρειαστεί να µετακινήσετε τους άλλους ακεραίους στο ταξινοµηµένο τµήµα για να κάνετε χώρο για τον καινούργιο. Ο νοητός τοίχος µετακινείται µια θέση δεξιά! Επαναλάβετε µέχρι να ταξινοµηθεί όλος ο πίνακας! youtube 6

Insertion sort: Ιδέα Επόµενο στοιχείο προς ταξινόµηση 0 N-1 Τοίχος Ταξινοµηµένο τµήµα Μη-ταξινοµηµένο τµήµα Σχήµα προσαρµοσµένο από το βιβλίο: "Computer Science: A Structured Approach Using C" by Behrouz A. Forouzan, Richard F. Gilberg 7

Insertion sort: Παράδειγµα Ο πίνακας στην αρχή: 6 3 5 8 2 7 υποψήφιος για ταξινόµηση: 3 Μετά από το πέρασµα 1: Μετά από το πέρασµα 2: 3 3 6 5 8 2 7 υποψήφιος για ταξινόµηση: 5 5 6 8 2 7 υποψήφιος για ταξινόµηση: 8 Σχήµα προσαρµοσµένο από το βιβλίο: "Computer Science: A Structured Approach Using C" by Behrouz A. Forouzan, Richard F. Gilberg 8

Insertion sort: Παράδειγµα Μετά από το πέρασµα 3: 3 5 6 8 2 7 υποψήφιος για ταξινόµηση: 2 Μετά από το πέρασµα 4: Μετά από το πέρασµα 5: 2 2 3 5 6 8 7 υποψήφιος για ταξινόµηση: 7 3 5 6 7 8 Τέλος! Σχήµα προσαρµοσµένο από το βιβλίο: "Computer Science: A Structured Approach Using C" by Behrouz A. Forouzan, Richard F. Gilberg 9

Insertion sort: Παράδειγµα Μετά από το πέρασµα 3: 3 5 6 8 2 7 υποψήφιος για ταξινόµηση: 2 Πώς κάνουµε χώρο? - Αφού συγκρίνουµε το 2 µε 3, 5, 6, 8 ανακαλύπτουµε ότι η σωστή του τελική θέση είναι η 0. - Πρέπει τα στοιχεία από τη θέση 0 µέχρι και τη θέση 3 να πάνε από µια θέση δεξιά. Προσοχή: Πριν κάνουµε τη µετακίνηση, "σώζουµε" το 2 γιατί θα σβηστεί. - Μετά, µπορούµε να βάλουµε το 2 στη θέση 0. Σχήµα προσαρµοσµένο από το βιβλίο: "Computer Science: A Structured Approach Using C" by Behrouz A. Forouzan, Richard F. Gilberg 10

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

Selection sort: Ιδέα! Φανταστείτε ένα νοητό τοίχο που χωρίζει τον πίνακα σε δύο µέρη: ταξινοµηµένο και µη-ταξινοµηµένο! Το ταξινοµηµένο τµήµα είναι αρχικά άδειο! Διαλέξτε τον µικρότερο ακέραιο από το µη-ταξινοµη- µένο τµήµα και αντιµεταθέστε το µε τον πρώτο ακέραιο µετά τον τοίχο. Ο νοητός τοίχος µετακινείται µια θέση δεξιά! Επαναλάβετε µέχρι να ταξινοµηθεί όλος ο πίνακας.! youtube 12

Selection sort: Ιδέα Στοιχείο που θα αντιµετατεθεί µε το µικρότερο Μικρότερο στοιχείο µη-ταξινοµηµένου τµήµατος 0 j N-1 Τοίχος Ταξινοµηµένο τµήµα Μη-ταξινοµηµένο τµήµα Σχήµα προσαρµοσµένο από το βιβλίο: "Computer Science: A Structured Approach Using C" by Behrouz A. Forouzan, Richard F. Gilberg 13

Selection sort: Παράδειγµα Ο πίνακας στην αρχή: 6 3 7 8 2 5 µικρότερο: 2, αντιµετ. µε 6 Μετά από το πέρασµα 1: 2 3 7 8 6 5 µικρότερο: 3 (αντιµετάθεση µε τον εαυτό του? Μετά από το πέρασµα 2: 2 3 7 8 6 5 µικρότερο: 5, αντιµετ. µε 7 Σχήµα προσαρµοσµένο από το βιβλίο: "Computer Science: A Structured Approach Using C" by Behrouz A. Forouzan, Richard F. Gilberg 14

Selection sort: Παράδειγµα Μετά από το πέρασµα 3: 2 3 5 8 6 7 µικρότερο: 6, αντιµετ. µε 8 Μετά από το πέρασµα 4: 2 3 5 6 8 7 µικρότερο: 7, αντιµετ. µε 8 Μετά από το πέρασµα 5: 2 3 5 6 7 8 Τελειώσαµε! Σχήµα προσαρµοσµένο από το βιβλίο: "Computer Science: A Structured Approach Using C" by Behrouz A. Forouzan, Richard F. Gilberg 15

Selection sort: κώδικας void selectionsort(int data[], int size) { int i,wall, min, temp; for (wall=0; wall < size; wall++) { /* εύρεση θέσης µικρότερου στοιχείου */ min = wall; /* ξεκινώντας από τον τοίχο, */ for (i=wall+1; i < size; i++) { if (data[i] < data[min]) { min = i; /* δες αν υπάρχει µικρότερο */ /* αντιµετάθεση µικρότερου µε αυτό που βρίσκεται δεξιά του τοίχου */ if (min!= wall) { /* (αν χρειάζεται) */ temp = data[wall]; data[wall] = data[min]; data[min] = temp; 16

Συγκρίσεις! Ποιος αλγόριθµος σας φαίνεται ότι κάνει περισσότερη δουλειά?! Αν ένας πίνακας είναι ήδη ταξινοµηµένος, θα γλιτώσει λίγη δουλειά ο insertion sort? Ο selection sort? 17

Αναζήτηση! Δεδοµένα: Δίνεται ένας πίνακας data από Ν ακεραίους και µια επιθυµητή τιµή value! Ζητούµενο: Να βρεθεί η θέση όπου έχει αποθηκευθεί η τιµή value στον πίνακα (εφόσον υπάρχει)! Πώς κάνουµε αναζήτηση στην πράξη? Ένα συγκεκριµένο τραπουλόχαρτο Στον τηλεφωνικό κατάλογο 18

Ιδέες! Ακολουθιακή/Σειριακή αναζήτηση (linear search): Ξεκινώντας από το πρώτο στοιχείο, τα εξετάζουµε έναένα µέχρις ώτου να βρούµε αυτό που αναζητούµε (οπότε επιστρέφουµε τη θέση του) ή να εξαντλήσουµε τα στοιχεία (οπότε επιστρέφουµε αποτυχία)! Παρατηρήσεις: Αν είµαστε άτυχοι, το στοιχείο που ψάχνουµε δεν υπάρχει καθόλου ή είναι στην τελευταία θέση, και το βρίσκουµε µετά από Ν ελέγχους! Κατά µέσο όρο χρειάζονται Ν/2 βήµατα σύγκρισης. 19

Ιδέες! Δυαδική αναζήτηση (binary search): Μόνο αν τα δεδοµένα είναι ταξινοµηµένα (ας πούµε σε αύξουσα σειρά) Εξετάζουµε το στοιχείο στη µέση. Αν είναι αυτό που ψάχνουµε, επιστρέφουµε τη θέση του. Αν είναι µικρότερο από αυτό που ψάχνουµε, τότε αρκεί να κάνουµε αναζήτηση µε τον ίδιο τρόπο στο δεξί τµήµα, αλλιώς στο αριστερό. Σε κάθε βήµα, το νέο τµήµα έχει µισό µέγεθος από το προηγούµενο. Κάποια στιγµή, το τµήµα που ελέγχουµε δε θα έχει κανένα στοιχείο, οπότε επιστρέφουµε αποτυχία.! Παρατηρήσεις: Πολύ πιο γρήγορη από σειριακή (χρειάζονται log(n) βήµατα) Αν έχουµε να κάνουµε πολλές αναζητήσεις, συµφέρει να ταξινοµήσουµε πρώτα! 20

Linear search: Κώδικας /* σε µη ταξινοµηµένο πίνακα */ int linearsearch(int data[], int value, int size) { int pos; for (pos=0; pos < size; pos++) { if (data[pos] == value) { return pos; return -1; /* άκυρη θέση, δηλώνει αποτυχία */ 21

Linear search: Κώδικας /* σε ταξινοµηµένο πίνακα */ int linearsearchsorted(int data[], int value, int size){ int pos; for (pos=0; pos < size; pos++) { if (data[pos] >= value) { break; if (pos == size data[pos]!= value) { return -1; /* άκυρη θέση, δηλώνει αποτυχία */ else { return pos; 22

Linear search: Κώδικας /* σε ταξινοµηµένο πίνακα */ int linearsearchsorted(int data[], int value, int size) { int pos; for (pos=0; pos < size; pos++) { if (data[pos] >= value) { break; if (pos == size data[pos]!= value) { printf("not found\n"); return -1; /* άκυρη θέση, δηλώνει αποτυχία */ else { η σύµβαση εκτέλεσης του εγγυάται ότι δεν θα επιχειρηθεί πρόσβαση printf("found at data[pos] position αν %d\n", το pos φτάσει pos); το όριο return pos; size του πίνακα 23

Linear search: Κώδικας (παραλλαγή) /* σε ταξινοµηµένο πίνακα */ int linearsearchsorted(int data[], int value, int size){ int pos; for (pos=0; pos < size && data[pos]<value; pos++){ if (pos == size data[pos]!= value) { printf("not found\n"); return -1; /* άκυρη θέση, δηλώνει αποτυχία */ else { printf("found at position %d\n", pos); return pos; η σύµβαση εκτέλεσης του && εγγυάται ότι δεν θα επιχειρηθεί πρόσβαση data[pos] αν το pos φτάσει το όριο size του πίνακα 24

Binary search: Ο αλγόριθµος 1 Θέτουµε τα όρια αναζήτησης (δηλαδή τα όρια του τµήµατος του πίνακα που µας ενδιαφέρει) αρχικά σε begin = 0 και end = N-1 2 Βρίσκουµε το µεσαίο στοιχείο του πίνακα: middle = (begin + end) / 2 3 Αν begin > end τελειώσαµε (µε αποτυχία) 4 Αν data[middle] < value, συνεχίζουµε µε τον µισό υποπίνακα που έχει στοιχεία µε µεγαλύτερες τιµές του data[middle], δηλαδή θέτουµε begin = middle + 1 και πάµε πάλι στο βηµα 2. Το end δεν αλλάζει. 5 Αν data[middle] > value, συνεχίζουµε µε τον µισό υποπίνακα που έχει στοιχεία µε µεγαλύτερες τιµές του data[middle], δηλαδή θέτουµε end = middle - 1 και πάµε πάλι στο βηµα 2. Το begin δεν αλλάζει. 25

Binary search: Παράδειγµα 1 Αρχικά: Ψάχνουµε το L C H L Ν P S V Y Z begin = 0 middle = 4 end = 8 data[middle] > value Μετά από το πέρασµα 1: C H L Ν P S V Y Z begin = 0 middle = 1 end = 3 data[middle] < value 26

Binary search: Παράδειγµα 1 Μετά από το πέρασµα 1: (από προηγ. διαφάνεια) C H L Ν P S V Y Z begin = 0 middle = 1 end = 3 data[middle] < value Μετά από το πέρασµα 2: C H L Ν P S V Y Z begin = 2 middle = 2 end = 3 data[middle] == value 27

Binary search: Παράδειγµα 2 Αρχικά: Ψάχνουµε το Μ C H L Ν P S V Y Z begin = 0 middle = 4 end = 8 data[middle] > value Μετά από το πέρασµα 1: στόχος: Μ C H L Ν P S V Y Z begin = 0 middle = 1 end = 3 data[middle] < value 28

Binary search: Παράδειγµα 2 Μετά από το πέρασµα 1: (από προηγ. διαφάνεια) C H L Ν P S V Y Z begin = 0 middle = 1 end = 3 data[middle] < value Μετά από το πέρασµα 2: στόχος: Μ C H L Ν P S V Y Z begin = 2 middle = 2 end = 3 data[middle] < value 29

Binary search: Παράδειγµα 2 Μετά από το πέρασµα 2: (από προηγ. διαφάνεια) C H L Ν P S V Y Z begin = 2 middle = 2 end = 3 data[middle] < value Μετά από το πέρασµα 3: στόχος: Μ C H L Ν P S V Y Z begin = 3 middle = 3 end = 3 data[middle] > value 30

Binary search: Παράδειγµα 2 Μετά από το πέρασµα 3: (από προηγ. διαφάνεια) C H L Ν P S V Y Z στόχος: Μ begin = 3 middle = 2 end = 2 begin > end Αποτυχία! 31

Binary search: κώδικας int binarysearch(int data[], int value, int size) { int begin, end, middle; begin = 0; end = size-1; while (begin <= end) { middle = (begin + end) / 2; if (data[middle] == value) { return middle; else if (data[middle] < value) { begin = middle + 1; else { /* data[middle] > value */ end = middle - 1; return -1; 32