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
- 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.
3. Repita los pasos 1 y 2 hasta que se encuentre o no se encuentre el número.
-
Continuamos con los pasos anteriores
: esta vez el número de búsqueda es más grande, por lo que esta vez nos alejamos hacia la derecha.
-
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
-
-
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
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
- Luego, el valor intermedio de cada cálculo, usamos mid para representar
- Luego cambiamos los valores de bajo y alto según el resultado de la comparación (uno a la vez)
- 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