Home   Artículos   Recursos   Foros   
Artíclos recientes publicados en Latindevelopers:

Visual C++: NSDoubleEdit: Un control para el manejo de números decimales en Visual C++.
Visual C++: Implementando una Calculadora en Visual C++
Visual C++: CCommandLine: Una clase para el uso de la linea de comando
Visual C++: Una clase para el manejo del Registro


Busqueda binaria en archivos

Aqui programadores en la plataforma Win32 con Visual C++ de Microsoft...

Moderador: latindeveloper

Busqueda binaria en archivos

Notapor al_fc el Mié May 09, 2007 5:36 pm

Saludos a todos, alguien sabe como hago una busqueda binaria en un archivo, se los agradecere si me ayudan 8)
*****@AL F.C.@*****
Avatar de Usuario
al_fc
Usuario Activo
Usuario Activo
 
Mensajes: 34
Registrado: Lun Sep 25, 2006 10:17 am
Ubicación: Choloma-Honduras

Re: Busqueda binaria en archivos

Notapor latindeveloper el Vie May 11, 2007 8:28 pm

Que estructura tiene el archivo?
Imagen
Avatar de Usuario
latindeveloper
Administrador
Administrador
 
Mensajes: 1061
Registrado: Lun Jun 02, 2003 8:29 pm
Ubicación: Peru

Re: Busqueda binaria en archivos

Notapor al_fc el Sab May 12, 2007 12:30 am

latindeveloper escribió:Que estructura tiene el archivo?


Para empezar lo que tengo que hacer es un directorio de contactos se manejan archivos 4 archivos secuenciales.

*El primero es el archivo de datos que contiene los campos:
codigo, primer nombre, segundo nombre, primer apellido, segundo apellido, fecha de nacimiento, telefono y direccion.

*El segundo archivo es el indice de codigo que es uno de los que tengo que hacer la busqueda, contiene los campos:
codigo y el rrn del archivo de datos.

*El tercer archivo es el de nombre que tiene los campos nombre y el next de una lista invertida que es el cuarto archivo donde esta el rrn y el anterior cuando hay nombres repetidos.

Lo unico que quiero saber es la busqueda con un ejemplo bastará.
*****@AL F.C.@*****
Avatar de Usuario
al_fc
Usuario Activo
Usuario Activo
 
Mensajes: 34
Registrado: Lun Sep 25, 2006 10:17 am
Ubicación: Choloma-Honduras

Re: Busqueda binaria en archivos

Notapor latindeveloper el Lun May 21, 2007 2:40 pm

Voy a darte una idea (por que aun tengo dudas sobre tus archivos):

Dupongamos que LEN es el tamaño del registro (todos los campos). Si es constante entonces la cosa es mas facil, pero si es variable entonces se complica un poco pero al final es casi lo mismo pero los archivos ocupan menos espacio.

Cada registro en tu archivo de datos ocupa LEN bytes, si tienes por ejemplo 10 mil registros y quieres ubicar el registro nro 560 (empezando desde cero) entonces tendrías que moverte 560*LEN leer el archivo y volcarlo en una estructura. Supongamos que 560*LEN es la posicion del registro que tiene el codigo "BGTDTY".

Entonces seguramente en algun archivo de indice existe un registro de esta manera:

Posicion_Fisica Codigo
----------------- --------
560*LEN BGTDTY

Estos campos tienen que estar NECESARIAMENTE ordenados para efectuar una busqueda binaria.

La busqueda binaria se efectua de igual manera que en un array, la unica diferencia es que cuando te mueves lo haces SOBRE EL ARCHIVO.

Para buscar el codigo "BGTDTY" tendría que hacer lo siguiente: (pseudocodigo inventado por mi)

Código: Seleccionar todo
int BuscarRecursivoBinario (nInicio, nFin, ArchivoIndice,  TextoBuscado  =/*BGTDTY*/)
{
   nMitad = (nFin-nInicio)/2;
   ArchivoIndice.MoverHasta(nMitad);
   LeerRegistro(strRegActual,ArchivoIndice);

   if (strRegActual >  TextoBuscado )
   {
        return BuscarRecursivoBinario(nMitad,nFin,ArchvoIndice,TextoBuscado);
   }
  else
  {
        return BuscarRecursivoBinario(nInicio,nMitad,ArchvoIndice,TextoBuscado);
  }
}


Nota. En el codigo no esta considerado la condicion de parada (cuando no encuentre nada o encuentre algo...)

BuscarRecursivoBinario debe retornar la posicion fisica donde se encuentra el dato que estas buscando.

Espero haberte explicado ...

Saludos

PD. no se como pude escribir tanto en tan pocos minutos...
Imagen
Avatar de Usuario
latindeveloper
Administrador
Administrador
 
Mensajes: 1061
Registrado: Lun Jun 02, 2003 8:29 pm
Ubicación: Peru

Re: Busqueda binaria en archivos

Notapor al_fc el Mié May 23, 2007 12:12 am

latindeveloper escribió:Voy a darte una idea (por que aun tengo dudas sobre tus archivos):

Dupongamos que LEN es el tamaño del registro (todos los campos). Si es constante entonces la cosa es mas facil, pero si es variable entonces se complica un poco pero al final es casi lo mismo pero los archivos ocupan menos espacio.

Cada registro en tu archivo de datos ocupa LEN bytes, si tienes por ejemplo 10 mil registros y quieres ubicar el registro nro 560 (empezando desde cero) entonces tendrías que moverte 560*LEN leer el archivo y volcarlo en una estructura. Supongamos que 560*LEN es la posicion del registro que tiene el codigo "BGTDTY".

Entonces seguramente en algun archivo de indice existe un registro de esta manera:

Posicion_Fisica Codigo
----------------- --------
560*LEN BGTDTY

Estos campos tienen que estar NECESARIAMENTE ordenados para efectuar una busqueda binaria.

La busqueda binaria se efectua de igual manera que en un array, la unica diferencia es que cuando te mueves lo haces SOBRE EL ARCHIVO.

Para buscar el codigo "BGTDTY" tendría que hacer lo siguiente: (pseudocodigo inventado por mi)

Código: Seleccionar todo
int BuscarRecursivoBinario (nInicio, nFin, ArchivoIndice,  TextoBuscado  =/*BGTDTY*/)
{
   nMitad = (nFin-nInicio)/2;
   ArchivoIndice.MoverHasta(nMitad);
   LeerRegistro(strRegActual,ArchivoIndice);

   if (strRegActual >  TextoBuscado )
   {
        return BuscarRecursivoBinario(nMitad,nFin,ArchvoIndice,TextoBuscado);
   }
  else
  {
        return BuscarRecursivoBinario(nInicio,nMitad,ArchvoIndice,TextoBuscado);
  }
}


Nota. En el codigo no esta considerado la condicion de parada (cuando no encuentre nada o encuentre algo...)

BuscarRecursivoBinario debe retornar la posicion fisica donde se encuentra el dato que estas buscando.

Espero haberte explicado ...

Saludos

PD. no se como pude escribir tanto en tan pocos minutos...


Gracias por la ayuda me ha despejado la duda ya tengo una idea como hacerlo. 8)
*****@AL F.C.@*****
Avatar de Usuario
al_fc
Usuario Activo
Usuario Activo
 
Mensajes: 34
Registrado: Lun Sep 25, 2006 10:17 am
Ubicación: Choloma-Honduras


Volver a Visual C++

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados