Búsqueda binaria y procesamiento de límites binarios

¿Qué es la búsqueda binaria?

En términos generales, la búsqueda binaria consiste en encontrar el rango de respuestas en una matriz ordenada y tomar el valor medio del rango cada vez. Si este valor es grande, tome la primera mitad y continúe reduciendo el rango; si el valor es pequeño, tome la segunda mitad para reducir el rango.
Después de cada tiempo, el rango de 1/2 se puede reducir y la respuesta se obtendrá gradualmente.

Límite de error de muestra

Pregunta de ejemplo: https://www.acwing.com/problem/content/description/1229/
Obviamente, esta pregunta se puede dividir en dos puntos. Si la enumeración es de 1 a 100000,
establezca l = 1, r = 1e5, mid = (l + r) / 2; En el
pasado, siempre usaba l = mid + 1 si mid era pequeño; r = mid-1 si mid era grande, pero cuando la respuesta a esta pregunta es 5, la respuesta será incorrecta . ¿Por qué?
Como se muestra en la figura, el primero de cada línea es l, el segundo es r y el tercero es medio.
Inserte la descripción de la imagen aquí
Si la respuesta a esta pregunta es 5, cuando mid = 4, l = mid + 1, es decir, l = 5, luego salga del ciclo, La respuesta final es 4.

Perímetro

(1) mid=(l+r)/2De hecho, es (l + r) / 2 redondeado hacia abajo. Cuando l = mid, r = mid + 1, si l + 1 sale del bucle directamente y no se ha tomado el valor de r = mid + 1.
Debido a que se redondea hacia abajo, es decir l <= mid < r, mid es siempre menor que el valor de r, y se puede cambiar a r = mid cuando mid es grande, es decir

    while(l<r){
    
    
        int mid = (l+r)/2;
       判断成立语句;

        if(满足条件){
    
    
            ans=mid;
            l=mid+1;
        }
        else{
    
    
            r=mid;
        }
    }

(2) También se puede redondear, es decir mid=(l+r+1)/2. De la misma manera, l < mid <= rmid nunca será igual a 1. En este momento, se puede cambiar a mid. Si es menor, l = mid y el código está disponible.

    while(l<r){
    
    
        int mid = (l+r+1)/2;
       判断成立语句;

        if(满足条件){
    
    
            ans=mid;
            l=mid;
        }
        else{
    
    
            r=mid-1;
        }
    }

Supongo que te gusta

Origin blog.csdn.net/qq_45758578/article/details/113209836
Recomendado
Clasificación