Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: arcanaer en 23 Noviembre 2016, 04:16 am



Título: Optimizar un codigo
Publicado por: arcanaer en 23 Noviembre 2016, 04:16 am
Hola, buenas noches, tengo este codigo, que lo que hace es abrir un archivo .txt sacar todas las palabras, quitar puntuaciones y solo contar de separadores lo que es .,();
Ahora tomar cada palabra, ordenarla alfabeticamente, y checar cuantas veces aparece en el arreglo, despues añadir las veces que aparece esa palabra.
entonces por ejemplo si tenemos http://pagina.unam.mx/cyp
la primera palabra seria
 http://pagina    1
unam      1
mx/cpy    1

La primera es la palabra y la segunda las veces que aparece, pero cuando hablamos de mas de 100 000 palabras en el .txt el codigo se torna muy lento y se tarda aprox 5 min en arrojar resultados, alguien me podria ayudar a optimizarlo?

Código:
void Diccionario(char *szNombre, char szPalabras[][TAMTOKEN], int iEstadisticas[], int &iNumElementos)
{
//char szNombre[50];
//printf("Dame el nombre del archivo");
//scanf_s("%s", szNombre, 49);
FILE *libro;
fopen_s(&libro, szNombre, "r");
char palabra[TAMTOKEN];
char *palabra1;
char szPalabras1[NUMPALABRAS][TAMTOKEN];
int estad[NUMPALABRAS];
char *next = NULL;
int i, j, k, conta = 0;
int numpala;
int mayor[NUMPALABRAS];
char aux[100];
if (libro == NULL)
{
printf("No se pudo abrir el archivo");
}
else
{
i = 0;

while (!feof(libro))
{
fscanf_s(libro, "%s", palabra, 49);
_strlwr_s(palabra);
palabra1 = strtok_s(palabra, " ;,.)(", &next);
while (palabra1 != NULL)
{
//printf("%s\n", palabra1);
strcpy_s(szPalabras1[i], palabra1);
palabra1 = strtok_s(NULL, " ;,.)(", &next);
i++;
}
//strcpy_s(diccionario[i], palabra1);

//printf("%s\n", diccionario[i]);
//i++;

}
numpala = i;

// ORDENAR CADENAS
for (i = 0; i < numpala -1 ; i++)
{
k = i;
strcpy_s(aux, szPalabras1[i]);
for (j = i + 1; j < numpala; j++)
{
if (strcmp(szPalabras1[j], aux) < 0)
{
k = j;
strcpy_s(aux, szPalabras1[j]);
//permite hacer una copia auxiliar de la cadena szPalabras[j];
}
}
strcpy_s(szPalabras1[k], szPalabras1[i]);
strcpy_s(szPalabras1[i], aux);
}

for (i = 0; i < numpala; i++)
{
//printf("%s\n", diccionario[i]);

}

}
//ordenamos por estadisticas.
for (i = 0; i < numpala; i++)
{
estad[i] = 0;
for (j = 0; j < numpala; j++)
{
if (strcmp(szPalabras1[i], szPalabras1[j]) == 0)
{
estad[i]++;
}

}

}
i = 0;
while (i < numpala)
{
if (estad[i] != 1)
{
//printf("La palabra %s se repite %i veces\n", diccionario[i], esta[i]);
}
else
{
//printf("La palabra %s solo se encuentra una vez\n", diccionario[i]);
}

i = i + estad[i];
}
iNumElementos = 0;
for (i = 0; i < numpala; i++)
{
if (strcmp(szPalabras1[i], szPalabras1[i + 1]) != 0)
{
iNumElementos++;
}
}
//printf("%i\n", iNumElementos);

i = 0;

while (i < numpala)
{
mayor[i] = 0;
if (estad[i] != 1)
{
for (j = i; j < i + estad[i]; j++)
{

if (estad[j] >= mayor[i])
{
mayor[i] = estad[j];
}
else
{
mayor[i] = mayor[i];
}
}

}
else
{
mayor[i] = estad[i];

}
//imprimimos diccionario
//printf("%s %i\n", szPalabras[i], mayor[i]);
strcpy_s(szPalabras[conta], szPalabras1[i]);
iEstadisticas[conta] = mayor[i];
conta++;
i = i + estad[i];

}

fclose(libro);

}