Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Αναζήτηση σε πίνακα Αναζήτηση σε πίνακα που περιέχει ακέραιους αριθμούς.

Παρόμοιες παρουσιάσεις


Παρουσίαση με θέμα: "Αναζήτηση σε πίνακα Αναζήτηση σε πίνακα που περιέχει ακέραιους αριθμούς."— Μεταγράφημα παρουσίασης:

1 Αναζήτηση σε πίνακα Αναζήτηση σε πίνακα που περιέχει ακέραιους αριθμούς

2 ΣΕΙΡΙΑΚΗ ΑΝΑΖΗΤΗΣΗ Είναι η απλούστερη μέθοδος αναζήτησης. Σύμφωνα με αυτήν, τα στοιχεία του πίνακα ελέγχονται σειριακά, (το ένα μετά το άλλο δηλαδή) ξεκινώντας από την αρχή, μέχρι να βρούμε το ζητούμενο, γίνονται δηλαδή συνεχείς συγκρίσεις των στοιχείων του πίνακα με την αναζητούμενη τιμή. Στην περίπτωση ταξινομημένου πίνακα, εάν δηλαδή τα στοιχεία του πίνακα είναι «τακτοποιημένα» κατά αυξανόμενο μέγεθος, η αναζήτηση συνεχίζεται μέχρι να επισημανθεί το στοιχείο ή μέχρι να βρούμε τιμή μεγαλύτερη από την ζητούμενη, οπότε η αναζήτηση έχει προφανώς αποτύχει. Αντίστοιχα ισχύουν για πίνακα ταξινομημένο κατά φθίνον μέγεθος Ο μέγιστος αριθμός των συγκρίσεων στη σειριακή αναζήτηση είναι Ν (όταν το αναζητούμενο στοιχείο βρίσκεται στην τελευταία θέση του πίνακα ή δεν υπάρχει στον πίνακα)

3 Παράδειγμα................................... int pin[N], pos=-1; ……………………….. for (k=0; k<N; k++) { if (pin[k] == num) pos = k; break; }

4 ΔΥΑΔΙΚΗ ΑΝΑΖΗΤΗΣΗ Για την εφαρμογή της δυαδικής αναζήτησης (binary search) απαιτείται ο πίνακας να είναι ταξινομημένος. Το ζητούμενο στοιχείο συγκρίνεται με την τιμή του στοιχείου, το οποίο βρίσκεται στη μεσαία θέση του πίνακα. Στη συνέχεια προχωρούμε ως εξής: Αν το ζητούμενο στοιχείο είναι το «μεσαίο» στοιχείο του πίνακα, τότε η αναζήτηση τελειώνει. Αν το ζητούμενο στοιχείο είναι μεγαλύτερο από το «μεσαίο», τότε ο πρώτος μισός πίνακας αγνοείται και η αναζήτηση συνεχίζεται με τον ίδιο τρόπο μεταξύ των στοιχείων που βρίσκονται μετά το μεσαίο. Συγκρίνουμε δηλαδή το στοιχείο που αναζητούμε με το «μεσαίο» στοιχείο του δεύτερου μισού πίνακα του αρχικού κ.ο.κ. Αν το ζητούμενο στοιχείο είναι μικρότερο από το «μεσαίο», τότε ο δεύτερος μισός πίνακας αγνοείται και η αναζήτηση συνεχίζεται με αντίστοιχο με τον πιο πάνω τρόπο μεταξύ των στοιχείων που βρίσκονται πριν το μεσαίο. Η αναζήτηση συνεχίζεται με τον ίδιο τρόπο μέχρι να βρεθεί το ζητούμενο στοιχείο ή να μην υπάρχουν άλλα στοιχεία για εξέταση.

5 Παράδειγμα σε C ………………………………………….. int pin[N]; int low=0, high=N-1; int exist=0, position=0, i, ser; scanf("%d", &ser); while (low <= high && exist = = 0) { i = (int)ceil (low+high) / 2; if (ser = =pin[i]) { exist = 1; position = i; } else if (ser < pin[i]) high = i-1; else low = i+1; } printf("%d %d\n", exist, position);....................................................................

6 Πολυπλοκότητα στη δυαδική αναζήτηση Αριθμός επανάληψης Αριθμός στοιχείων του πίνακα 1Ν 2Ν/2 3Ν/22 4 Ν/23 iN/2i Στην χειρότερη περίπτωση οι επαναλήψεις του βρόχου while σταματούν όταν ο πίνακας στον οποίο πρέπει να ψάξουμε περιέχει ένα μόνο στοιχείο, δηλαδή: N/2i = 1  2i = N  log2 2i = log2N  i = log2N

7 Σύγκριση σειριακής και δυαδικής αναζήτησης Ν (πλήθος στοιχείων του πίνακα) Μέγιστος αριθμός συγκρίσεων Σειριακή αναζήτησηΔυαδική αναζήτηση 10 3 100 7 1.000 10 1.000.000 20 1.000.000.000 30

8 ΑΝΑΖΗΤΗΣΗ ΠΑΡΕΜΒΟΛΗΣ Για την υλοποίηση του αλγόριθμου αναζήτησης παρεμβολής (interpolation search) υποτίθεται ότι έχουμε ταξινομημένο πίνακα κατά αυξανόμενο μέγεθος και προσπαθούμε να εντοπίσουμε την αναζητούμενη τιμή, εκτιμώντας κάθε φορά πόσο μακριά από την θέση του πίνακα την οποία ελέγχουμε, είναι πιθανό να βρίσκεται το ζητούμενο στοιχείο. Ας θυμηθούμε ότι στην δυαδική αναζήτηση υποδιπλασιάζουμε κάθε φορά τον «χώρο» αναζήτησης. Η αποδοτικότητα του αλγορίθμου εξαρτάται από την στατιστική κατανομή των στοιχείων του πίνακα. Αν τα στοιχεία είναι ομοιόμορφα κατανεμημένα, τότε η μέθοδος αυτή είναι η καλύτερη από όλες τις άλλες μεθόδους αναζήτησης που εξετάσαμε πιο πάνω. Η μέθοδος πάντως είναι κατώτερη από τις προηγούμενες εάν η κατανομή των στοιχείων δεν είναι ομοιόμορφη.

9 Παράδειγμα σε C int search(int table[ ], int low, int high, int num) { float fmid, fhigh; int mid, pos; fhigh = (float) high; while ((table[high] >= num) && (num > table[low])) { fmid=low+((fhigh - low)*(num- table[low])/(table[high]- table[low]); mid = (int)ceil(fmid); if (num > table[mid]) low = mid + 1; else if (num < table[mid]) high = mid - 1; else low = mid; } if (num == table[low]) pos = low; else pos = -1; return pos; } 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 {5, 6, 7, 9, 10, 20, 30, 70, 100, 101, 105, 106, 110, 200, 300, 400} low ← 0, high ← 15, fhigh ← 15.0 fmid ← 0 + 15.0 * (200 – 5) / (400 – 5), άρα: fmid ← 7.405, άρα: mid← 8 table[8] == 100, άρα num > table[8], άρα low ← mid+1, δηλαδή low ← 9 low ← 9, high ← 15, fhigh ← 15.0 fmid ← 9 + 6.0 * (200 – 101) / (400 – 101), άρα: fmid ← 10.9866, άρα: mid ← 11 table[11] == 106, άρα num > table[11], άρα low ← mid+1, δηλαδή low ← 12 low ← 12, high ← 15, fhigh ← 15.0 fmid ← 12 + 3.0 * (200 – 110) / (400 – 110), άρα: fmid ← 12.9310, άρα: mid ← 13 table[13] == 200, άρα: pos ← 13.


Κατέβασμα ppt "Αναζήτηση σε πίνακα Αναζήτηση σε πίνακα που περιέχει ακέραιους αριθμούς."

Παρόμοιες παρουσιάσεις


Διαφημίσεις Google