Ver Mensaje Individual
  #1 (permalink)  
Antiguo 22/11/2016, 21:07
Arcana
 
Fecha de Ingreso: mayo-2010
Mensajes: 185
Antigüedad: 14 años
Puntos: 2
Optimizar un codigo

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

}