std::bsearch en C++

Conceptos básicos de la búsqueda binaria

std::bsearch busca un elemento en una array ordenada. Encuentra un elemento igual al elemento al que apunta key en una array a la que apunta ptr.
Si la array contiene varios elementos que comp indicarían como iguales al elemento buscado, entonces no se especifica qué elemento devolverá la función como resultado.
Sintaxis:

void* bsearch( const void* key, const void* ptr, std::size_t count,
               std::size_t size, * comp );

Parameters :
key     -    element to be found
ptr     -    pointer to the array to examine
count    -    number of element in the array
size    -    size of each element in the array in bytes
comp    -    comparison function which returns ?a negative integer value if 
             the first argument is less than the second,
             a positive integer value if the first argument is greater than the second
             and zero if the arguments are equal.

Return value :
Pointer to the found element or null pointer if the element has not been found.

Implementando el predicado binario comp :

// Binary predicate which returns 0 if numbers found equal
int comp(int* a, int* b)
{
  
    if (*a < *b)
        return -1;
  
    else if (*a > *b)
        return 1;
  
    // elements found equal
    else
        return 0;
}

Implementación

// CPP program to implement
// std::bsearch
#include <bits/stdc++.h>
  
// Binary predicate
int compare(const void* ap, const void* bp)
{
    // Typecasting
    const int* a = (int*)ap;
    const int* b = (int*)bp;
  
    if (*a < *b)
        return -1;
    else if (*a > *b)
        return 1;
    else
        return 0;
}
  
// Driver code
int main()
{
    // Given array
    int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
  
    // Size of array
    int ARR_SIZE = sizeof(arr) / sizeof(arr[0]);
  
    // Element to be found
    int key1 = 4;
  
    // Calling std::bsearch
    // Typecasting the returned pointer to int
    int* p1 = (int*)std::bsearch(&key1, arr, ARR_SIZE, sizeof(arr[0]), compare);
  
    // If non-zero value is returned, key is found
    if (p1)
        std::cout << key1 << " found at position " << (p1 - arr) << '\n';
    else
        std::cout << key1 << " not found\n";
  
    // Element to be found
    int key2 = 9;
  
    // Calling std::bsearch
    // Typecasting the returned pointer to int
    int* p2 = (int*)std::bsearch(&key2, arr, ARR_SIZE, sizeof(arr[0]), compare);
  
    // If non-zero value is returned, key is found
    if (p2)
        std::cout << key2 << " found at position " << (p2 - arr) << '\n';
    else
        std::cout << key2 << " not found\n";
}

Producción:

4 found at position 3
9 not found

Dónde usar: la búsqueda binaria se puede usar en datos ordenados donde se encuentra una clave. Se puede utilizar en casos como el cálculo de la frecuencia de una clave en una lista ordenada.

¿Por qué búsqueda binaria?
La búsqueda binaria es mucho más eficaz que la búsqueda lineal porque reduce a la mitad el espacio de búsqueda en cada paso. Esto no es significativo para nuestra array de longitud 9. Aquí, la búsqueda lineal toma como máximo 9 pasos y la búsqueda binaria toma como máximo 4 pasos. Pero considere una array con 1000 elementos, aquí la búsqueda lineal toma como máximo 1000 pasos, mientras que la búsqueda binaria toma como máximo 10 pasos.
Para mil millones de elementos, la búsqueda binaria encontrará nuestra clave en un máximo de 30 pasos.

Artículo relacionado: std::binary_search
Este artículo es una contribución de Rohit Thapliyal . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *