Algoritmo Busqueda Binaria - ¿Explicacion? - C++

fastak_

El ejercicio trata de explicar como funciona la busqueda binaria en C++ usando un vector ordenado.

Este es todo el código con un ejemplo de un vector de 5 elementos que escupe la salida correctamente.

#include <iostream>
#include <cstdlib>
#include <cstdio>

using namespace std;

int main(){

int numero [] = {1,2,3,4,5};
int inf, sup, mitad, dato;
char bandera='F';
  
dato = 4;
//Algoritmo de Busqueda Binaria
inf=0; sup=5;
while (inf <= sup){ mitad = (inf+sup)/2;
if (numero[mitad] == dato){ bandera = 'V'; break ; } if (numero[mitad] > dato){ sup = mitad; mitad = (inf+sup)/2; } if (numero[mitad] < dato){ inf = mitad; mitad = (inf+sup)/2; } }
if (bandera == 'V'){ cout << "El numero ha sido encontrado en la posicion "<< mitad << endl; } else { cout << "El numero NO fue encontrado."; } }

Pero centrándome en comprender lo que hace el algoritmo verdaderamente no consigo entender la logica de ese while:

while (inf <= sup){
    mitad = (inf+sup)/2;
    
if (numero[mitad] == dato){ bandera = 'V'; break ; } if (numero[mitad] > dato){ sup = mitad; mitad = (inf+sup)/2; } if (numero[mitad] < dato){ inf = mitad; mitad = (inf+sup)/2; } }

¿Alguien puede explicarmelo por favor? Como termina en la variable "mitad" el valor de la posicion de la busqueda...

HeXaN

¿Por qué intentas entender un algoritmo mirando el código? Cógete su definición, un papel y un bolígrafo. Vuelve en una hora.

3 2 respuestas
ReEpER

Lo de traducir flag por bandera ya me parece de pelicula tu.

2
Zerokkk

Alguien necesita un curso de Clean Code con urgencia.

1 respuesta
B

.

1 respuesta
B

.

1 1 respuesta
E

Te diría que incluso que lo complicases un pelin y los números del Array vengan de un rand() y optimizar el código como te han dicho arriba.

crb2222

Si no entiendes esto deberías leerte los libros de hexan y volver a la fp

fastak_

#6 Gracias. Con tu explicación lo he comprendido.

#2 #5 En realidad lo que intento entender es el algoritmo, el codigo me da igual, pero como la definicion la tenia en c++ pues es lo que puse de ejemplo.

#4 Recién llevo 1 mes que empecé a estudiar. Pero tomo nota y volveré con una solución más optima ;)

1 respuesta
eondev

Joder uno viene pidiendo ayuda para entender un algoritmo y ya tienes al tonto del clean code y al que dice que optimice el código xDDDD calma

btw lo que te dice #2 es lo mejor

1
Mewtwo

#9

Con eso lo vas a entender mejor que con el codigo

2 1 respuesta
fastak_

#11 Sí, gracias a todos. Ya por fin le di unas vueltas a todas esas explicaciones y termine entendiendolo.

Yo entiendo que algunos de aqui lo veas como una tontería similar a sumar 2+2....Y así es, una vez has sacado la solución o encontrado la lógica del proceso también resulta sencillo, pero desde el punto de vista de un principiante la perspectiva siempre es un poco más pesimista jeje

Una vez más, agradezco las respuestas de todos, un saludo!

19 días después
Zuki

¿Y no sería más fácil recorrer el array con un for hasta encontrar el número y mostrar la posición del array?

1 respuesta
Ranthas

#13 Se trata de usar un algoritmo que mejore los tiempos de búsqueda.

Tu solución (búsqueda lineal), si bien es sencilla de implementar, presenta un rendimiento que depende del tamaño del vector a recorrer. Si tiene 20 elementos, pues no pasa nada, pero si tiene 20 trillones, los tiempos de búsqueda se disparan. El rendimiento de un algoritmo de búsqueda lineal es de O(n), siendo n el nº de elementos del vector.

Con la solución de #1, (búsqueda dicotómica), te aseguras un mejor rendimiento. Fíjate que en cada iteración descartas automáticamente la mitad de los elementos. Si sacas lápiz y papel, verás que el rendimiento de este algoritmo es de O(log(n)). Muestra rápida para que veas la diferencia:

  • Búsqueda lineal para 20 elementos: O(20)

  • Búsqueda dicotómica para 20 elementos: O(log(20)) = O(1,3)

  • Búsqueda linea para 20.000.000.000 elementos: O(20.000.000.000)

  • Búsqueda dicotómica apra 20.000.000.000 elementos: O(10,3)

Fijate la diferencia que hay. Para 20 elementos es ya brutal (6,5 veces más eficiente), pero para 20 mil millones....paso de calcularlo siquiera.

No se trata de lo más fácil, sino de lo más óptimo. Para este caso, que es un vector de elementos ordenados, una búsqueda dicotómica es mejor que una lineal.

2 1 respuesta
B

Muy interesante para realizar búsquedas en listas ordenadas, buen hilo.

S

En char bandera='F'; he parado de leer

Zuki

#14 Entiendo lo que dices y es totalmente lógico, yo me refería para este caso en concreto, un vector con pocos elementos que es fácil de recorrer y la perdida de rendimiento es practicamente nula.

Además, pienso que si en un futuro el usuario es el que introduce los datos de forma no ordenada ese tipo de búsqueda no funcionaría ¿no?

PD. Hace muchos años que hice programación y estoy un poco oxidado de ahí mi curiosidad.

1 respuesta
Grise

#17 Si el array está ordenado la búsqueda lineal siempre es la más ineficiente y si está desordenado tienes otras soluciones mucho más eficientes que recorrer a pelo el array. Por ejemplo:

  • Si tienes “muchos” elementos (a partir de 10e5 ya lo vas a notar) puedes usar tablas Hash.
  • Si vas a buscar varias veces en el array es más eficiente aplicar un algoritmo de ordenación y luego cualquier algoritmo de búsqueda no lineal.
  • Si sabes programación concurrente puedes dividir el array en varios trozos y usar varios hilos para que busquen de manera simultánea la solución.

Para el caso de un ejercicio de clase que tienes 10, 20 o 100 elementos la diferencia es una mierda y lo puedes hacer lineal tranquilamente. Preguntas de este estilo siempre las hacen en las entrevistas para pillar a los pardillitos que programan solamente pensando en el mejor caso.

1 respuesta
Zuki

#18 Gracias por la información, después de leerte me ha venido un flashback de la hostia recordando lo que comentas (hace 10 años que no toco nada de programación).

Usuarios habituales