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)