Γ7.5 Αλγόριθμοι Αναζήτησης Γ Λυκείου Κατεύθυνσης
Εισαγωγή Αλγόριθμος αναζήτησης θεωρείται ένας αλγόριθμος, ο οποίος προσπαθεί να εντοπίσει ένα στοιχείο με συγκεκριμένες ιδιότητες, μέσα σε μία συλλογή από στοιχεία του ίδιου τύπου. Θα ασχοληθούμε με την αναζήτηση δεδομένων σε πίνακες και θα αναλύσουμε τους αλγόριθμους της σειριακής (sequential) και της δυαδικής (binary) αναζήτησης.
Σειριακή αναζήτηση (Sequential search) Η σειριακή αναζήτηση, ξεκινώντας από το πρώτο στοιχείο του πίνακα, ελέγχει ένα-ένα τα στοιχεία μέχρι να εντοπίσει αυτό που ψάχνει ή να φτάσει στο τελευταίο στοιχείο του πίνακα. bool sequential_search(int arr[], int N, int target){ for (int i = 0; i < N; i++) if (target == arr[i]) return true; // Το στοιχείο βρέθηκε return false; // Το στοιχείο δεν βρέθηκε } https://www.cs.usfca.edu/~galles/visualization/search.html
Σειριακή αναζήτηση (Sequential search) Αν θέλουμε η συνάρτηση να επιστρέφει τη θέση του στοιχείου στον πίνακα, τότε θα αλλάξουμε τον τύπο της συνάρτησης σε integer. Η συνάρτηση θα επιστρέφει τη θέση του στοιχείου, αν αυτό βρεθεί στον πίνακα, αλλιώς θα επιστρέφει την τιμή -1, το οποίο σημαίνει ότι το στοιχείο δεν βρέθηκε. int sequential_search(int arr[], int N, int target){ for (int i = 0; i < N; i++) if (target == arr[i]) return i; // Το στοιχείο βρέθηκε return -1; // Το στοιχείο δεν βρέθηκε }
Σειριακή αναζήτηση (Sequential search) Αν θέλουμε η συνάρτηση να επιστρέφει τη θέση της τελευταίας εμφάνισης, πρέπει να αποθηκεύουμε κάθε φορά τη θέση της πιο πρόσφατης εμφάνισης και να την αλλάζουμε σε κάθε νέα εμφάνιση. int sequential_search(int arr[], int N, int target){ int pos = -1; for (int i = 0; i < N; i++) if (target == arr[i]) pos = i; return pos; //θέση τελευταίας εμφάνισης ή -1 αν δεν βρεθεί }
Παράδειγμα 5.1 Να δημιουργήσετε πρόγραμμα το οποίο να καλεί μία συνάρτηση σειριακής αναζήτησης, η οποία να βρίσκει και να εμφανίζει στην οθόνη το πλήθος των εμφανίσεων ενός χαρακτήρα, μέσα σε έναν πίνακα χαρακτήρων. Το πρόγραμμα θα διαβάζει το πλήθος (Ν) των χαρακτήρων και, ακολούθως, θα αποθηκεύει τους χαρακτήρες σε πίνακα. Στη συνέχεια, θα διαβάζει τον χαρακτήρα τον οποίο θα αναζητήσει και θα καλεί τη συνάρτηση. Παράδειγμα εισόδου 13 C B K J H A C B T Y U B V B Παράδειγμα εξόδου 3 Λύση:
Στρατηγική Διαίρει και Βασίλευε (Divide and Conquer) Στην κατηγορία αυτή οι αλγόριθμοι, αρχικά, διασπούν το πρόβλημα σε μικρότερα προβλήματα. Στη συνέχεια, επιλύουν ανεξάρτητα και διαδοχικά κάθε ένα από τα υποπροβλήματα και, τέλος, συνδυάζουν τις επιμέρους λύσεις με τέτοιο τρόπο, ώστε να σχηματιστεί η λύση του αρχικού προβλήματος.
Στρατηγική Διαίρει και Βασίλευε (Divide and Conquer) Να γεμίσετε έναν πίνακα διαστάσεων 2 n x2 n με τρόμινος, έτσι ώστε να μη μείνουν κενά τετράγωνα. Ο πιο κάτω πίνακας διαστάσεων 8x8 περιέχει και ένα μη προσβάσιμο τετράγωνο.
Δυαδική αναζήτηση (Binary search) Η δυαδική αναζήτηση ανήκει στην κατηγορία αλγορίθμων «Διαίρει και Βασίλευε». Η δυαδική αναζήτηση μπορεί να χρησιμοποιηθεί μόνο αν ο πίνακας είναι ήδη ταξινομημένος. Ο αλγόριθμος ξεκινά εξετάζοντας το «μεσαίο» στοιχείο του πίνακα. Το μεσαίο στοιχείο καθορίζεται βρίσκοντας τον μέσο όρο των θέσεων του πρώτου και του τελευταίου στοιχείου του πίνακα. Αν η τιμή του ζητούμενου στοιχείου είναι μικρότερη από την τιμή του μεσαίου στοιχείου, τότε θα συνεχίσουμε το ψάξιμο στο «αριστερό» μέρος του πίνακα αγνοώντας το «δεξί» μέρος. Διαφορετικά, αν η τιμή του ζητούμενου στοιχείου είναι μεγαλύτερη από την τιμή του μεσαίου στοιχείου, τότε θα ψάξουμε στο «δεξί» μέρος του πίνακα, αγνοώντας το «αριστερό» μέρος. https://www.cs.usfca.edu/~galles/visualization/search.html
Δυαδική αναζήτηση (Binary search) bool binary_search(int arr[], int N, int target) { int first = 0, last = N - 1, mid; while (first <= last) { mid = (first + last) / 2; if (arr[mid] == target) return true; else if (target < arr[mid]) last = mid - 1; else first = mid + 1; } return false; } // Εύρεση μεσαίου στοιχείου // Το στοιχείο βρέθηκε // Ψάξε στον «αριστερό» υποπίνακα // Ψάξε στον «δεξί» υποπίνακα // Το στοιχείο δεν βρέθηκε
Δυαδική αναζήτηση (Binary search) Αν θέλουμε η συνάρτηση να επιστρέφει τη θέση του στοιχείου στον πίνακα, τότε θα αλλάξουμε τον τύπο της συνάρτησης σε integer. Η συνάρτηση θα επιστρέφει τη θέση του στοιχείου, αν αυτό βρεθεί στον πίνακα, αλλιώς θα επιστρέφει την τιμή -1, που σημαίνει ότι το στοιχείο δεν βρέθηκε (last<first).
Δυαδική αναζήτηση (Binary search) int binary_search(int arr[], int N, int target) { int first = 0, last = N - 1, mid; while (first <= last) { mid = (first + last) / 2; if (arr[mid] == target) return mid; else if (target < arr[mid]) last = mid - 1; else first = mid + 1; } return -1; } // Εύρεση μεσαίου στοιχείου // Το στοιχείο βρέθηκε στη θέση mid // Ψάξε στον «αριστερό» υποπίνακα // Ψάξε στον «δεξί» υποπίνακα // Το στοιχείο δεν βρέθηκε
Παράδειγμα 5.3 Να δημιουργήσετε πρόγραμμα το οποίο να καλεί μία συνάρτηση δυαδικής αναζήτησης, η οποία να βρίσκει και να εμφανίζει στην οθόνη τη θέση ενός δεκαδικού αριθμού μέσα σε έναν ταξινομημένο πίνακα δεκαδικών. Το πρόγραμμα, αρχικά, θα διαβάζει το πλήθος (Ν) των αριθμών και, ακολούθως, θα διαβάζει τους αριθμούς και θα τους αποθηκεύει σε πίνακα. Στη συνέχεια, θα διαβάζει τον δεκαδικό τον οποίο θα αναζητήσει και θα καλεί τη συνάρτηση. Αν ο αριθμός προς αναζήτηση δεν βρίσκεται στον πίνακα, η συνάρτηση θα επιστρέφει -1. Παράδειγμα εισόδου 12 5.1 6.2 8.3 10.4 13.5 14.6 18.7 24.8 34.9 55.4 65.1 85.2 55.4 Παράδειγμα εξόδου 9 Λύση: https://ideone.com/d0m398
Παράδειγμα 5.4 Να δημιουργήσετε πρόγραμμα το οποίο να καλεί μία συνάρτηση δυαδικής αναζήτησης, η οποία να βρίσκει και να εμφανίζει στην οθόνη τη θέση της πρώτης εμφάνισης ενός ακέραιου, μέσα σε έναν ταξινομημένο πίνακα ακεραίων. Το πρόγραμμα, αρχικά, θα διαβάζει το πλήθος (Ν) των ακεραίων και, ακολούθως, θα διαβάζει τους ακέραιους και θα τους αποθηκεύει σε πίνακα. Στη συνέχεια, θα διαβάζει τον ακέραιο τον οποίο θα αναζητήσει και θα καλεί τη συνάρτηση. Να θεωρήσετε ότι ο ακέραιος προς αναζήτηση θα εμφανίζεται τουλάχιστον μία φορά στον πίνακα. Παράδειγμα εισόδου 12 5 5 5 5 13 13 13 14 14 15 15 15 13 Παράδειγμα εξόδου 4 Λύση: https://ideone.com/heh02a