Δυαδική αναζήτηση
- Στη δυαδική αναζήτηση (binary search) η εύρεση
της εγγραφής στον ταξινομημένο πίνακα γίνεται αναζητώντας το στοιχείο
στη μέση του πίνακα, στη συνέχεια στη μέση της μέσης κ.ο.κ.
- Αν ο πίνακας έχει Ν στοιχεία θα απαιτηθούν κατά μέσο όρο
log2 N συγκρίσεις.
- Η βιβλιοθήκη της C υλοποιεί τον αλγόριθμο αυτό στη συνάρτηση bsearch:
#include <stdlib.h>
void *bsearch(const void *key, const void *base, size_t num, size_t width, int (*compare)(const void *elem1, const void *elem2));
- Η συνάρτηση αναζητά την τιμή που δείχνεται από το δείκτη key σε έναν
ταξινομημένο πίνακα δεδομένων με βάση μια συνάρτηση σύγκρισης.
- Η συνάρτηση έχει τις παρακάτω παραμέτρους:
- key
- Δείκτης στην τιμή για την οποία εκτελείται η αναζήτηση.
- base
- Δείκτης στην αρχή του πίνακα των δεδομένων που θα εκτελεστεί η αναζήτηση.
- num
- Αριθμός των δεδομένων στον πίνακα.
- width
- Το μέγεθος κάθε στοιχείου του πίνακα (π.χ. sizeof(int), sizeof(struct s_elem *)).
- compare
- Δείκτης σε συνάρτηση που συγκρίνει δύο στοιχεία με βάση δείκτες σε αυτά.
Η συνάρτηση compare (όπως και αυτή της qsort)
πρέπει να επιστρέφει τις παρακάτω τιμές:
- < 0
- αν το elem1 < elem2,
- 0
- αν το elem1 == elem2 και
- > 0
- αν το elem1 > elem2.
Παράδειγμα
Το παρακάτω παράδειγμα διαβάζει μια γραμμή και την τυπώνει σύμφωνα
με το διεθνές φωνητικό αλφάβητο (π.χ. για τη γραμμή HELLO WORLD
θα τυπώσει:
Hotel
Echo
Lima
Lima
Oscar
Whiskey
Oscar
Romeo
Lima
Delta
/*
* Read a line from the standard input and print it according to the
* international phonetic alphabet.
*
* Diomidis Spinellis. March 1999.
*
* $Id$
*
*/
#include <stdlib.h>
#include <stdio.h>
/*
* The international phonetic alphabet (sorted)
*/
char *names[] = {
"Alpha",
"Bravo",
"Charlie",
"Delta",
"Echo",
"Foxtrot",
"Golf",
"Hotel",
"India",
"Juliet",
"Kilo",
"Lima",
"Mike",
"November",
"Oscar",
"Papa",
"Quebec",
"Romeo",
"Sierra",
"Tango",
"Uniform",
"Victor",
"Whiskey",
"X-Ray",
"Yankee",
"Zulu",
};
/*
* Bsearch compare function
*/
static int
namecmp(char **a, char **b)
{
return (**a - **b);
}
main()
{
char buff[80], *p, **name;
fgets(buff, sizeof(buff), stdin);
for (p = buff; *p; p++)
if (name = (char **)bsearch(&p, names, 26, sizeof(char *), namecmp))
printf("%s\n", *name, *name);
}