busqueda binaria

Iniciado por Sunshine66, 6 Mayo 2010, 00:29 AM

0 Miembros y 1 Visitante están viendo este tema.

Sunshine66

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));
}



*How do you prove that you exist ?...maybe we don't exist...

*You don't need a reason to help people...

Akai

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.

Sunshine66

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));
}
*How do you prove that you exist ?...maybe we don't exist...

*You don't need a reason to help people...

Akai

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.