Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Sunshine66 en 6 Mayo 2010, 00:29 am



Título: busqueda binaria
Publicado por: Sunshine66 en 6 Mayo 2010, 00:29 am
wenas

miren tengo el siguiente problema necesito recibir por teclado una palabra y buscarla con busqueda binaria lo que necesito es la funcion.

Lo que apararece aca es una busqueda binaria para buscar numeros(no se que tan parecido sera con palabras)
Se que para este metodo es necesario tener todas las palabras ordenadas en mi caso lo hice por quicksort.
ayuda plz
 

int Debug;
int busbin (int valor [ ], int ini, int fin, int busca)
{ int med = (ini + fin) / 2;
if (Debug)
{ cout << "ini: " << ini << " fin: " << fin << endl;
getchar ( );
}
if (valor [med] == busca)
return (med);
else if (ini == fin)
return (-1);
else if (valor [med] > busca)
return (busbin (valor, ini, med - 1, busca));
else
return (busbin (valor, med + 1, fin, busca));
}





Título: Re: busqueda binaria
Publicado por: Akai en 6 Mayo 2010, 00:42 am
Podrías valerte de la búsqueda binaria numérica, pero en comparaciones de mayor o menor, puedes usar strcmp, de la biblioteca string.h

info de strcmp

int strcmp (const char * s1, const char * s2);

Valor de retorno:
La función retorna un número entero mayor, igual, o menor que cero, apropiadamente según la cadena apuntada por str1 es mayor, igual, o menor que la cadena apuntada por str2. La comparación es según el orden lexicográfico de las cadenas str1 y str2.

como en la tabla ASCII las letras están ordenadas de la misma forma que en el abecedario (misma secuencia de orden) básate en el valor de retorno de strcmp para saber si tienes que buscar en la mitad inferior o superior del vector de palabras, o bien, si la has encontrado.


Título: Re: busqueda binaria
Publicado por: Sunshine66 en 6 Mayo 2010, 01:13 am
haber si entendi la idea seria una cosa asi,
estoy ocupando tolow para poder convertir toda las palabras en minisculas y no haya problema.

int Debug;
int busbin (char pal [ ], int ini, int fin, int busca)
{ int med = (ini + fin) / 2;
if (Debug)
{ cout << "ini: " << ini << " fin: " << fin << endl;
getchar ( );
}
if (strcmp(toLow(pal[med]), toLow(pal[busca]))
return (med);
else if (strcmp(toLow(pal[ini], toLow(pal[fin])
return (-1);
else if (strcmp(toLow(pal[med] > toLow(pal[busca]) // no se como seria ahi  :huh:
return (busbin (pal, ini, med - 1, busca));
else
return (busbin (pal, med + 1, fin, busca));
}
else
return (busbin (pal, med + 1, fin, busca));
}


Título: Re: busqueda binaria
Publicado por: Akai en 6 Mayo 2010, 07:42 am
Veamos... en ese caso, lo que tienes que comparar es el resultado de la llamada a strcmp, una vez ya devuelto el valor, no dentro de su propia llamada.

por ponerte un ejemplo, luego tu ya pones acorde a tus necesidades

if (strcmp(cadena1, cadena2) >0)
este if se cumplira siempre y cuando la cadena 2 sea alfabéticamente posterior a la primera.

por otro lado, cuando quieres comprobar si ambas cadenas son iguales la comprobación es strcmp(cadena1, cadena2)==0 . Puesto que cuando son iguales, retorna un 0. si cadena 1 es mayor, un numero negativo, y si cadena 2 es mayor, uno positivo.