• Viernes 19 de Abril de 2024, 12:03

Autor Tema:  Ideas Eficiente  (Leído 933 veces)

nicokiki

  • Miembro MUY activo
  • ***
  • Mensajes: 298
    • Ver Perfil
Ideas Eficiente
« en: Viernes 4 de Junio de 2004, 02:33 »
0
Hola gente!!!!!!!!

Tengo una pregunta bastante larga pero espero q la puedan leer. No pido codigo, pido ideas que
mejoren la mia, la cual es bastante ineficiente.
Tema: Resolucion de consultas ranqueadas utilizando el metodo del coseno (no lo voy a aplicar
en un 100% porque haria q mucha gente q lea este mensaje no entienda mi problema!!!)

Tengo listas de Id(unsigned long) de archivos y frecuencias de palabras en cada archivo teniendo
como clave a el Id de archivo asi

13 8   15 2   17 3

9   4   13 1   25 2   39 6

Esta seria una lista de dos posiciones. Esta lista la ordeno antes de llegar a este paso.

Luego tengo un lista de estas listas como nodo. Algo asi:
                     
   13   8   9   4   
   15   2   13   1   
   17   3   25   2   
         39   6   
                     
                     
El paso q me tiene loco es este:
Tengo q generar un vector comun con las frecuencias de cada Id de archivo en la posicion
adecuada para cada Id de archivo distinto que tenga.
Ejemplo: En la 1º posicion del vector correspondiente a Id = 13 debo poner un 8 y en la segunda
         debo poner un 1 ya q en la segunda posicion de la lista grande (lista de lista), para
         el Id = 13 tengo frecuencia = 1.
         En la 1º posicion del vector correspondiente a Id = 15 debo poner un 2 y en la segunda
         un 0 porque el Id = 15 solo esta en la primer posicion de la lista grande
         En la 1º posicion del vector correspondiente a Id = 17 debo poner un 3 y en la segunda
         un 0 porque el Id = 17 solo esta en la primer posicion de la lista grande
         Luego, en la 1º posicion del vector correspondiente al archivo Id = 9 (ya estoy en
         el segundo nodo de la lista grande) y en la segunda pongo un 4.
         Asi sucesivamente.

Lo q a mi se me ocurrio es a la lista basica agregarle un atributo "Status" que estaria en
0 si no fue utilizado todavia o en 1 si ya lo fue. Entonces, como recorro la lista grande
un monton de veces buscando Id's, en caso de encontrar uno, lo marco como leido cambiandole
el status y sigo. Esto sirve, para el caso q ultimo comente: el cambio del algoritmo seria:
Luego en la 1º posicion del vector correspondiente al archivo de Id = 9 pongo un cero porque
su status estaria en 0 (nunca visitado) y en la segunda pongo un 4 y le cambio el status.

El problema de esto, es q tengo q recorrer la lista grande secuencialmente un monton de veces
y encima tengo q recorrer las listas pequeñas tambien un monton de veces (aunque para estas,
el recorrido seria una busqueda binaria u otra de mejor orden). Eso me puede insumir demasiado
tiempo y memoria.

Si a alguien se le ocurre alguna idea para hacer esto de una manera mas eficiente, por favor
sere todo oidos. Cualquier sugerencia es buena. Lo unico q pido es q no supongan cambios en
lo q plantee porque no son aplicables al problema porque tendria q ahondar en la explicacion
de indexacion de archivos, busquedas por esos indices, registros de longitud variable,
ablocamientos de memoria, etc.

Salu2!!!!!!!! y esperando mas q nunca una sugerencia

P.D.: Si alguien considera q esto no va en el foro de C/C++ le pido disculpas, pero es el q mas
visito yo y lo pongo aca porque lo estoy desarrollando bajo C++.

P.D.2: Alguien sabe cual es el problema q tiene el compilador de Borland q me tira error
al compilar un archivo cuando fue hecho en un 100% en ANSI C y compilado con gcc asi:
"gcc arch.c -Wall -ansi -pedantic -oexecutable" en un GNU/LINUX MANDRAKE 9.2 y en un DEBIAN sin
tirar ni un warning y compilado con Visual Studio 6.0 bajo W98, WMe, W2000, W2003 y WXP?????  
(quiero remarcar q las opciones de comando pasadas al gcc no permiten siquiera poner
un "//" ya q esto es de C++ y no de C)