Algoritmo C++ - Búsqueda binaria

Introducción

Nombre en inglés: Binary Search
también se llama búsqueda binaria, que es un método de búsqueda más eficiente. Sin embargo, la búsqueda binaria requiere que la tabla lineal adopte una estructura de almacenamiento secuencial, y los elementos de la tabla se ordenen según la clave

paso

Lo siguiente usa la matriz 1, 2, 3, 4, 5, 6, 7, 8, 9 como ejemplo.
En este punto buscamos 3

1. En primer lugar, nuestro rango de búsqueda es todo, y se toma el valor promedio de los subíndices en ambos extremos
  • Primero, los subíndices en ambos extremos son 0 y n-1
    inserte la descripción de la imagen aquí
  • En este momento se obtiene el valor intermedio 5
2. Compare los dos números y reduzca el rango de búsqueda
  • Después de la comparación, el valor medio obtenido es mayor que el número que se va a encontrar, por lo que el número que estamos buscando debe estar en el lado izquierdo del valor medio, por lo que el rango cambia del lado izquierdo original al número anterior al valor medio.
    inserte la descripción de la imagen aquí
3. Repita los pasos 1 y 2 hasta que se encuentre o no se encuentre el número.
  • Continuamos con los pasos anteriores
    inserte la descripción de la imagen aquí: esta vez el número de búsqueda es más grande, por lo que esta vez nos alejamos hacia la derecha.
    inserte la descripción de la imagen aquíinserte la descripción de la imagen aquí

  • En este punto lo hemos encontrado, y podemos volver al subíndice

  • A continuación, no podemos encontrarlo, eliminaremos 3 de la matriz y luego buscaremos nuevamente

  • inserte la descripción de la imagen aquíinserte la descripción de la imagen aquí
    inserte la descripción de la imagen aquí

  • En este momento, los dos lados se han fusionado en un solo número, pero aún no lo es, por lo que se puede juzgar que no existe tal número. Preste atención al hecho de que los subíndices en ambos lados aún cambiarán y luego devolverán -1
    inserte la descripción de la imagen aquí

el código

  • Del proceso anterior podemos ver que necesitamos dos variables para marcar los lados izquierdo y derecho, por lo que creamos bajo y alto

inserte la descripción de la imagen aquí

  • Luego, el valor intermedio de cada cálculo, usamos mid para representar
    inserte la descripción de la imagen aquí
  • Luego cambiamos los valores de bajo y alto según el resultado de la comparación (uno a la vez)
    inserte la descripción de la imagen aquíinserte la descripción de la imagen aquí
  • Al igual que arriba, finalmente se fusionarán los valores bajo y alto (tenga en cuenta que deben compararse al fusionarse). En este momento, encontramos que no es lo mismo después de la comparación. De acuerdo con la ley, en este momento, el valor alto estará delante del valor bajo. Solo entonces podemos determinar si no hay, por lo que la condición de este ciclo es bajo <= alto
#include<bits/stdc++.h>

using namespace std;

int BinarySearch(int a[],int low,int high,int target)
{
    
    
    while(low<=high)
        {
    
    
            int mid=low+(high-low)/2;//溢出问题
            cout<<"low:"<<low<<" high:"<<high<<" mid:"<<mid<<endl;
            if(a[mid]>target)
                high=mid-1;
            else if(a[mid]<target)
                low=mid+1;
            else
                return mid;

        }
    return -1;
}


int main()
{
    
    
    int a[10]={
    
    1,2,3,4,5,6,7,8,9};
    int len=9;
    cout<<BinarySearch(a,0,len-1,3)<<endl;
    return 0;
}










característica

complejidad del tiempo

La complejidad del tiempo se puede expresar como O (log 2 n) O(log2n)O ( log 2 n ) _ _

Prueba

No es necesario cambiar el código esta vez, solo ven a una pregunta

Todos los números en una matriz creciente de longitud n - 1 son únicos, y cada número está en el rango de 0 ~ n - 1. Entre los n números en el rango, solo hay un número que no está en la matriz. Busque este número

Los datos de entrada son n y la matriz

Entrada: 9 0 1 2 4 5 6 7 8
Salida: 3

Entrada: 6 0 1 2 3 4
Salida: 5

Entrada: 4 1 2 3
Salida: 0

Hay muchas formas de resolver esta pregunta, pero aquí la prueba utiliza puntos dicotómicos para resolver el problema.

Se vienen nuevos trucos (Θ▽Θ)
Por cierto, si te interesa, puedes aprender la regla de los tercios

Supongo que te gusta

Origin blog.csdn.net/qq_44616044/article/details/115731497
Recomendado
Clasificación