@@rodrigoe.martinmusri8775 Falleció, lamentablemente, de cáncer de rodilla. Le salió varias veces en la rodilla derecha, luego en la izquierda y terminó por expandirse hacia sus pulmones. Jamás dijo una palabra al respecto porque pensaba que saldría de esa situación.
@@SimonRRFTP waoooo, que noticia tan trágica. Este chico tenía muchísimo potencial como programador. Y supongo que tenía que ser una buena persona igual.
Es notable la pasión que tenías para explicar y ejemplificar. Descansa en paz Alejandro, tus enseñanzas y conocimientos siempre dejarán un buen legado en tu memoria.
Programa resuelto: #include #include #include using namespace std; int main(){ //Info int vec[USHRT_MAX]; int inf = 0, mid, sup, dato, n; //Conteo int i = 0; char band = 'F'; //Ordenamiento int pos, aux; //Opcion int opcion; //INGRESO DE DATOS cout
Mh... es buena la idea pero te voy a poner un contexto diferente, una lista de 500 números, mitad inicia en 250 y en "dato" a buscar es 10, teniendo como proceso el código del video numeros[mitad] (en este caso 500), ágamos el procedimiento: Se sumaria (inf + sup)/2 (0+255)/2 = 127.5 (que se redondea a 128 creo) Ahora tomemos como base tu código números mitad] es mayor que "dato", entonces ahora sup valdría 449 y ahora vamos a hacer la cuenta (inf + sup)/2 (0 + 449)/2 = 224.5 Como vez en el caso de video dimos un salto de 128 números, mientras que en tu propuesta solo restamos 1 Espero poder haber ayudado, igual puedes retroalimentar si me falto algo
@@Ary_Daniel Hola, no soy yo el del comentario pero si, si tienes un 127.5 y lo vas a almacenar en una variable entera, el numero se almacenara sin su parte decimal, es decir el .5 no se va a guardar ni redondear, simplemente se quedara en 127 Espero haber ayudado, saludos.
/*Hola, este programa fue hecho con la intencion de hacer cualquier tipo de busqueda*/ #include #include using namespace std; int main () { int arreglo [100]; int dato=0; int numero; int pos = 0; char band = 'F'; coutnumero; coutdato; for (int i=0; i
¡Hola! Una mini observación :D Ese break está de más. Podrías poner en el while otra condición para que corte cuándo la bandera sea 'V', es decir: while(inf < superior && band == 'V')... y también el char podría ser un bool, creo que es un poco más práctico. ¡Gracias por el tuto!
Hoy estoy a punto de entrar a un concurso de programación, y la verdad no estudié nada😔, pero espero que tú vídeo me ayude de algo antes del examen, gracias por todo Alejandro Taboada ❤
Una cosa, tiene un fallo ya que si al principio introduces un número que no está en el arreglo el programa se vuelve infinito ya que de todas maneras entra al While pero como nunca se cumplen las condiciones pues se sigue corriendo y nunca encuentra nada, ejemplo: El arreglo tiene {2,4,6,8} Y yo quiero buscar el número 5 que no está en el arreglo así que entra pero como el número no está pues nunca se va a cumplir la condición de salida que en este caso es: if(numeros[mitad]==dato){ Band='V' Break; } Entonces como nunca va a ser igual porque el número 5 no está en el arreglo pues se vuelve infinito. Mi solución es que se lleve un conteo de cuantas veces se hace el while y si se hace más veces que el número de posiciones del arreglo declarado pues se salga, ejemplo: If(conteo==posiciones_del_arreglo){ Break; } Conteo++; En este caso en cada vuelta lo va a comparar y si ya se hizo las veces que hay de posiciones del arreglo pues por lógica quiere decir que ya no está el número. Buen video
Para los que no entendieron bien la busqueda binaria primero cambien en su mente inf sup y mitad. solo piensen que son tres apuntadores o indices respectivamente. Bueno el apuntador 1 deberia ubicarse en la posicion 0 y el apuntador 2 en la ultima posicion . y el apuntador medio osea el 3 sale de la operacion ap1 + ap2 / 2 osea que si tenemos 5 elementos seria 5 + 0 / 2 ; bueno luego se pregunta si numeros ose ael arreglo en la posicion que esta el apuntador 3 que seria 5 / 2 seria 2,5 pero siempre se le hace un floor osea redondear hacia abajo osea 2 . y si no es igual al dato que estamos pidiendo pues pasa al siguiente if y se pregunta si numero[apuntador 3('el del medio') ] es mayor dato por eso es que siempre debe estar ordenado el arreglo y para algo aprendimos los ordenamientos, Bueno si es mayor lo que hace es que al apuntador 2 que estaba quieto le pasamos la posicion del apuntador 3 y entonces hacemos de nuevo la division esa. ap1 + ap / 2 y entonces gracias a esta division ubicamos el apuntador 3 . entonces el ap2 es para que cada vez se vaya reduciendo los numeros y luego el apuntador medio encuentre el valor . Siguiendo la explicacion pues repite el ciclo y se pregunta si ya encontro el valor . si no vuelve a hacer lo que explique hasta reducir ha los mas minimo y encontrar el valor. ENTONCES EL APUNTADOR 3 O MEDIO ES EL QUE NOS ENCUENTRA EL VALOR DEPENDIENDO DE LAS POSICIONES DEL 1 Y EL 2 ENTONCES CUANDO SE PREGUNTA SI ES MAYOR O MENOR HACE EL INTERCAMBIO DE LA POSICION QUE ESTA MEDIO A LA POSICION DEL APUNTADOR DOS O UNO DEPENDIENDO SI ES MAYOR O MENOR Y ASI VUELVE A HACE LA DIVISION COMO DIJE PARA REDUCIR LOS ELEMNTOS HASTA ENCONTRAR Y PONER LA BANDERA EN 'v' DND. POSTADATA: IMAGINENSE CUADRADITOS QUE SON LAS POSICIONES Y VAYAN HACIENDO LO QUE EXPLIQUE
Declaré un vector con elementos de 1 al 9, y cuando de dato pongo un número de 2 cifras el programa compila, pero no hace nada, en cambio cuando de dato pongo un 0 hasta 9 o del 1 negativo al 9 negativo, el programa compila y sí me dice si el dato está en el arreglo o no, alguién podría ayudarme
así men? :,v #include #include using namespace std; int main(){ int numeros[] = {1,2,3,4,5}; int inf,sup,mitad,dato,i; char band='F'; dato = 6; //Algoritmo de la Busqueda Binaria inf = 0; sup = 5; for (int i=0; idato){ sup = mitad; mitad = (inf+sup)/2; } if(numeros[mitad]
Faltaria agregar una cosa mas ya que si deseo buscar el dato 5 me aparece que no esta. Para solucionar esto, si dato es mayor a numeros[mitad] el nuevo infimo sera una posicion mas del mitad actual y si el dato es menor al mitad actual el nuevo supremo sera una posicion menos del mitad actual. Ademas que el sup al inicio debe ser 4 que es el indice del ultimo elemento en el arreglo.
//Mi solución para números que no se encuentren en el arreglo: #include #include using namespace std; int main(){ int numeros[]={1,2,3,4,5}; int inf,sup,mitad,dato; char band = 'F'; dato = 6; //Algoritmo busqueda Binaria inf = 0; sup = 5; while(infdato){ sup=mitad; } if(numeros[mitad]
Hola. Esto funciona cuando el dato que le paso esta en el arreglo, pero cuando le paso un dato que no esta en el arreglo, el ciclo while se ejecuta infinitamente sin terminar. Use el mismo codigo del ejemplo y creo que no tengo ningun error, pero no puedo encontrar el motivo por que el else del if nunca se ejecuta . Por favor si podes, comprobalo ingresando algun dato que no este en el array. Gracias por los tutoriales, saludos!
Asi es como lo arregle yo: puse un contador (i) que este lo ponia menor al numero de elementos del vector y al final de todos los if le puse el i++; aqui el codigo: //Busqueda Binaria #include #include using namespace std; int main (){ int numeros[]={1,2,3,4,5,6,10,142,1000}; int inf,sup,mitad,dato,i; char band = 'F'; cout dato; //Algoritmo de Busqueda Binaria inf = 0; sup = 9; i = 0; while ((inf dato){ sup = mitad; mitad = (inf + sup)/2; } if (numeros [mitad]
+Terror HD No hace falta esa variable adicional aunque si el codigo funciona es igualmente valido. Cuando mitad > dato, superior es igual a mitad - 1 y cuando mitad < dato, inferior es igual a mitad + 1. Solo hay que restar y sumar una unidad a la variable mitad en los if para que el codigo funcione...Saludos
Tal vez sea tarde(2 años tarde jajaja). Pero lo que hace esta haciendo es intervalos cada vez más pequeños hasta encontrar el numero deseado. Este programa me recuerda a un un método numérico .
Hace 1 segundo Para los que no entendieron bien la busqueda binaria primero cambien en su mente inf sup y mitad. solo piensen que son tres apuntadores o indices respectivamente. Bueno el apuntador 1 deberia ubicarse en la posicion 0 y el apuntador 2 en la ultima posicion . y el apuntador medio osea el 3 sale de la operacion ap1 + ap2 / 2 osea que si tenemos 5 elementos seria 5 + 0 / 2 ; bueno luego se pregunta si numeros ose ael arreglo en la posicion que esta el apuntador 3 que seria 5 / 2 seria 2,5 pero siempre se le hace un floor osea redondear hacia abajo osea 2 . y si no es igual al dato que estamos pidiendo pues pasa al siguiente if y se pregunta si numero[apuntador 3('el del medio') ] es mayor dato por eso es que siempre debe estar ordenado el arreglo y para algo aprendimos los ordenamientos, Bueno si es mayor lo que hace es que al apuntador 2 que estaba quieto le pasamos la posicion del apuntador 3 y entonces hacemos de nuevo la division esa. ap1 + ap / 2 y entonces gracias a esta division ubicamos el apuntador 3 . entonces el ap2 es para que cada vez se vaya reduciendo los numeros y luego el apuntador medio encuentre el valor . Siguiendo la explicacion pues repite el ciclo y se pregunta si ya encontro el valor . si no vuelve a hacer lo que explique hasta reducir ha los mas minimo y encontrar el valor. ENTONCES EL APUNTADOR 3 O MEDIO ES EL QUE NOS ENCUENTRA EL VALOR DEPENDIENDO DE LAS POSICIONES DEL 1 Y EL 2 ENTONCES CUANDO SE PREGUNTA SI ES MAYOR O MENOR HACE EL INTERCAMBIO DE LA POSICION QUE ESTA MEDIO A LA POSICION DEL APUNTADOR DOS O UNO DEPENDIENDO SI ES MAYOR O MENOR Y ASI VUELVE A HACE LA DIVISION COMO DIJE PARA REDUCIR LOS ELEMNTOS HASTA ENCONTRAR Y PONER LA BANDERA EN 'v' DND. POSTADATA: IMAGINENSE CUADRADITOS QUE SON LAS POSICIONES Y VAYAN HACIENDO LO QUE EXPLIQUE
@@promipicode gracias men lo entendí con tu explicación solo me hacía falta que alguien lo explicara detalladamente, ahora si tiene sentido, estaba difícil pero ahora como lo entiendo no, supongo que es cuestión de practicar, un saludo.
Alejandro inmensamente agradecido con tus videos, lastima que ya no entre nosotros. Nota: Acostumbro a realizar cada ejercicio visto en el video, en esta ocasión para quienes no lo hacen, recomendaría descargar el ejercicio ya que si asignamos un dato diferente al arreglo no sale nada.
A mí me pasó lo mismo, lo he comparado con el ejercicio a descargar y me he fijado en que pone un iterador i para salir del bucle while en caso de no encontrar el dato. Tal y como está en el vídeo el programa solo puede salir del bucle si el dato está en el arreglo.
bueno deje aca mi programa puse al final en un condicional if que si numeros[mitad] != dato, entonces el programa se cierre con un break. también deje indicaciones por todo el programa espero que les sirva chicos. deje comentarios como guia para entenderlo pongalo en su programa de c++. //Busqueda Binaria. la busqueda debe ser 1.2.3.4.5 o sea ascendente . ira diviendo el numero hasta que lo encuentre y se haga break #include #include using namespace std;// 2 int main(){// 0 1 m 3 4 int numeros[]={1,2,3,4,5}; int inf, sup, mitad, dato; char band = 'F';
dato = 4; //Algoritmo de la Busqueda Binario inf = 0;//limite inferior del arreglo (0).1.2.3.4 sup = 4;//limite superior del arreglo 0.1.2.3.(4) while(inf dato=. ej 3>2 si sup = mitad; //entonces sede su valor a sup. entonces superior=3 mitad= (inf+sup)/2; //0+3/2= 1. (el numero esta en la posicion 1). y es el numero 2 en nuestro arreglo } if(numeros[mitad] < dato){ //si la posicion[mitad] < dato. 3
Este video de esta plataforma me ayudo a retomar temas que no sabía y mejorar un poco en mi programación respecto a este programa aplicarlo en mis actividades CECyT_14_4IV5_Ivan_Emmanuel_S
No entiendo por qué refresca la variable mitad en cada ciclo, si cuando sale y se vuelve a ejecutar el while se refresca en la primera instrucción, es necesario refrescarlo en cada if?. Yo lo hice sólo modificando las variables sup e inf y me funciona bien.
La busqueda binaria es una busqueda que se da entre un conjunto de elementos ordenados en base a algun criterio, en donde se define una funcion que va subdividiendo la lista en dos mitades a cada paso hasta hallar el elemento buscado. Por eso es tan hermosa...
/* El programa hecho por Alejandro tenia problemas para numeros que no pertenecen al vector. Abajo dejo una posible solucion a este problema. */ #include #include using namespace std; int main(){ int numeros[] = {1,2,3,4,5}; // es necesario que la cadena este ordenada int inf = -1,sup = 5,dato,mitad; char band = 'F'; coutdato; //Algoritmo de la busqueda binaria; while((inf < sup-1) && (sup > inf+1)) { mitad = (inf+sup)/2;
Es super bueno tus videos se te agradece bastante,saludos cordiales. una consulta necesito hacer una busqueda recursiva en un arreglo pero hasta ahora no lo puedo terminar, agradeceria bastante tu ayuda.
Amigo el algoritmo no funciona para numeros que no estén en el arreglo , yo personalmente lo arregle colocando un condicional extra if ( ( inferior == ( posicion final del arreglo) or inferior == ( posicion inicial del arreglo) ) and vector[ posicion ] != dato ) break; lo probe y me funciona , me gustaria saber como seria tu logica para resolver ese problema. saludos . P.D.: Buen trabajo el que has hecho , gracias
amigo mío yo creo que ya es muy tarde para dialogar sobre esto pero yo lo resolví mucho mas rápido, añadí al ciclo while la condición de que un itinerante sea menor al numero de elementos del arreglo y al final de siclo añadí un i++, así hice que cuando el ciclo recorriera todo el arreglo y no encontrase el dato terminara el ciclo.
PASARON 3 AñOS PERO BUENO . Alejandro Reina Hace 1 segundo Para los que no entendieron bien la busqueda binaria primero cambien en su mente inf sup y mitad. solo piensen que son tres apuntadores o indices respectivamente. Bueno el apuntador 1 deberia ubicarse en la posicion 0 y el apuntador 2 en la ultima posicion . y el apuntador medio osea el 3 sale de la operacion ap1 + ap2 / 2 osea que si tenemos 5 elementos seria 5 + 0 / 2 ; bueno luego se pregunta si numeros ose ael arreglo en la posicion que esta el apuntador 3 que seria 5 / 2 seria 2,5 pero siempre se le hace un floor osea redondear hacia abajo osea 2 . y si no es igual al dato que estamos pidiendo pues pasa al siguiente if y se pregunta si numero[apuntador 3('el del medio') ] es mayor dato por eso es que siempre debe estar ordenado el arreglo y para algo aprendimos los ordenamientos, Bueno si es mayor lo que hace es que al apuntador 2 que estaba quieto le pasamos la posicion del apuntador 3 y entonces hacemos de nuevo la division esa. ap1 + ap / 2 y entonces gracias a esta division ubicamos el apuntador 3 . entonces el ap2 es para que cada vez se vaya reduciendo los numeros y luego el apuntador medio encuentre el valor . Siguiendo la explicacion pues repite el ciclo y se pregunta si ya encontro el valor . si no vuelve a hacer lo que explique hasta reducir ha los mas minimo y encontrar el valor. ENTONCES EL APUNTADOR 3 O MEDIO ES EL QUE NOS ENCUENTRA EL VALOR DEPENDIENDO DE LAS POSICIONES DEL 1 Y EL 2 ENTONCES CUANDO SE PREGUNTA SI ES MAYOR O MENOR HACE EL INTERCAMBIO DE LA POSICION QUE ESTA MEDIO A LA POSICION DEL APUNTADOR DOS O UNO DEPENDIENDO SI ES MAYOR O MENOR Y ASI VUELVE A HACE LA DIVISION COMO DIJE PARA REDUCIR LOS ELEMNTOS HASTA ENCONTRAR Y PONER LA BANDERA EN 'v' DND. POSTADATA: IMAGINENSE CUADRADITOS QUE SON LAS POSICIONES Y VAYAN HACIENDO LO QUE EXPLIQUE
buenas!! la verdad muy buenos bideos me han servido mucho para amigarme con el lenguaje. Me surgio una pregunta respecto a las banderas no seria mejor usar una variable booleana para esos casos? al fin y al cabo estan para representar verdaderos y falsos. muchas gracias por todo. Saludos
Efectivamente, es mejor usar variables de tipo bool (principalmente por cuestiones de memoria). Aunque en estos casos no afecta por la simplicidad del código, es un factor importante a considerar. Saludos.
el bucle se corrige con un bucle for o restringiendo mas la condicion en el bucle while #include #include #include #include #include using namespace std; int main(){ int arreglo[]= {1,2,3,4,5,6,7,8,9,10}; int dato=81, inf=0, sup=10, mitad=0; char band= 'F'; int i=0; while ( (inf
#include using namespace std; int main() { int A[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int inf, med,sup, a; int dato = 4; char ban = 'f'; inf = A[0]; sup = A[9]; for (int i = 0; i < 10; ++i) { a =i; med = (sup + inf)/2; if (dato == A[med] || dato == A[inf] || dato == A[sup]){ ban = 'v'; break; }else if (dato > A[med]){ // el med+1 es por que como la condicion anterior comprobo que no es el del medio // entonces asignamos la siguiente. inf = med + 1; }else if (dato < A[med]){ // igualmente el med-1 para ahorar iteraciones sup = med - 1; } } if (ban == 'v'){ cout
@@diegoosorio3838 cuando las posiciones son iguales en las busqueda binaria significa que el codigo ya cumplio su funcion, entonces ya debe dejar de ejecutarse
Esa no es la solución, ya que el inferior siempre va a quedar por debajo del superior en una unidad, y por eso el programa cae en un ciclo infinito. Una solución sería poner lo siguiente: while (sup > inf + 1) {...}
Yo hice un ejercicio completo de busqueda binaria. Tal vez me compliqué haciéndolo pero funciona. Aqui se los pongo: #include using namespace std; int main(){
Hola Alejandro y seguidores del curso Tengo un duda: if(numeros[mitad] == dato){ band = 'V'; break; } if(numeros[mitad] > dato){ //¿porqué no debo omitir introducir estos dos if del código? sup = mitad; // para los casos que sea > a dato y para el caso que mitad = (inf+sup)/2; // sea < a dato? } // al omitirlos no imprime nada. if (numeros[mitad] < dato){ // ¿estos dos if representan a else? inf = mitad; mitad = (inf+sup)/2; }
una cosa curiosa que no pronuncias es que inferior es = 0, pero el cero se cuenta y superior =5 pero el 5 se cuenta, osease 0,1,2,3,4,5 son 6 numeros!! y en la busqueda cuenta los 6 pero el vector solo tiene 0,1,2,3,4 solo tiene 5 numeros!! curioso !!
am> #include #include #include #include using namespace std; int main(){ int arreglo[]= {1,2,3,4,5,6,7,8,9,10}; int dato=15, inf=0, sup=10, mitad=0; char band='F';
for ( int i=0 ; i dato){ sup= mitad; } else if ( mitad
Solución definitiva: Viendo la solución en el video y leyendo y contrastando con los comentarios/rectificaciones del resto de usuarios, me atrevo a subir una solución explicada paso a paso para que se entienda. /*Video 54- || Búsquedas || Búsqueda BINARIA realizado por: S.M.F. */ //Búsqueda Binaria: Se utiliza cuando el vector en el que queremos //determinar la existencia de un elemento está previamente ordenado. //Este algoritmo reduce el tiempo de búsqueda considerablemente, //ya que disminuye exponencialmente el número de iteraciones necesarias. //definición:Compara el valor con el elemento en el medio del array, si no son iguales, //la mitad en la cual el valor no puede estar es eliminada y la búsqueda continúa //en la mitad restante hasta que el valor se encuentre. #include #include using namespace std; //nota: necesitamos que esté ordenado en orden ascendente
Disculpa se que no viene al tema pero fijate que tengo que hacer un simulación de un cajero automatico en C# no se si has trabajado en este lengua sera que me podrias apoyar...
Alejandro Reina Hace 1 segundo Para los que no entendieron bien la busqueda binaria primero cambien en su mente inf sup y mitad. solo piensen que son tres apuntadores o indices respectivamente. Bueno el apuntador 1 deberia ubicarse en la posicion 0 y el apuntador 2 en la ultima posicion . y el apuntador medio osea el 3 sale de la operacion ap1 + ap2 / 2 osea que si tenemos 5 elementos seria 5 + 0 / 2 ; bueno luego se pregunta si numeros ose ael arreglo en la posicion que esta el apuntador 3 que seria 5 / 2 seria 2,5 pero siempre se le hace un floor osea redondear hacia abajo osea 2 . y si no es igual al dato que estamos pidiendo pues pasa al siguiente if y se pregunta si numero[apuntador 3('el del medio') ] es mayor dato por eso es que siempre debe estar ordenado el arreglo y para algo aprendimos los ordenamientos, Bueno si es mayor lo que hace es que al apuntador 2 que estaba quieto le pasamos la posicion del apuntador 3 y entonces hacemos de nuevo la division esa. ap1 + ap / 2 y entonces gracias a esta division ubicamos el apuntador 3 . entonces el ap2 es para que cada vez se vaya reduciendo los numeros y luego el apuntador medio encuentre el valor . Siguiendo la explicacion pues repite el ciclo y se pregunta si ya encontro el valor . si no vuelve a hacer lo que explique hasta reducir ha los mas minimo y encontrar el valor. ENTONCES EL APUNTADOR 3 O MEDIO ES EL QUE NOS ENCUENTRA EL VALOR DEPENDIENDO DE LAS POSICIONES DEL 1 Y EL 2 ENTONCES CUANDO SE PREGUNTA SI ES MAYOR O MENOR HACE EL INTERCAMBIO DE LA POSICION QUE ESTA MEDIO A LA POSICION DEL APUNTADOR DOS O UNO DEPENDIENDO SI ES MAYOR O MENOR Y ASI VUELVE A HACE LA DIVISION COMO DIJE PARA REDUCIR LOS ELEMNTOS HASTA ENCONTRAR Y PONER LA BANDERA EN 'v' DND. POSTADATA: IMAGINENSE CUADRADITOS QUE SON LAS POSICIONES Y VAYAN HACIENDO LO QUE EXPLIQUE
Lo aprenderé, aunque viendo el algoritmo entre secuencial y binaria, notó muchísimo mejor la secuencial, al final suelo copiar el contenido de un array a otra y ordenarla, ahí podría probar la binaria.
Aquí mi código para que funcione incluso cuando añades un dato que no está dentro del arreglo. #include #include using namespace std; int main(){ int numeros[]={1,2,3,4,5}; int inf,sup,mitad,dato,contador = 0; char band = 'F'; inf = 0; sup = 5; cout > dato; for(int i=0;i
3 ปีที่แล้ว +2
Buenas! El vídeo esta muy bien, tiene una falla, y es que si el arreglo tiene un salto de numero, o un numero en el medio NO está. FALLA. Les dejo un vídeo con con un algoritmo similar de búsqueda binaria , pero que contempla cuando al arreglo le falta un numero, o no son numero consecutivos. th-cam.com/video/6jfQ3AGACcM/w-d-xo.html
El siguiente programa resuelve los problemas de búsquedas fuera del rango (mayor que sup y menor que inf) y datos intermedios que no están en el arreglo: #include #include using namespace std; int main() { int numeros[] = { 2, 4, 6, 7, 9 }; int inf, sup, mitad, dato, pos; // La variable pos es la posición en el arreglo. char band = 'F'; dato = 9; // El número a buscar. inf = 2; sup = 9; if ((dato > sup) || (dato < inf)) { cout
💻 Apúntate al curso completo de Programación en C++:
Hotmart: hotmart.com/es/marketplace/productos/programacion-en-c-v0ivo/N78682741H
Que pasa si en la búsqueda binaria algún número está repetido
@@mercedeslanzbanquet3730 amiguito programacion ats murio :'C.
Alejandro a fallecido.
fe de erratas //el numero no //ha// en vez de // a// o sea del verbo haber.
@@sebastihb2906 QUEEEEEEEEEEEEE
Uno poco tarde evidentemente, acabo de enterarme de que ya no estas entre nosotros. Gracias por tu tiempo y dedicación. Descansa
?
@@artoriasof_the_abyss7710 fallecio el estimado ATS :(
Me quede de piedra, que le paso?
@@rodrigoe.martinmusri8775 Falleció, lamentablemente, de cáncer de rodilla. Le salió varias veces en la rodilla derecha, luego en la izquierda y terminó por expandirse hacia sus pulmones.
Jamás dijo una palabra al respecto porque pensaba que saldría de esa situación.
@@SimonRRFTP waoooo, que noticia tan trágica. Este chico tenía muchísimo potencial como programador. Y supongo que tenía que ser una buena persona igual.
Es notable la pasión que tenías para explicar y ejemplificar. Descansa en paz Alejandro, tus enseñanzas y conocimientos siempre dejarán un buen legado en tu memoria.
Murió?😮😢
@@victorhugobuenomolina7204 Hace ya tiempo...
Programa resuelto:
#include
#include
#include
using namespace std;
int main(){
//Info
int vec[USHRT_MAX];
int inf = 0, mid, sup, dato, n;
//Conteo
int i = 0;
char band = 'F';
//Ordenamiento
int pos, aux;
//Opcion
int opcion;
//INGRESO DE DATOS
cout
la condición del while simplemente debería de ser:
while(inf
Mh... es buena la idea pero te voy a poner un contexto diferente, una lista de 500 números, mitad inicia en 250 y en "dato" a buscar es 10, teniendo como proceso el código del video numeros[mitad] (en este caso 500), ágamos el procedimiento:
Se sumaria (inf + sup)/2
(0+255)/2 = 127.5 (que se redondea a 128 creo)
Ahora tomemos como base tu código números mitad] es mayor que "dato", entonces ahora sup valdría 449 y ahora vamos a hacer la cuenta
(inf + sup)/2
(0 + 449)/2 = 224.5
Como vez en el caso de video dimos un salto de 128 números, mientras que en tu propuesta solo restamos 1
Espero poder haber ayudado, igual puedes retroalimentar si me falto algo
@@Ary_Daniel Si no me equivoco, la división entera elimina el resto; es decir, siempre se trunca
@@nicoblanco8541 Te refieres a que el 127.5 se redonde a 127, acaso e entendido bien?
@@Ary_Daniel Hola, no soy yo el del comentario pero si, si tienes un 127.5 y lo vas a almacenar en una variable entera, el numero se almacenara sin su parte decimal, es decir el .5 no se va a guardar ni redondear, simplemente se quedara en 127
Espero haber ayudado, saludos.
3 años después y sigo aqui aprendiendo y prácticando para concursos, gracias por todo ATS
/*Hola, este programa fue hecho con la intencion de hacer cualquier tipo de busqueda*/
#include
#include
using namespace std;
int main () {
int arreglo [100];
int dato=0;
int numero;
int pos = 0;
char band = 'F';
coutnumero;
coutdato;
for (int i=0; i
¡Hola! Una mini observación :D Ese break está de más. Podrías poner en el while otra condición para que corte cuándo la bandera sea 'V', es decir: while(inf < superior && band == 'V')... y también el char podría ser un bool, creo que es un poco más práctico. ¡Gracias por el tuto!
gracias amigo, fuiste y sos de gran ayuda, siempre vuelvo a tus videos. Que tristeza :(
Hoy estoy a punto de entrar a un concurso de programación, y la verdad no estudié nada😔, pero espero que tú vídeo me ayude de algo antes del examen, gracias por todo Alejandro Taboada ❤
Una cosa, tiene un fallo ya que si al principio introduces un número que no está en el arreglo el programa se vuelve infinito ya que de todas maneras entra al While pero como nunca se cumplen las condiciones pues se sigue corriendo y nunca encuentra nada, ejemplo:
El arreglo tiene {2,4,6,8}
Y yo quiero buscar el número 5 que no está en el arreglo así que entra pero como el número no está pues nunca se va a cumplir la condición de salida que en este caso es:
if(numeros[mitad]==dato){
Band='V'
Break;
}
Entonces como nunca va a ser igual porque el número 5 no está en el arreglo pues se vuelve infinito.
Mi solución es que se lleve un conteo de cuantas veces se hace el while y si se hace más veces que el número de posiciones del arreglo declarado pues se salga, ejemplo:
If(conteo==posiciones_del_arreglo){
Break;
}
Conteo++;
En este caso en cada vuelta lo va a comparar y si ya se hizo las veces que hay de posiciones del arreglo pues por lógica quiere decir que ya no está el número. Buen video
hasta que encontré tu comentario; Buena solución y gracias
lo mismo observe, gracias por el consejo
Gracias por la observación amigo, ya me funcionó al 100, saludos!
Para los que no entendieron bien la busqueda binaria primero cambien en su mente inf sup y mitad. solo piensen que son tres apuntadores o indices respectivamente. Bueno el apuntador 1 deberia ubicarse en la posicion 0 y el apuntador 2 en la ultima posicion . y el apuntador medio osea el 3 sale de la operacion ap1 + ap2 / 2 osea que si tenemos 5 elementos seria 5 + 0 / 2 ;
bueno luego se pregunta si numeros ose ael arreglo en la posicion que esta el apuntador 3 que seria 5 / 2 seria 2,5 pero siempre se le hace un floor osea redondear hacia abajo osea 2 . y si no es igual al dato que estamos pidiendo pues pasa al siguiente if y se pregunta si numero[apuntador 3('el del medio') ] es mayor dato por eso es que siempre debe estar ordenado el arreglo y para algo aprendimos los ordenamientos, Bueno si es mayor lo que hace es que al apuntador 2 que estaba quieto le pasamos la posicion del apuntador 3 y entonces hacemos de nuevo la division esa. ap1 + ap / 2 y entonces gracias a esta division ubicamos el apuntador 3 . entonces el ap2 es para que cada vez se vaya reduciendo los numeros y luego el apuntador medio encuentre el valor . Siguiendo la explicacion pues repite el ciclo y se pregunta si ya encontro el valor . si no vuelve a hacer lo que explique hasta reducir ha los mas minimo y encontrar el valor. ENTONCES EL APUNTADOR 3 O MEDIO ES EL QUE NOS ENCUENTRA EL VALOR DEPENDIENDO DE LAS POSICIONES DEL 1 Y EL 2 ENTONCES CUANDO SE PREGUNTA SI ES MAYOR O MENOR HACE EL INTERCAMBIO DE LA POSICION QUE ESTA MEDIO A LA POSICION DEL APUNTADOR DOS O UNO DEPENDIENDO SI ES MAYOR O MENOR Y ASI VUELVE A HACE LA DIVISION COMO DIJE PARA REDUCIR LOS ELEMNTOS HASTA ENCONTRAR Y PONER LA BANDERA EN 'v' DND.
POSTADATA: IMAGINENSE CUADRADITOS QUE SON LAS POSICIONES Y VAYAN HACIENDO LO QUE EXPLIQUE
Explica muy bien,esto hace que se facilite todo pero si esta un poco más fácil el anterior
Ximena M 4IV5 cecyt 14
EXELENTE BRO!!! Haces que sea sencillo programar... exitos y saludos desde lima-peru
El ya murió
Muy buena aporte! , un plus sería como usar la *búsqueda binaria para buscar un número que aparezca varias veces en el arreglo*
Hay un pequeño fallo en el algoritmo del video la solucion mas eficas que se me ocurre es hacer el siguiente cambio :
While((inf+1)!=sup)
También noté ese fallo. Y es buena tu solución
While(inc!=sup) sino la posición 0 no la reconoce y la da como si estuviese fuera del array
Declaré un vector con elementos de 1 al 9, y cuando de dato pongo un número de 2 cifras el programa compila, pero no hace nada, en cambio cuando de dato pongo un 0 hasta 9 o del 1 negativo al 9 negativo, el programa compila y sí me dice si el dato está en el arreglo o no, alguién podría ayudarme
Exactamente esa es la solucion, muchas gracias por compartir
@TigerXV Agregé esta condición al while y me funcionó bien, podrías probar:
if((numeros[mitad]==sup)&&(numeros[mitad]
En el video te falto poner la condicion en el mientras de i
así men? :,v
#include
#include
using namespace std;
int main(){
int numeros[] = {1,2,3,4,5};
int inf,sup,mitad,dato,i;
char band='F';
dato = 6;
//Algoritmo de la Busqueda Binaria
inf = 0;
sup = 5;
for (int i=0; idato){
sup = mitad;
mitad = (inf+sup)/2;
}
if(numeros[mitad]
Lucas Fiedorowicz mas sencillo:
While((inf+1)!=sup)
@@Adolin.Kholin. Gracias crack
hola siempre veo tus tutoriales ,son increíbles. Me gustaría que hagas uno de búsqueda binaria con apuntadores te lo agradecería bastante.
Ya que la variable band es F o V, creo que tendria mas sentido usar una variable de tipo boolean.
Por que no usas los datos booleanos para los flags?
@Jonas Lara si que existen
Faltaria agregar una cosa mas ya que si deseo buscar el dato 5 me aparece que no esta. Para solucionar esto, si dato es mayor a numeros[mitad] el nuevo infimo sera una posicion mas del mitad actual y si el dato es menor al mitad actual el nuevo supremo sera una posicion menos del mitad actual. Ademas que el sup al inicio debe ser 4 que es el indice del ultimo elemento en el arreglo.
te amo
yo también te amo
//Mi solución para números que no se encuentren en el arreglo:
#include
#include
using namespace std;
int main(){
int numeros[]={1,2,3,4,5};
int inf,sup,mitad,dato;
char band = 'F';
dato = 6;
//Algoritmo busqueda Binaria
inf = 0;
sup = 5;
while(infdato){
sup=mitad;
}
if(numeros[mitad]
Gracias, bro
Donde sea que esté, gracias por todo, profe.
Muchas gracias, me estas ayudando mucho con tus videos
Hola.
Esto funciona cuando el dato que le paso esta en el arreglo, pero cuando le paso un dato que no esta en el arreglo, el ciclo while se ejecuta infinitamente sin terminar. Use el mismo codigo del ejemplo y creo que no tengo ningun error, pero no puedo encontrar el motivo por que el else del if nunca se ejecuta . Por favor si podes, comprobalo ingresando algun dato que no este en el array.
Gracias por los tutoriales, saludos!
Asi es como lo arregle yo: puse un contador (i) que este lo ponia menor al numero de elementos del vector y al final de todos los if le puse el i++; aqui el codigo:
//Busqueda Binaria
#include
#include
using namespace std;
int main (){
int numeros[]={1,2,3,4,5,6,10,142,1000};
int inf,sup,mitad,dato,i;
char band = 'F';
cout dato;
//Algoritmo de Busqueda Binaria
inf = 0;
sup = 9;
i = 0;
while ((inf dato){
sup = mitad;
mitad = (inf + sup)/2;
}
if (numeros [mitad]
+Terror HD No hace falta esa variable adicional aunque si el codigo funciona es igualmente valido. Cuando mitad > dato, superior es igual a mitad - 1 y cuando mitad < dato, inferior es igual a mitad + 1.
Solo hay que restar y sumar una unidad a la variable mitad en los if para que el codigo funcione...Saludos
Pues yo lo pense asi xD, pero voy a ver lo que dices, lo que yo hice me funciono :D
PD: Efectivamente, me funciono tu metodo gracias!!
Muchas gracias bro me estube rompiendo la cabeza y no encontraba el error, se te agradece.
Esteban Gomez
Tienes razón, así funciona, pero no logro entender por qué. ^_^
D.E.P siempre con nosotros
Se murió el vato?
Como te extrañamos.
Disculpe compa podría explicar el código como el vídeo anterior
jajaja yo tampoco entendí la lógica del algoritmo
No entendí un carajo
Tal vez sea tarde(2 años tarde jajaja). Pero lo que hace esta haciendo es intervalos cada vez más pequeños hasta encontrar el numero deseado. Este programa me recuerda a un un método numérico .
Hace 1 segundo
Para los que no entendieron bien la busqueda binaria primero cambien en su mente inf sup y mitad. solo piensen que son tres apuntadores o indices respectivamente. Bueno el apuntador 1 deberia ubicarse en la posicion 0 y el apuntador 2 en la ultima posicion . y el apuntador medio osea el 3 sale de la operacion ap1 + ap2 / 2 osea que si tenemos 5 elementos seria 5 + 0 / 2 ;
bueno luego se pregunta si numeros ose ael arreglo en la posicion que esta el apuntador 3 que seria 5 / 2 seria 2,5 pero siempre se le hace un floor osea redondear hacia abajo osea 2 . y si no es igual al dato que estamos pidiendo pues pasa al siguiente if y se pregunta si numero[apuntador 3('el del medio') ] es mayor dato por eso es que siempre debe estar ordenado el arreglo y para algo aprendimos los ordenamientos, Bueno si es mayor lo que hace es que al apuntador 2 que estaba quieto le pasamos la posicion del apuntador 3 y entonces hacemos de nuevo la division esa. ap1 + ap / 2 y entonces gracias a esta division ubicamos el apuntador 3 . entonces el ap2 es para que cada vez se vaya reduciendo los numeros y luego el apuntador medio encuentre el valor . Siguiendo la explicacion pues repite el ciclo y se pregunta si ya encontro el valor . si no vuelve a hacer lo que explique hasta reducir ha los mas minimo y encontrar el valor. ENTONCES EL APUNTADOR 3 O MEDIO ES EL QUE NOS ENCUENTRA EL VALOR DEPENDIENDO DE LAS POSICIONES DEL 1 Y EL 2 ENTONCES CUANDO SE PREGUNTA SI ES MAYOR O MENOR HACE EL INTERCAMBIO DE LA POSICION QUE ESTA MEDIO A LA POSICION DEL APUNTADOR DOS O UNO DEPENDIENDO SI ES MAYOR O MENOR Y ASI VUELVE A HACE LA DIVISION COMO DIJE PARA REDUCIR LOS ELEMNTOS HASTA ENCONTRAR Y PONER LA BANDERA EN 'v' DND.
POSTADATA: IMAGINENSE CUADRADITOS QUE SON LAS POSICIONES Y VAYAN HACIENDO LO QUE EXPLIQUE
@@promipicode gracias men lo entendí con tu explicación solo me hacía falta que alguien lo explicara detalladamente, ahora si tiene sentido, estaba difícil pero ahora como lo entiendo no, supongo que es cuestión de practicar, un saludo.
chabon me re salvaste para la mesa de examen explicas re bien
Jeje, espero que te haya ido bien :)
Alejandro inmensamente agradecido con tus videos, lastima que ya no entre nosotros.
Nota: Acostumbro a realizar cada ejercicio visto en el video, en esta ocasión para quienes no lo hacen, recomendaría descargar el ejercicio ya que si asignamos un dato diferente al arreglo no sale nada.
A mí me pasó lo mismo, lo he comparado con el ejercicio a descargar y me he fijado en que pone un iterador i para salir del bucle while en caso de no encontrar el dato. Tal y como está en el vídeo el programa solo puede salir del bucle si el dato está en el arreglo.
Tienes que añadir un iterador (i) así: while((inf
bueno deje aca mi programa puse al final en un condicional if que si numeros[mitad] != dato, entonces el programa se cierre con un break. también deje indicaciones por todo el programa espero que les sirva chicos.
deje comentarios como guia para entenderlo pongalo en su programa de c++.
//Busqueda Binaria. la busqueda debe ser 1.2.3.4.5 o sea ascendente . ira diviendo el numero hasta que lo encuentre y se haga break
#include
#include
using namespace std;// 2
int main(){// 0 1 m 3 4
int numeros[]={1,2,3,4,5};
int inf, sup, mitad, dato;
char band = 'F';
dato = 4;
//Algoritmo de la Busqueda Binario
inf = 0;//limite inferior del arreglo (0).1.2.3.4
sup = 4;//limite superior del arreglo 0.1.2.3.(4)
while(inf dato=. ej 3>2 si
sup = mitad; //entonces sede su valor a sup. entonces superior=3
mitad= (inf+sup)/2; //0+3/2= 1. (el numero esta en la posicion 1). y es el numero 2 en nuestro arreglo
}
if(numeros[mitad] < dato){ //si la posicion[mitad] < dato. 3
El break que diste para darle salida estuvo super bien , me arreglo muchos problemas, gracias.
Este video de esta plataforma me ayudo a retomar temas que
no sabía y mejorar un poco en mi programación respecto a este programa
aplicarlo en mis actividades
CECyT_14_4IV5_Ivan_Emmanuel_S
No entiendo por qué refresca la variable mitad en cada ciclo, si cuando sale y se vuelve a ejecutar el while se refresca en la primera instrucción, es necesario refrescarlo en cada if?. Yo lo hice sólo modificando las variables sup e inf y me funciona bien.
igual lo pense
Un poco mas complicado que el anterior pero entendible, buen vídeo. cecyt 14 "Luis Enrique Erro" Carlos M 4IV6
La busqueda binaria es una busqueda que se da entre un conjunto de elementos ordenados en base a algun criterio, en donde se define una funcion que va subdividiendo la lista en dos mitades a cada paso hasta hallar el elemento buscado. Por eso es tan hermosa...
/* El programa hecho por Alejandro tenia problemas para numeros que no
pertenecen al vector.
Abajo dejo una posible solucion a este problema.
*/
#include
#include
using namespace std;
int main(){
int numeros[] = {1,2,3,4,5}; // es necesario que la cadena este ordenada
int inf = -1,sup = 5,dato,mitad;
char band = 'F';
coutdato;
//Algoritmo de la busqueda binaria;
while((inf < sup-1) && (sup > inf+1)) {
mitad = (inf+sup)/2;
if(numeros[mitad] == dato){
band = 'V';
break;
}
if(numeros[mitad] > dato){
sup = mitad;
}
if(numeros[mitad] < dato){
inf = mitad;
}
}
if(band == 'V'){
cout
No muestra el mensaje cuando el numero no está en el arreglo.
Carlos Ismael cambia:
While((inf+1)!=sup)
gracias men igual ami no me salia ese mensaje ahora si
//Busqueda Binaria
#include
#include
using namespace std;
int main(){
int sizeA;
int inf,sup,mitad,dato,i;
int band=0;
printf("INDIQUE EL TAMANO DEL ARREGLO:
");
scanf("%d",&sizeA);
int numeros[sizeA];
//Ingreso elementos que conforman arreglo
for (int i=0;i
Hermano, hiciste que esto sonará mucha mas interesante
Es super bueno tus videos se te agradece bastante,saludos cordiales.
una consulta necesito hacer una busqueda recursiva en un arreglo pero hasta ahora no lo puedo terminar, agradeceria bastante tu ayuda.
Amigo el algoritmo no funciona para numeros que no estén en el arreglo , yo personalmente lo arregle colocando un condicional extra
if ( ( inferior == ( posicion final del arreglo) or inferior == ( posicion inicial del arreglo) ) and vector[ posicion ] != dato )
break;
lo probe y me funciona , me gustaria saber como seria tu logica para resolver ese problema.
saludos .
P.D.: Buen trabajo el que has hecho , gracias
amigo mío yo creo que ya es muy tarde para dialogar sobre esto pero yo lo resolví mucho mas rápido, añadí al ciclo while la condición de que un itinerante sea menor al numero de elementos del arreglo y al final de siclo añadí un i++, así hice que cuando el ciclo recorriera todo el arreglo y no encontrase el dato terminara el ciclo.
@@PokedecksTCGPocket tu eres el que llego tarde wtf
@@DIEGO.zzz1311 lo dije por que murio el chico del video
y si el num'ero que estoy buscando se encuentra 2 veces en el arreglo como muestro las 2 busquedas?
Solo muestra el primer dato encontrado, para eso es el break.
perez explícame más amiga
Hola disculpa tengo varias dudas con esto. por que es necesario refrescar "mitad" en cada sentencia if en la busqueda binaria?.
PASARON 3 AñOS PERO BUENO .
Alejandro Reina
Hace 1 segundo
Para los que no entendieron bien la busqueda binaria primero cambien en su mente inf sup y mitad. solo piensen que son tres apuntadores o indices respectivamente. Bueno el apuntador 1 deberia ubicarse en la posicion 0 y el apuntador 2 en la ultima posicion . y el apuntador medio osea el 3 sale de la operacion ap1 + ap2 / 2 osea que si tenemos 5 elementos seria 5 + 0 / 2 ;
bueno luego se pregunta si numeros ose ael arreglo en la posicion que esta el apuntador 3 que seria 5 / 2 seria 2,5 pero siempre se le hace un floor osea redondear hacia abajo osea 2 . y si no es igual al dato que estamos pidiendo pues pasa al siguiente if y se pregunta si numero[apuntador 3('el del medio') ] es mayor dato por eso es que siempre debe estar ordenado el arreglo y para algo aprendimos los ordenamientos, Bueno si es mayor lo que hace es que al apuntador 2 que estaba quieto le pasamos la posicion del apuntador 3 y entonces hacemos de nuevo la division esa. ap1 + ap / 2 y entonces gracias a esta division ubicamos el apuntador 3 . entonces el ap2 es para que cada vez se vaya reduciendo los numeros y luego el apuntador medio encuentre el valor . Siguiendo la explicacion pues repite el ciclo y se pregunta si ya encontro el valor . si no vuelve a hacer lo que explique hasta reducir ha los mas minimo y encontrar el valor. ENTONCES EL APUNTADOR 3 O MEDIO ES EL QUE NOS ENCUENTRA EL VALOR DEPENDIENDO DE LAS POSICIONES DEL 1 Y EL 2 ENTONCES CUANDO SE PREGUNTA SI ES MAYOR O MENOR HACE EL INTERCAMBIO DE LA POSICION QUE ESTA MEDIO A LA POSICION DEL APUNTADOR DOS O UNO DEPENDIENDO SI ES MAYOR O MENOR Y ASI VUELVE A HACE LA DIVISION COMO DIJE PARA REDUCIR LOS ELEMNTOS HASTA ENCONTRAR Y PONER LA BANDERA EN 'v' DND.
POSTADATA: IMAGINENSE CUADRADITOS QUE SON LAS POSICIONES Y VAYAN HACIENDO LO QUE EXPLIQUE
@@promipicode jajaja tremendo texto y no respondiste la pregunta. NO ES NECESARIO REFRESCAR MITAD listo.
hola. mi pana como puedo hacer un programa basado en c++ donde funcione como hiperterminal trabajando con los puertos seriales de la PC, es posible???
hola necesito saber como hacer pseudocodigos para principiantes del metodo de busqueda binaria
tengo una pregunta estoy empezando a programar en c++ y quisiera saber como haces para que se vean esas lineas entre llave y llave
Hola :) esas lineas son originarias del IDE que utilices, en este caso yo utilizo el Dev-C++ 5.5.3 :D Un saludo
ProgramaciónATS en mi caso uso el 4.9 no recuerdo bien que mas ,en ese se pueden poner esas lineas??
Muy bueno! soy muy seguidor de tus vídeos! :D saludos
Muchas gracias por ver los vídeos y por el apoyo :D Un saludo desde Perú
+Programación at snow hay de que! y es un gusto! :D saludos desde España
puedo implementar esto en una estructura? por ejemplo buscar los numeros de empleados con esto?
alejandro muy bn pero creo que faltaron 2 ejercicios por cada metodo de buqueda para entenderle mas no o practicar lo que aprendimos
Bro, una pregunta el superior no debe de ser 4??
Si deberia ser 4
SI AUNQUE ES LO MISMO YA QUE IGUAL AL REDUCIR LOS ELEMENTOS NO IMPORTA YA QUE EL SUPERIOR SIRVE PARA UBICAR EL APUNTADOR MEDIO ARRIBA EXPLIQUE
Me gusta como lo explica, Laura C. CECyT 14 4IV6
Para tomar el curso en tu página el monto es en pesos, dólares o euros?
Hola :) el precio es en dólares
Descanse en paz, mentor :(
murio?
Alguno sabe por qué declaro la variable mitad dentro del bucle while y no por fuera?
Me ahorraste la pensadera, gracias.
Gracias a ti por ver :) Un saludo desde Perú
@ Un saludo podrias mandarme saludos desde el cielo gracias brother
@@NN-mi8hv ???
buenas!! la verdad muy buenos bideos me han servido mucho para amigarme con el lenguaje. Me surgio una pregunta respecto a las banderas no seria mejor usar una variable booleana para esos casos? al fin y al cabo estan para representar verdaderos y falsos. muchas gracias por todo. Saludos
Efectivamente, es mejor usar variables de tipo bool (principalmente por cuestiones de memoria). Aunque en estos casos no afecta por la simplicidad del código, es un factor importante a considerar. Saludos.
el bucle se corrige con un bucle for o restringiendo mas la condicion en el bucle while
#include
#include
#include
#include
#include
using namespace std;
int main(){
int arreglo[]= {1,2,3,4,5,6,7,8,9,10};
int dato=81, inf=0, sup=10, mitad=0;
char band= 'F';
int i=0;
while ( (inf
cout
#include
using namespace std;
int main() {
int A[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int inf, med,sup, a;
int dato = 4;
char ban = 'f';
inf = A[0];
sup = A[9];
for (int i = 0; i < 10; ++i) {
a =i;
med = (sup + inf)/2;
if (dato == A[med] || dato == A[inf] || dato == A[sup]){
ban = 'v';
break;
}else if (dato > A[med]){
// el med+1 es por que como la condicion anterior comprobo que no es el del medio
// entonces asignamos la siguiente.
inf = med + 1;
}else if (dato < A[med]){
// igualmente el med-1 para ahorar iteraciones
sup = med - 1;
}
}
if (ban == 'v'){
cout
alguien sabe como implementar los 3 metodos de busqueda en uno con un menu ???
claro, generando un menu, donde le pedis a un usuario que ingrese una opcion 1 2 o 3 y segun las opciones correr el algoritmo
Hola, En un problema tengo que hacer la busqueda de un vector pequeño dentro de una matriz, Has hecho algún video para realizar esta busqueda?
La solucion es poner while(superior != inferior), lo dejo ahi por si alguien le interesa.
Bro me puedes explicar por qué plss
@@diegoosorio3838 cuando las posiciones son iguales en las busqueda binaria significa que el codigo ya cumplio su funcion, entonces ya debe dejar de ejecutarse
Esa no es la solución, ya que el inferior siempre va a quedar por debajo del superior en una unidad, y por eso el programa cae en un ciclo infinito. Una solución sería poner lo siguiente: while (sup > inf + 1) {...}
Yo hice un ejercicio completo de busqueda binaria. Tal vez me compliqué haciéndolo pero funciona. Aqui se los pongo:
#include
using namespace std;
int main(){
//Armar el arreglo
int capacidad = 0;
coutcapacidad; cout
El algoritmo de la inserccion binaria como seria ?
gracias de antemano
Te quiero mucho ❤️
Hola Alejandro y seguidores del curso
Tengo un duda:
if(numeros[mitad] == dato){
band = 'V';
break;
}
if(numeros[mitad] > dato){
//¿porqué no debo omitir introducir estos dos if del código?
sup = mitad;
// para los casos que sea > a dato y para el caso que
mitad = (inf+sup)/2;
// sea < a dato?
}
// al omitirlos no imprime nada.
if (numeros[mitad] < dato){
// ¿estos dos if representan a else?
inf = mitad;
mitad = (inf+sup)/2;
}
Si el dato que buscamos está al final del arreglo y no hay otro igual a ese, lo encontraría?
Si lo encuentra
//Busqueda Binaria
#include
#include
using namespace std;
int main(){
int numeros[] = {1,2,3,4,5};
int inf,sup,mitad,dato,i;
char band='F';
dato = 4;
//Algoritmo de la Busqueda Binaria
inf = 0;
sup = 5;
for (int i=0; idato){
sup = mitad;
mitad = (inf+sup)/2;
}
if(numeros[mitad]
disculpa pero probé tu código y me cuando pongo la opción 1 me aparece que no se encontró, podrías arreglarlo?
una cosa curiosa que no pronuncias es que inferior es = 0, pero el cero se cuenta y superior =5 pero el 5 se cuenta, osease
0,1,2,3,4,5 son 6 numeros!! y en la busqueda cuenta los 6 pero el vector solo tiene 0,1,2,3,4 solo tiene 5 numeros!!
curioso !!
El limite superior del arreglo en realidad es N-1 y en este caso N=5 asi que tendria que poner el 4 como limite superior.
iGUAL FUNCIONA YA QUE SOLO SIRVE PARA REDUCIR DONDE SE ENCONTRARA EL APUNTADOR MEDIO
amigo..un favor realiza un video sobre la busqueda A* por fAvor...
Ycuando se buscan varios elementos en un arreglo bidimensional...???
am>
#include
#include
#include
#include
using namespace std;
int main(){
int arreglo[]= {1,2,3,4,5,6,7,8,9,10};
int dato=15, inf=0, sup=10, mitad=0;
char band='F';
for ( int i=0 ; i dato){
sup= mitad;
}
else if ( mitad
Para tu caso si, pues haces 10 iteraciones estrictamente, pero ese metodo no siempre llegara a la respuesta.
Solución definitiva:
Viendo la solución en el video y leyendo y contrastando con los comentarios/rectificaciones del resto de usuarios, me atrevo a subir una solución explicada paso a paso para que se entienda.
/*Video 54- || Búsquedas || Búsqueda BINARIA
realizado por: S.M.F.
*/
//Búsqueda Binaria: Se utiliza cuando el vector en el que queremos
//determinar la existencia de un elemento está previamente ordenado.
//Este algoritmo reduce el tiempo de búsqueda considerablemente,
//ya que disminuye exponencialmente el número de iteraciones necesarias.
//definición:Compara el valor con el elemento en el medio del array, si no son iguales,
//la mitad en la cual el valor no puede estar es eliminada y la búsqueda continúa
//en la mitad restante hasta que el valor se encuentre.
#include
#include
using namespace std;
//nota: necesitamos que esté ordenado en orden ascendente
*El metodo mas eficiente a mi parecer es el siguiente:*
//Busqueda binaria
#include
#include
using namespace std;
int main(){
int numero[]={1,2,3,4,5,6,7,8,9};
int inf,sup,mitad,dato,n=0;
char band='f';
coutdato;
inf=0;
sup=8;
while(sup>=inf){
mitad= (inf+sup)/2;
if (numero[mitad]==dato){
band='t';
break;
}
if (numero[mitad]>dato){
sup=mitad-1;
}
if(numero[mitad]
Disculpa se que no viene al tema pero fijate que tengo que hacer un simulación de un cajero automatico en C# no se si has trabajado en este lengua sera que me podrias apoyar...
Emerson Hernandez hace mucho que se trato ese ejercicio.
Ayuda, si el dato=array[0], no me lo encuentra
por imbecil
CECyT #14.
4iv6.
Brenda Hernández.
Sigo pensando que él explicaba genial.
Cuando se prueba con un numero que no esta en el array no sale nada
Puedes añadir un if en ese caso. Y que imprima un mensaje que diga numero tal no ha sido encontrado-
me salvo este video
Disculpe compa podría explicar el código como el vídeo anterior
RT...
Alejandro Reina
Hace 1 segundo
Para los que no entendieron bien la busqueda binaria primero cambien en su mente inf sup y mitad. solo piensen que son tres apuntadores o indices respectivamente. Bueno el apuntador 1 deberia ubicarse en la posicion 0 y el apuntador 2 en la ultima posicion . y el apuntador medio osea el 3 sale de la operacion ap1 + ap2 / 2 osea que si tenemos 5 elementos seria 5 + 0 / 2 ;
bueno luego se pregunta si numeros ose ael arreglo en la posicion que esta el apuntador 3 que seria 5 / 2 seria 2,5 pero siempre se le hace un floor osea redondear hacia abajo osea 2 . y si no es igual al dato que estamos pidiendo pues pasa al siguiente if y se pregunta si numero[apuntador 3('el del medio') ] es mayor dato por eso es que siempre debe estar ordenado el arreglo y para algo aprendimos los ordenamientos, Bueno si es mayor lo que hace es que al apuntador 2 que estaba quieto le pasamos la posicion del apuntador 3 y entonces hacemos de nuevo la division esa. ap1 + ap / 2 y entonces gracias a esta division ubicamos el apuntador 3 . entonces el ap2 es para que cada vez se vaya reduciendo los numeros y luego el apuntador medio encuentre el valor . Siguiendo la explicacion pues repite el ciclo y se pregunta si ya encontro el valor . si no vuelve a hacer lo que explique hasta reducir ha los mas minimo y encontrar el valor. ENTONCES EL APUNTADOR 3 O MEDIO ES EL QUE NOS ENCUENTRA EL VALOR DEPENDIENDO DE LAS POSICIONES DEL 1 Y EL 2 ENTONCES CUANDO SE PREGUNTA SI ES MAYOR O MENOR HACE EL INTERCAMBIO DE LA POSICION QUE ESTA MEDIO A LA POSICION DEL APUNTADOR DOS O UNO DEPENDIENDO SI ES MAYOR O MENOR Y ASI VUELVE A HACE LA DIVISION COMO DIJE PARA REDUCIR LOS ELEMNTOS HASTA ENCONTRAR Y PONER LA BANDERA EN 'v' DND.
POSTADATA: IMAGINENSE CUADRADITOS QUE SON LAS POSICIONES Y VAYAN HACIENDO LO QUE EXPLIQUE
Estuvo mas dificil que el anterior tema ,Cecyt 14 Luis Enrique Erro, Areli Mendoza, 4iv5
Entonces la búsqueda binaria es ideal para arreglos demasiado largos..
Metodo burbuja + búsqueda binaria.
No uses el metodo burbuja para ordenar, es demasiado lento
Te amo 4ever chavo de progra
Lo que no entendí es porque refresca mitad, si debajo del while lo vuelve a ejecutar 🤔
Eso está por demás. No es necesario refrescar, como dices se refrescará automaticamente al entrar al while
Una duda, pero al principio, mitad = (0+5)/2 = 2.5, pero no existe la posición 2.5, ¿Cómo es eso?
Es que lo declaro como int (entero)
Jeff The Killer Ah, gracias.
seria 3 o 2 en ese caso?¿
@@lucasreinaga2373 se queda en 2, por que simplemente no toma en cuenta los decimales, ignora todo lo que viene después del punto.
Lo aprenderé, aunque viendo el algoritmo entre secuencial y binaria, notó muchísimo mejor la secuencial, al final suelo copiar el contenido de un array a otra y ordenarla, ahí podría probar la binaria.
Aquí mi código para que funcione incluso cuando añades un dato que no está dentro del arreglo.
#include
#include
using namespace std;
int main(){
int numeros[]={1,2,3,4,5};
int inf,sup,mitad,dato,contador = 0;
char band = 'F';
inf = 0;
sup = 5;
cout > dato;
for(int i=0;i
Buenas! El vídeo esta muy bien, tiene una falla, y es que si el arreglo tiene un salto de numero, o un numero en el medio NO está. FALLA.
Les dejo un vídeo con con un algoritmo similar de búsqueda binaria , pero que contempla cuando al arreglo le falta un numero, o no son numero consecutivos.
th-cam.com/video/6jfQ3AGACcM/w-d-xo.html
compa, ale murio hace meses
@@andresgallardo5225 si, al momento de mi comentario no sabía. :(
Descansa en paz crack
El siguiente programa resuelve los problemas de búsquedas fuera del rango (mayor que sup y menor que inf) y datos intermedios que no están en el arreglo:
#include
#include
using namespace std;
int main()
{
int numeros[] = { 2, 4, 6, 7, 9 };
int inf, sup, mitad, dato, pos; // La variable pos es la posición en el arreglo.
char band = 'F';
dato = 9; // El número a buscar.
inf = 2;
sup = 9;
if ((dato > sup) || (dato < inf)) {
cout
eso sería como una mezcla con la búsqueda secuencial :D
eso sería como una mezcla con la búsqueda secuencial :D
Cecyt 14 Carlos Paredes 4iv5 entendi muy bien el ejmplo
cuando el número no está en el arreglo se cuelga el programa XD se queda en un bucle infinito
Encontre la solucion para ello, mira lo arregle con un if else :
//Busqueda Binaria
#include
#include
using namespace std;
int main()
{
int numeros[] = {1,2,3,4,5};
int inf, sup, mitad, dato;
coutdato;
if(dato >= 1 && dato dato)
{
sup = mitad;
mitad = (inf + sup) / 2;
}
if(numeros[mitad] < dato)
{
inf = mitad;
mitad = (inf + sup) / 2;
}
}
if(igual)
cout
El orden binario es mas complejo
CECyT_14_4IV6_Jesús_García
Buen video,cecyt 14,4IV6,Carlos Mendoza
Buen video
Cecyt 14,4IV6, Jessica Álvarez
si haces un tutorial en C#?
if((numeros[mitad]==sup)&&(numeros[mitad]
No entendí el algoritmo de la busqueda Binaria 😓
Sandy G Primero se ordena el arreglo. Luego se busca por intervalos.
cristhian elvis velasquez ventura cvre, con el método de la burbuja antes, y también en random
me dijeron que habia , busqueda secuencial, busqueda binaria y busqueda recursiva
asi rompes el ciclo
#include
#include
#include
#include
using namespace std;
int main(){
int numero []= {0,1,2,3,4,5,6,7,8,9};
int inferior, superior, mitad, dato, conteo;
char bandera = 'F';
dato = 16;
//algoritmo
inferior = 0;
superior = 10;
conteo = inferior;
while (inferior dato){
superior = mitad;
mitad = (inferior + superior)/2;
}
if (numero[mitad] < dato){
inferior = mitad;
mitad = (inferior + superior)/2;
}
if(conteo == superior){
break;
}
conteo = conteo + 1;
}
if (bandera == 'V'){
cout